Wie kann ein Feld im Inspektor sichtbar (anhängbar), aber über Code nicht zugänglich (privat) werden?


9

Nehmen wir an, ich habe eine Variable mit dem Namen buttontype, Buttonwas natürlich der Fall ist System.Serializable.

Ich möchte, dass diese Variable über den Inspektor zugewiesen werden kann, also mache ich es public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Was mir das gibt:

Geben Sie hier die Bildbeschreibung ein

Jetzt möchte ich den Code sauber und sicher halten (organisiert) und es gibt einen echten Grund, warum ich die Kapselung beibehalten muss.

Ich weiß, dass es mehrere Möglichkeiten gibt, Komponenten zur Laufzeit abzurufen, transform.Find("Some/Genius/TypeUnsafe/Path")oder GameObject.Find("3 seconds scene iteration").GetComponent(...).ich möchte das vermeiden.

Wie mische ich eine Variable private accessmit der public accessim Inspektor?


Warum möchten Sie dieses Feld "sicher" machen / was meinen Sie damit? Beachten Sie, dass ich das in Anführungszeichen setze, denn wenn Code auf dem Client-Computer ausgeführt wird, kann der Client so ziemlich alles tun, was er will. privatesoll nicht wirklich verhindern, dass Dritte Zugang zu einem Feld erhalten, sondern soll eine Möglichkeit bieten, zu sagen: "Schau nicht hinter den Vorhang, was ich wirklich tue" - das heißt, es ist meistens eine Möglichkeit dazu verhindern Sie, dass Sie Zugriff darauf erhalten.
Clockwork-Muse

Ja, ich weiß, wofür Kapselung ist! : DI erstellt eine Art UI/ API MVC/ MVVMMuster für eine riesige Anwendung (eigentlich ein Spielclient) und ich musste das UIvon dem trennen API. Ich musste einfach über den Inspektor Werte zuweisen - es gibt keinen anderen Weg. Find()Methoden sind typunsicher und es ist einfacher, Dinge durch Ziehen und Ablegen zusammenzusetzen. Es ist wirklich sehr, sehr schwer, ein klassisches OOP-Framework zu erstellen, Unityund Sie müssen nach solchen hackigen Dingen suchen.
Jacob

Beachten Sie, dass private die Variable nicht vor anderen Skripten schützt. Sie können es immer mit Reflexion oder einem Zeigertrick erreichen
Bálint

Antworten:


19

Sie suchen nach dem SerializeField-Attribut

Aus den Dokumenten:

Unity zwingen, ein privates Feld zu serialisieren.

Sie werden das fast nie brauchen. Wenn Unity Ihre Skripte serialisiert, werden nur öffentliche Felder serialisiert. Wenn Sie außerdem möchten, dass Unity eines Ihrer privaten Felder serialisiert, können Sie dem Feld das Attribut SerializeField hinzufügen.

Ihr Code würde dann so aussehen:

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

6
[SerializeField] private Button button; Zur besseren Lesbarkeit schreibe ich im Allgemeinen alles in eine Zeile: Ich finde das einfacher zu scannen, wenn mehrere Felder hintereinander stehen. Schrauben Sie auch die Dokumente für "Sie werden dies fast nie brauchen"; Ich mache das die ganze Zeit.
Schock

1

Sie können Ihre private Variable anzeigen, indem Sie das SerializeField- Attribut vor der Variablen hinzufügen . Etwas wie das

[SerializeField]
private Button button;

Die obige Variable wird Ihrem Inspektor angezeigt, Ihre anderen Klassen können sie jedoch nicht abrufen. Umgekehrt können Sie Ihre im Inspector abgelegten öffentlichen Elemente auch über das Attribut HideInInspector ausblenden . Etwas wie das

[HideInInspector]
public Button button;

Auf Ihre obige Variable kann Ihr anderes Skript zugreifen, sie wird dem Inspektor jedoch nicht angezeigt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.