¿Cómo hacer que un campo sea visible (adjunto) en el inspector pero inaccesible a través del código (privado)?

9

Digamos que tengo una variable llamada buttonde tipo Buttonque es, por supuesto System.Serializable.

Quiero que esa variable se pueda asignar a través del inspector, así que lo hago public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Lo que me da eso:

ingrese la descripción de la imagen aquí

Ahora, quiero mantener el código limpio y seguro (organizado) y hay una razón real por la que necesito preservar la encapsulación.

Sé que hay varias formas de recuperar componentes en tiempo de ejecución como transform.Find("Some/Genius/TypeUnsafe/Path")o GameObject.Find("3 seconds scene iteration").GetComponent(...).quiero evitar eso.

¿Cómo mezclo una variable private accesscon la que está public accessen el inspector?

Jacob
fuente
¿Por qué quieres hacer este campo "seguro" / qué quieres decir con eso? Tenga en cuenta que lo puse entre comillas, porque si el código se ejecuta en la máquina del cliente, el cliente puede hacer lo que quiera con él. privateen realidad no tiene la intención de evitar que un tercero obtenga acceso a un campo, está destinado a proporcionar una manera de decir "no mires detrás de la cortina a lo que realmente estoy haciendo", es decir, es principalmente una forma de evitar que tengas acceso a él.
Clockwork-Muse
Sí, sé para qué sirve la encapsulación. : DI construí algún tipo de UI/ API MVC/ MVVMpatrón para una gran aplicación (un cliente de juego en realidad) y tuve que separar UIel API. Necesitaba asignar valores a través de la causa del inspector simplemente: no hay otra manera. Find()los métodos no son seguros para el tipo y es más fácil armar las cosas arrastrando y soltando Es muy, muy difícil construir un marco clásico de OOP Unityy hay que buscar cosas extrañas como esta.
Jacob
Tenga en cuenta que privado no mantiene la variable segura de otros scripts. Usted siempre puede llegar a él con reflejo o algún truco de puntero
Bálint

Respuestas:

19

Estás buscando el atributo SerializeField

De los documentos:

Fuerce la unidad para serializar un campo privado.

Casi nunca necesitarás esto. Cuando Unity serializa sus scripts, solo serializará los campos públicos. Si además de eso también desea que Unity serialice uno de sus campos privados, puede agregar el atributo SerializeField al campo.

Su código se vería así:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}
Cameron Edwards
fuente
66
para [SerializeField] private Button button; facilitar la lectura, generalmente lo escribo todo en una línea: me resulta más fácil escanear cuando hay un montón de campos seguidos. Además, atornille los documentos para "casi nunca necesitará esto"; Realmente hago esto todo el tiempo.
jhocking
1

Puede mostrar su variable privada agregando el atributo SerializeField antes de la variable. Algo como esto

[SerializeField]
private Button button;

La variable anterior se mostrará a su inspector, pero sus otras clases no podrán obtenerla. Por el contrario , también puede ocultar su archivo público en el inspector a través del atributo HideInInspector . Algo como esto

[HideInInspector]
public Button button;

Su otra secuencia de comandos podrá acceder a la variable anterior, pero no se mostrará al inspector.

Muhammad Faizan Khan
fuente