Como tornar um campo visível (acoplável) no inspetor, mas inacessível através do código (do tipo privado)?

9

Digamos que eu tenho uma variável chamada buttontype, Buttonque é obviamente System.Serializable.

Eu quero que essa variável seja atribuível através do inspetor, então eu faço isso public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

O que me dá isso:

insira a descrição da imagem aqui

Agora, quero manter o código limpo e seguro (organizado) e há uma verdadeira razão pela qual preciso preservar o encapsulamento.

Eu sei que existem várias maneiras de recuperar componentes em tempo de execução como transform.Find("Some/Genius/TypeUnsafe/Path")ou GameObject.Find("3 seconds scene iteration").GetComponent(...).eu quero evitar isso.

Como misturo uma variável private accesscom ela public accessno inspetor?

Jacob
fonte
Por que você deseja tornar esse campo "seguro" / o que você quer dizer com isso? Observe que eu coloquei isso entre aspas, porque se o código for executado na máquina do cliente, o cliente poderá fazer praticamente o que quiser com ele. privatenão se destina realmente a impedir que terceiros obtenham acesso a um campo, serve para fornecer uma maneira de dizer "não olhe atrás da cortina para o que estou realmente fazendo" - ou seja, é principalmente uma maneira de impedi- lo de obter acesso a ele.
Clockwork-Muse
Sim, eu sei para que serve o encapsulamento! : Eu criei algum tipo de UI/ API MVC/ MVVMpadrão para um aplicativo enorme (um cliente de jogo na verdade) e eu tive que separar o UIarquivo API. Eu precisava atribuir valores através da causa do inspetor simplesmente - não há outra maneira. Find()Os métodos são do tipo inseguro e é mais fácil juntar as coisas arrastando e soltando. É muito, muito difícil criar uma estrutura clássica de POO Unitye você precisa procurar coisas hacky como essa.
Jacob
Lembre-se de que private não mantém a variável protegida de outros scripts. Você CAB akways alcançá-lo com a reflexão ou alguma trapaça ponteiro
Bálint

Respostas:

19

Você está procurando o atributo SerializeField

Dos documentos:

Forçar o Unity a serializar um campo privado.

Você quase nunca precisará disso. Quando o Unity serializa seus scripts, ele serializa apenas campos públicos. Se, além disso, você também deseja que o Unity serialize um de seus campos particulares, você pode adicionar o atributo SerializeField ao campo.

Seu código ficaria assim:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}
Cameron Edwards
fonte
6
Para [SerializeField] private Button button; facilitar a leitura, geralmente escrevo tudo em uma linha: acho mais fácil digitalizar quando há vários campos seguidos. Além disso, estrague os documentos para "você quase nunca precisará disso"; Eu faço isso o tempo todo.
Jhocking 15/08
1

Você pode mostrar sua variável privada Adicionando o atributo SerializeField antes da variável. Algo assim

[SerializeField]
private Button button;

A variável acima será exibida ao seu inspetor, mas suas outras classes não conseguirão obtê-la. Por outro lado, você também pode ocultar seu público arquivado no inspetor por meio do atributo HideInInspector . Algo assim

[HideInInspector]
public Button button;

Sua variável acima será acessível por seu outro script, mas não será exibida ao inspetor.

Muhammad Faizan Khan
fonte