Как сделать поле видимым (присоединяемым) в инспекторе, но недоступным через код (частный)?

9

Скажем , у меня есть переменная buttonтипа , Buttonкоторая, конечно System.Serializable.

Я хочу, чтобы эта переменная была назначена через инспектор, поэтому я делаю это public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

Что дает мне это:

введите описание изображения здесь

Теперь я хочу сохранить код в чистоте и безопасности (организованным), и есть реальная причина, по которой мне нужно сохранить инкапсуляцию.

Я знаю, что есть несколько способов получения компонентов во время выполнения, например, transform.Find("Some/Genius/TypeUnsafe/Path")или GameObject.Find("3 seconds scene iteration").GetComponent(...).я хочу избежать этого.

Как мне смешать переменную private accessс этим public accessв инспекторе?

Иаков
источник
Почему вы хотите сделать это поле "безопасным" / что вы подразумеваете под этим? Обратите внимание, что я помещаю это в кавычки, потому что, если код выполняется на клиентском компьютере, клиент может делать с ним практически все, что ему захочется. privateна самом деле не предназначен для того, чтобы помешать третьему лицу получить доступ к полю, он предназначен для того, чтобы дать возможность сказать: «Не смотри за кулисы на то, что я на самом деле делаю», то есть это в основном способ помешать вам получить доступ к нему.
Заводная муза
Да, я знаю, для чего нужна инкапсуляция! : D построить некоторые UI/ API MVC/ MVVMшаблон для огромного приложения (игра клиент на самом деле) , и я должен был отделить UIот API. Мне нужно было просто присвоить значения через инспектор - другого пути нет. Find()Методы небезопасны, и их проще соединять, перетаскивая. Это действительно очень сложно создать классический OOP-фреймворк, Unityи вы должны искать такие хакерские вещи.
Джейкоб
Имейте в виду, что private не защищает переменную от других скриптов. Вы можете добраться до него с помощью отражения или хитрости указателя
Балинт

Ответы:

19

Вы ищете атрибут SerializeField

Из документов:

Заставить Unity сериализовать приватное поле.

Вам это почти никогда не понадобится. Когда Unity сериализует ваши скрипты, он только сериализует открытые поля. Если в дополнение к этому вы также хотите, чтобы Unity сериализовала одно из ваших личных полей, вы можете добавить в поле атрибут SerializeField.

Ваш код будет выглядеть так:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}
Кэмерон Эдвардс
источник
6
Для удобства чтения я обычно пишу все в одну строку: [SerializeField] private Button button; мне легче сканировать, когда в строке есть несколько полей. Кроме того, прикрутите документы к «вам это почти никогда не понадобится»; Я полностью делаю это все время.
Джохинг
1

Вы можете показать свою личную переменную, добавив атрибут SerializeField перед переменной. Что-то вроде этого

[SerializeField]
private Button button;

Переменная выше будет отображаться вашему инспектору, но другие классы не смогут ее получить. И наоборот, вы также можете скрыть свою открытую область в инспекторе через атрибут HideInInspector . Что-то вроде этого

[HideInInspector]
public Button button;

Ваша указанная выше переменная будет доступна вашему другому сценарию, но она не будет отображаться для инспектора.

Мухаммед Файзан Хан
источник