Я новичок в разработке Unity 3D и хотел узнать, как лучше всего объявить атрибуты класса, которые будут назначены позже из редактора. Я видел в основном два:
public class MyObject : MonoBehavour {
public GameObject relatedObect;
}
а также
public class MyObject : MonoBehavour {
[SerializeField]
private GameObject relatedObect;
}
Я понимаю, что это вторая форма, потому что сохраняется инкапсуляция, но я не уверен.
Вот почему я спрашиваю
Но это все равно, что спрашивать, что лучше яблоки или малина... потому что они не достигают того же самого, это несопоставимо. как правило, вы должны выставлять как можно меньше. Таким образом, возникает вопрос, нужны ли вам другие классы, чтобы увидеть это или нет, на самом деле не «что лучше», поскольку лучше всего полностью зависит от требований.





Во-вторых, это правильный путь, если вы хотите делать что-то «правильно». Но, к сожалению, есть «ошибка», которая выдает предупреждение на каждый приват, который вы устанавливаете через редактор. Я видел на github, что это, наконец, исправлено, но тем временем, если вы хотите удалить предупреждение, вы можете поместить свои переменные между pragma warning disable 0649 и pragma warning restore 0649
мое предположение? это не полный ответ
Тоже не верно, если вы хотите, чтобы поле было public ;)
Учтите, что в примере вы объявили класс поля, а не характеристики. Они оба являются членами одного класса, но они совершенно разные.
Ради этого ответа я сосредоточусь на вашем примере, поэтому я расскажу о полях.
И public, и [SerializeField] private позволяют вводить значение в инспекторе Unity, но в сценариях они действуют по-разному.
Вы объявляете общедоступное поле, когда хотите, чтобы оно использовалось или задавалось из другого класса. Этот выбор противоречит инкапсуляции, потому что к нему может получить доступ другой скрипт. Это все еще может быть предполагаемым поведением, если вам требуется доступ к полю.
Вы используете это, когда хотите установить элемент в инспекторе, но не хотите, чтобы другие классы его видели. Этот вариант лучше подходит для инкапсуляции, поскольку таким образом никакой другой скрипт не сможет получить доступ к этому полю или изменить его.
Спасибо за разъяснения. Я привык к терминологии Java
@Sergio Java имеет ТОЧНО ту же терминологию, она является общей для всех языков программирования. В Java вообще нет свойств, только шаблон "геттер"/"сеттер". Свойства — это синтаксический сахар языка для обертывания шаблона «геттер/сеттер».
В дополнение к ответу Джека Мариани я хочу упомянуть RangeAttribute и HideInInspectorAttribute.
[Range (min, max)]Если он есть, инспектор покажет ползунок, а не просто число. Вы перемещаете ползунок, и значение изменяется в указанном диапазоне.
[SerializeField] [Range (0, 5)] private float _speed;
[HideInInspector]Вы должны использовать его, когда вы не делайте хотите, чтобы переменная публичный отображалась в инспекторе (они отображаются по умолчанию):
[HideInInspector] public float X;
Это не относится к вопросу. Также есть гораздо больше атрибутов, поэтому нужно будет перечислить все (на самом деле это невозможно, потому что любой может создать дополнительные атрибуты), например, например. также [Header("xyz")], [Space], [NonSerialized], [AddComponentMenu], [TextArea]...
@derHugo Вопрос был о способах доступа из редактора. Я выбрал те, которые, по моему мнению, связаны с этим. Но, может быть, ты прав.
эти два не эквивалентны, первый делает свойство доступным для другого класса и инспектора, второй - только для инспектора.