Замените SerializeField статическим экземпляром в Unity - PullRequest
0 голосов
/ 05 июня 2018

Обычно я вызывал бы метод из другого 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 Ответ

0 голосов
/ 05 июня 2018

При использовании этого кода могут возникнуть некоторые проблемы, так как экземпляр установлен в методе 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");
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...