Olá Daniel,
Quando trabalhamos com linguagens orientadas a objeto, procuramos fazer com que todos os atributos de uma classe sejam privados e que o acesso a eles seja controlado pela utilização obrigatória de métodos para ler e escrever valores nesses atributos.
Se colocamos o gameObject
como public
, o editor do Unity consegue enxergar e podemos arrastar os objetos direto na ferramenta, o que é ótimo pra gente. Mas o que acontece se os outros objetos tentarem acessar esse gameObject
? Certamente, eles vão conseguir! E se algum deles começar a mexer nesse gameObject
, trocando o valor, colocando algo que não faça sentido? Se isso acontecer, nosso jogo vai começar a se comportar de maneiras que não queremos e talvez até pare de funcionar.
A alternativa é deixar o gameObject
como private
permitindo que só a própria classe possa manipular o objeto. Mas aí dificulta nossa vida na ferramenta... seria bom ter um meio termo né?
Então o que podemos fazer é manter o campo como private
e colocar logo acima dele um indicador que dá permissão apenas para que o Unity (além da própria classe) possa acessar o atributo. Então você poderia escrever na declaração do atributo algo como:
[SerializeField]
private GameObject gameObject;
Pronto! Agora temos as vantagens do encapsulamento (protegemos o acesso ao atributo e escondemos os detalhes de implementação) e ainda podemos arrastar os nossos GameObject
direto pela interface do Unity!