获取脚本的组件与脚本本身的实例

时间:2015-01-30 14:16:16

标签: c# unity3d

为了获得另一个类中的变量,函数,我已经知道了两种方法。首先,将Get Component添加到我们想要获取变量(s),函数的脚本中。其次,是使用脚本本身。

所以我做了以下代码:

第一种情况:在脚本中获取组件

public class Manager : MonoBehaviour 
{
    private AnotherManager _anotherManager;

    private void Awake()
    {
        _anotherManager = GameObject.Find("Managers").GetComponent<AnotherManager>();
    }

    private void Start()
    {
        _anotherManager.myIntVariable = 10;

        _anotherManager.MyFunction();
    }
}

public class AnotherManager : MonoBehaviour 
{
    public int myIntVariable;

    public void MyFunction()
    {

    }
}

第二种情况:使用脚本本身的实例

public class Manager : MonoBehaviour 
{
    private void Start()
    {
        AnotherManager.instance.myIntVariable = 10;

        AnotherManager.instance.MyFunction();
    }
}

public class AnotherManager : MonoBehaviour 
{
    public static AnotherManager instance;

    public int myIntVariable;

    private void Awake()
    {
        instance = this;
    }

    public void MyFunction()
    {

    }
}

我的问题是:这些案件之间有什么区别吗?在编程程序员或性能的良好实践方面,或者只是程序员的观点或其他问题?

由于

1 个答案:

答案 0 :(得分:2)

第二个例子是所谓的Singleton Pattern,应该非常谨慎地使用。

我尝试永远不要使用第一种方法,无论你在哪里找到游戏对象并希望它存在。

您可以为Unity Inspector公开一个字段,以便您可以将其连线,就像暴露任何其他变量一样

public AnotherManager AnotherManager;

或者,如果你讨厌在像我这样的地方使用公共,你也可以向Unity表明你希望在检查器中使用SerializeField属性公开这个变量

[SerializeField]
private AnotherManager anotherManager;

使用这两种方法,您可以将一个附加了AnotherManager组件的对象拖到检查器的字段中。

如果实例化对象需要访问它,则需要在实例化时将其连接起来。

如果你需要帮助将它整合在一起,我可以附上一些截图。