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

Get Component to the Script vs Instance of the Script itself

为了在另一个 class 中获取变量、函数,我知道有两种方法可以做到这一点。首先,是将 Get Component 用于我们想要获取变量、函数的脚本。其次,是使用脚本本身的实例。

所以我做了如下代码:

第一种情况:将组件获取到脚本本身

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()
    {

    }
}

我的问题是:这些案例之间有什么区别吗?就程序员编码的良好实践或性能而言,还是只是程序员的观点或其他任何问题?

谢谢

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

我尽量不使用第一种方法,无论是在您找到游戏对象并希望它存在的地方。

您可以为 Unity Inspector 公开一个字段,以便您可以像公开任何其他变量一样连接它

public AnotherManager AnotherManager;

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

[SerializeField]
private AnotherManager anotherManager;

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

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

如果您需要帮助统一附加它,我可以附上一些屏幕截图。