使用带有脚本引用的 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
.
的实际代码
我遇到的问题有 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
.