将SerializeField替换为Unity中的静态实例

时间:2018-06-05 18:13:03

标签: c# unity3d

通常情况下,我会用另一种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方法时需要引用,则可能为时已晚。

所有与GameManagerGameObserverIngameMenu等一样独特的monobehaviour应该有一个静态实例,因为它们只在场景中存在一次而我没有多次为此参考设置检查器字段。

使用静态实例有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

  

使用此代码时,可能会出现一些问题,因为实例是   在Start方法中设置。如果其他组件可能为时已晚   在执行自己的Start方法时需要引用

是的,但这就是我们拥有li:first-child { color: var(--oc-green); } 功能的原因。设置初始化Awake函数,在Awake函数中读取它。在调用Start之前,将在每个脚本上调用Awake函数。

Start

其余代码应保持不变。