Як зробити поле видимим (придатним) для інспектора, але недоступним через код (приватний)?


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насправді не має на меті перешкодити третій стороні отримати доступ до поля, це має на меті запропонувати спосіб сказати "не дивись за завісу на те, що я насправді роблю" - тобто це здебільшого спосіб не дозволяють вам отримати доступ до нього.
Завод-Муза

Так, я знаю, що таке інкапсуляція! : Я будую якийсь UI/ API MVC/ MVVMшаблон для величезного додатку (ігровий клієнт насправді), і мені довелося відокремлювати його UIвід API. Мені потрібно було призначити значення через інспектора, тому що іншого способу немає. Find()методи небезпечні, і їх простіше складати, перетягуючи та опускаючи. Створити класичну рамку OOP дуже важко, Unityі вам потрібно шукати подібні хакі.
Яків

Майте на увазі, що приватні не захищають змінну від інших сценаріїв. Ви таксі завжди доїжджаєте до нього з відображенням чи хитрістю вказівника
Bálint

Відповіді:


19

Ви шукаєте атрибут SerializeField

З документів:

Змусити Єдність серіалізувати приватне поле.

Вам це майже ніколи не знадобиться. Коли 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;

Ваша вищезгадана змінна буде доступна іншим сценарієм, але вона не буде показана інспектору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.