Лучший способ объявить свойства класса в Unity3D

Я новичок в разработке Unity 3D и хотел узнать, как лучше всего объявить атрибуты класса, которые будут назначены позже из редактора. Я видел в основном два:

public class MyObject : MonoBehavour {

    public GameObject relatedObect;

}

а также

public class MyObject : MonoBehavour {
    [SerializeField]
    private GameObject relatedObect;

}

Я понимаю, что это вторая форма, потому что сохраняется инкапсуляция, но я не уверен.

эти два не эквивалентны, первый делает свойство доступным для другого класса и инспектора, второй - только для инспектора.

BugFinder 27.06.2019 09:18

Вот почему я спрашиваю

Sergio 27.06.2019 09:23

Но это все равно, что спрашивать, что лучше яблоки или малина... потому что они не достигают того же самого, это несопоставимо. как правило, вы должны выставлять как можно меньше. Таким образом, возникает вопрос, нужны ли вам другие классы, чтобы увидеть это или нет, на самом деле не «что лучше», поскольку лучше всего полностью зависит от требований.

BugFinder 27.06.2019 09:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
690
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Во-вторых, это правильный путь, если вы хотите делать что-то «правильно». Но, к сожалению, есть «ошибка», которая выдает предупреждение на каждый приват, который вы устанавливаете через редактор. Я видел на github, что это, наконец, исправлено, но тем временем, если вы хотите удалить предупреждение, вы можете поместить свои переменные между pragma warning disable 0649 и pragma warning restore 0649

мое предположение? это не полный ответ

BugFinder 27.06.2019 09:25

Тоже не верно, если вы хотите, чтобы поле было public ;)

derHugo 27.06.2019 18:40
Ответ принят как подходящий

Учтите, что в примере вы объявили класс поля, а не характеристики. Они оба являются членами одного класса, но они совершенно разные.

Ради этого ответа я сосредоточусь на вашем примере, поэтому я расскажу о полях.

И public, и [SerializeField] private позволяют вводить значение в инспекторе Unity, но в сценариях они действуют по-разному.

1 - публичное поле

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

2 - закрытое поле [SerializeField]

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

Спасибо за разъяснения. Я привык к терминологии Java

Sergio 27.06.2019 09:52

@Sergio Java имеет ТОЧНО ту же терминологию, она является общей для всех языков программирования. В Java вообще нет свойств, только шаблон "геттер"/"сеттер". Свойства — это синтаксический сахар языка для обертывания шаблона «геттер/сеттер».

Aron 27.06.2019 11:50

В дополнение к ответу Джека Мариани я хочу упомянуть RangeAttribute и HideInInspectorAttribute.


[Range (min, max)]

Если он есть, инспектор покажет ползунок, а не просто число. Вы перемещаете ползунок, и значение изменяется в указанном диапазоне.

[SerializeField] [Range (0, 5)] private float _speed;

Документация


[HideInInspector]

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

[HideInInspector] public float X;

Документация

Это не относится к вопросу. Также есть гораздо больше атрибутов, поэтому нужно будет перечислить все (на самом деле это невозможно, потому что любой может создать дополнительные атрибуты), например, например. также [Header("xyz")], [Space], [NonSerialized], [AddComponentMenu], [TextArea]...

derHugo 27.06.2019 17:41

@derHugo Вопрос был о способах доступа из редактора. Я выбрал те, которые, по моему мнению, связаны с этим. Но, может быть, ты прав.

trollingchar 27.06.2019 18:35

Другие вопросы по теме