Замените SerializeField статическим экземпляром в Unity

Question3r спросил: 12 мая 2018 в 04:33 в: c#

Обычно я вызывал метод из другого Monobehaviour таким образом

[SerializeField]
private OtherScript s;private void Start()
{
    s.DoSomething();
}

И я подумал о чем-то вроде этого

public class OtherScript : MonoBehaviour
{
    public static OtherScript Instance { get { return this; } }    public void DoSomething()
    {
        Debug.Log("Call");
    }
}

Тогда Я мог бы вызвать метод из других сценариев таким образом

OtherScript.Instance.DoSomething();

Но я не могу вернуть this как статическое свойство. Обходным решением будет этот

public class OtherScript : MonoBehaviour
{
    private static OtherScript instance;    public static OtherScript Instance { get { return instance; } }    private void Start()
    {
        instance = this;
    }    public void DoSomething()
    {
        Debug.Log("Call");
    }
}

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

Все монобои, которые уникальны, например GameManager, GameObserver, IngameMenu и т. д. должны иметь статический экземпляр, поскольку они существуют только один раз в сцене, и мне не нужно настраивать поле инспектора для этой ссылки несколько раз.

Есть ли лучший способ использования статического экземпляра?


1 ответ

Есть решение
Programmer ответил: 12 мая 2018 в 04:49

При использовании этого кода могут возникнуть некоторые проблемы, потому что экземпляр isset в методе Start. Это может быть слишком поздно, если другие компоненты оставили ссылку при выполнении своего собственного метода Start

True, но именно поэтому у нас есть функция Awake. Установите для инициализации функцию Awake, прочитав ее в функции Start. Функция Awake будет вызываться на каждом скрипте до вызова Start.

public class OtherScript : MonoBehaviour
{
    private static OtherScript instance;    public static OtherScript Instance { get { return instance; } }    private void Awake()
    {
        instance = this;
    }    public void DoSomething()
    {
        Debug.Log("Call");
    }
}

Остальная часть вашего кода должна оставаться той же .

Question3r ответил: 12 мая 2018 в 05:14
но Awake не имеет 100% -ной гарантии, которая вызывается до Start правильно?
Programmer ответил: 12 мая 2018 в 05:23
100% гарантировано. Прокрутите страницу вниз, чтобы увидеть блок-схему выполнения, которая даже документирована.
Question3r ответил: 12 мая 2018 в 05:46
Большое спасибо, я думаю, что это более полезно, чем много полей инспектора несколько раз