Come rendere un campo visibile (collegabile) nell'ispettore ma inaccessibile tramite codice (privato)?


9

Diciamo che ho una variabile chiamata buttondi tipo Buttonche è ovviamente System.Serializable.

Voglio che la variabile sia assegnabile tramite l'ispettore, quindi la faccio public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Il che mi dà questo:

inserisci qui la descrizione dell'immagine

Ora, voglio mantenere il codice pulito e sicuro (organizzato) e c'è un vero motivo per cui devo conservare l'incapsulamento.

So che ci sono diversi modi per recuperare componenti in fase di esecuzione come transform.Find("Some/Genius/TypeUnsafe/Path")o GameObject.Find("3 seconds scene iteration").GetComponent(...).voglio evitarlo.

Come mescolo una variabile private accesscon la sua public accessin Inspector?


Perché vuoi rendere questo campo "sicuro" / cosa intendi con questo? Nota che lo metto tra virgolette, perché se il codice viene eseguito sul computer client, il client può fare praticamente tutto ciò che vuole con esso. privatenon è realmente destinato a impedire a terzi di accedere a un campo, ha lo scopo di fornire un modo per dire "non guardare dietro il sipario ciò che sto davvero facendo", ovvero è principalmente un modo per impedirti di accedervi.
Clockwork-Muse

Sì, so a cosa serve l'incapsulamento! : DI ho creato una specie di UI/ API MVC/ MVVMpattern per un'applicazione enorme (un client di gioco in realtà) e ho dovuto separare UIil file API. Avevo semplicemente bisogno di assegnare valori attraverso la causa dell'ispettore - non c'è altro modo. Find()i metodi non sono sicuri ed è più facile mettere insieme le cose trascinandole. È davvero molto difficile costruire un classico framework OOP con Unitye devi cercare cose bizzarre come questa.
Jacob,

Tieni presente che privato non protegge la variabile da altri script. Puoi sempre raggiungerlo con la riflessione o qualche trucco con i puntatori
Bálint,

Risposte:


19

Stai cercando l' attributo SerializeField

Dai documenti:

Forza Unity a serializzare un campo privato.

Non avrai quasi mai bisogno di questo. Quando Unity serializza i tuoi script, serializzerà solo i campi pubblici. Se oltre a ciò si desidera anche che Unity serializzi uno dei campi privati, è possibile aggiungere l'attributo SerializeField al campo.

Il tuo codice sarebbe quindi simile al seguente:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
per leggibilità generalmente scrivo tutto su una riga: [SerializeField] private Button button; trovo più facile scansionare quando ci sono un sacco di campi in una riga. Inoltre, rovina i documenti per "non avrai quasi mai bisogno di questo"; Lo faccio totalmente tutto il tempo.
jhocking

1

Puoi mostrare la tua variabile privata aggiungendo l' attributo SerializeField prima della variabile. Qualcosa come questo

[SerializeField]
private Button button;

La variabile sopra sarà mostrata al tuo ispettore ma le altre classi non saranno in grado di ottenerla. Viceversa puoi anche nascondere il tuo pubblico archiviato in inspector tramite l' attributo HideInInspector . Qualcosa come questo

[HideInInspector]
public Button button;

La tua variabile sopra sarà accessibile dagli altri tuoi script ma non verrà mostrata a inspector.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.