Я новичок на этом форуме, в программировании и в изучении Unity.
Обучаюсь сейчас по книге Джозева Хокинга "Юнити в действии".
Есть одна концепция, которую не могу понять - [SerializeField].
Я знаю, что она делает, знаю что такое модификаторы доступа, чем отличается private от public. Я понимаю, что происходит когда пишешь
[SerializeField] private (ClassName) (VariableName);
И чем это отличается от
public (ClassName) (VariableName);
Ответы на эти вопрос есть и в книге и хорошо описаны в посте http://answers.unity3d.com/questions/54 ... 1491129093
НО! есть одна вещь, которую я не понимаю.
Начну с примера.
Когда пишешь [SerializeField] int speed; а в Инспекторе указываешь значение speed = 3, то создается экземпляр класса Int32, по имени speed и его значение равно трем. Это тоже мне понятно.
Ниже представлен код двух классов, которые даются в учебнике для управления графическим интерфейсом пользователя, а именно - открытие спрайта по имени PopUp, который является "Меню настройки"
Первый скрипт UIController присоединен к EmptyObject и по сути является просто контроллером.
Второ скрипт SettingsPopUp присоединен к спрайту PopUp, который и является этим меню.
Синтаксис:
Используется csharp
public class UIController : MonoBehaviour
{
[SerializeField] private Text scoreLabel;
[SerializeField] private SettingsPopUp settingsPopUp;
// Use this for initialization
void Start ()
{
settingsPopUp.Close();
}
// Update is called once per frame
void Update ()
{
scoreLabel.text = Time.realtimeSinceStartup.ToString();
}
public void OnOpenSettings()
{
settingsPopUp.Open();
}
}
{
[SerializeField] private Text scoreLabel;
[SerializeField] private SettingsPopUp settingsPopUp;
// Use this for initialization
void Start ()
{
settingsPopUp.Close();
}
// Update is called once per frame
void Update ()
{
scoreLabel.text = Time.realtimeSinceStartup.ToString();
}
public void OnOpenSettings()
{
settingsPopUp.Open();
}
}
Синтаксис:
Используется csharp
public class SettingsPopUp : MonoBehaviour
{
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
}
public void Open()
{
gameObject.SetActive(true);
}
public void Close()
{
gameObject.SetActive(false);
}
}
{
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
}
public void Open()
{
gameObject.SetActive(true);
}
public void Close()
{
gameObject.SetActive(false);
}
}
В Unity затем спрайт PopUp перетаскивается в поле Settings Pop Up скрипта UiController
Внимание, вопрос!))
Что за этим стоит?
По идее таким образом мы определяем экземпляр класса SettingsPopUp. Но мы ему присваем спрайт, GameObject, или что?? Я не знаю, у меня нет идей, что за этим стоит и почему так надо поступать. К слову, тоже самое мы делаем с Text scoreLabel и вообще довольно часто такой прием встречается в книге.
Т.е. когда [SerializeField] пишет перед полями типа int, bool, string и т.п. я понимаю
Но когда таким образом мы создаем экземпляр собственного класса, присоединенного к другому объекту - я не понимаю.
Возможно, если кто-нибудь приведет код, как это же самое сделать без [SerializeField] - я пойму.
Прошу помочь разобраться!
Всем спасибо!