使用带有脚本引用的 Unity.5.6.5 的 NullReferenceException

A NullReferenceException using Unity.5.6.5 with a script reference

我遇到的问题有 3 个脚本在起作用。

首先,我有一个对象,我希望 select 以下代码与“GameManager”(第二个相关对象)通信,它是 selected 对象,它有效:

public void OnMouseDown ()
{
    if(TheGameManager.SelectableOn || TheGameManager.SelectedObject == this){



    //If clicked and not already selected then determain this as the selected object
    OnOff = !OnOff;
    if(FindObjectOfType<GameManager>().SelectedObject != this){OnOff = true;}
    if(FindObjectOfType<GameManager>().SelectedObject == null){OnOff = true;}

    //Determain this as the selected object
    if(OnOff){FindObjectOfType<GameManager>().SelectedObject = this; TheGameManager.UpdateZUIInterface("close");}
        else{FindObjectOfType<GameManager>().SelectedObject = null;TheGameManager.ResetAllUIToDefault();}

    TheGameManager.UpdateAllUIElements();
    }

这是它在检查器中的样子 Picture of the first object being selected 然而,当我尝试引用在 GameManager 中保存的这个实例时,问题发生了。

[SerializeField] GameManager TheGameManager;

public void OnMouseDown (){

    Selectable SelectedObject = TheGameManager.ProvideSelectedObject();
    Debug.Log(SelectedObject.gameObject);
    Debug.Log(TheGameManager.SelectedObject.GetComponent<Selectable>().gameObject);


}

这两种访问实例的方法均无效。我可以想象从实例本身发送的直接引用会起作用,但是我尝试使用 GameManager 作为大多数常用变量的中央存储,所以我想避免这样做。你们有什么解决办法或想法吗? 我很想听听你的意见。

如果 TheGameManager 设置为单例,则它可能具有静态 instance 属性 或字段。在这种情况下,您应该调用静态 isntance 字段而不是 TheGameManager

的本地实例

因此,删除: [SerializeField] GameManager TheGameManager;

然后像这样给游戏管理员打电话:

varSelectedObject = TheGameManager.instance.ProvideSelectedObject();

这是假设,但我敢说这是你问题的原因。如果不是这种情况,我们需要查看 TheGameManager.

的实际代码