对象引用未设置到对象的实例,它昨天工作,今天打开并抛出错误
Object reference not set to an instance of an object, it worked yesterday, opened today and errors are thrown
基本上,我正在使用 Unity 中的 Vuforia 创建一个增强现实项目。我是 C# 的新手,所以我知道代码可能不是最优的,但它确实有效。我昨天和今天打开它再次测试并开发更多时保存并退出,突然抛出错误说:
NullReferenceException: Object reference not set to an instance of
an object
marsHVB_script.Start () (at Assets/marsHVB_script.cs:11)
我有两个独立的脚本,一个是主要脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class main : MonoBehaviour
{
public static GameObject helpObj;
public static GameObject NVB;
public static GameObject BVB;
public static GameObject helpMsg;
public static GameObject nText1;
public static GameObject nText2;
public static GameObject nText3;
public static GameObject nText4;
public static int stage = 1;
// Start is called before the first frame update
void Start()
{
helpObj = GameObject.Find("marsHVB");
helpMsg = GameObject.Find("marsHelp");
nText1 = GameObject.Find("nText1");
nText2 = GameObject.Find("nText2");
nText3 = GameObject.Find("nText3");
nText4 = GameObject.Find("nText4");
nText2.SetActive(false);
nText3.SetActive(false);
nText4.SetActive(false);
helpMsg.SetActive(false);
}
public static void IncrStage()
{
stage++;
Debug.Log("Stage Increased to " + stage);
}
public static void DecrStage()
{
stage--;
Debug.Log("Stage Decreased to " + stage);
}
public static int GetStage()
{
Debug.Log("Stage Got " + stage);
return stage;
}
// Update is called once per frame
void Update()
{
}
}
在下面显示的代码中,我创建了 public 应该可以从其他脚本访问的静态变量。我找到它们并在之后将它们关闭。
然后是控制虚拟按钮的第二个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class marsHVB_script : MonoBehaviour, IVirtualButtonEventHandler
{
void Start()
{
main.helpObj.GetComponent<VirtualButtonBehaviour>().RegisterEventHandler(this);
}
void IVirtualButtonEventHandler.OnButtonPressed(VirtualButtonBehaviour vb)
{
switch (main.GetStage())
{
case 1:
main.nText1.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 2:
main.nText2.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 3:
main.nText3.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 4:
main.nText4.SetActive(false);
main.helpMsg.SetActive(true);
break;
}
Debug.Log("Help Pressed");
}
void IVirtualButtonEventHandler.OnButtonReleased(VirtualButtonBehaviour vb)
{
switch (main.GetStage())
{
case 1:
main.helpMsg.SetActive(false);
main.nText1.SetActive(true);
break;
case 2:
main.helpMsg.SetActive(false);
main.nText2.SetActive(true);
break;
case 3:
main.helpMsg.SetActive(false);
main.nText3.SetActive(true);
break;
case 4:
main.helpMsg.SetActive(false);
main.nText4.SetActive(true);
break;
}
Debug.Log("Help Removed");
}
// Update is called once per frame
void Update()
{
}
}
第二个脚本对虚拟按钮的按下和释放做出反应。
在 main.helpObj.GetComponent 函数的第 11 行抛出错误,昨天有效,今天无效。
请帮我排查一下这是什么原因,我现在卡在这里了。
您永远不应使用 Start
void 来初始化代码中的变量。 Awake
通常用于此,因为 Awake
总是在 Start
之前调用。
如果您将 main
class 中的 Start()
更改为 Awake()
,您可以确保 helpObj
始终在 marsHVB_script class
尝试访问它。
您可以使用Reset() 函数,将您编写的所有代码放在Start 函数中。它将允许您在不玩游戏的情况下设置参考。
void Reset()
{
helpObj = GameObject.Find("marsHVB");
helpMsg = GameObject.Find("marsHelp");
nText1 = GameObject.Find("nText1");
nText2 = GameObject.Find("nText2");
nText3 = GameObject.Find("nText3");
nText4 = GameObject.Find("nText4");
nText2.SetActive(false);
nText3.SetActive(false);
nText4.SetActive(false);
helpMsg.SetActive(false);
}
写到这里,回去找编辑。单击脚本组件上的齿轮图标,然后单击 "Reset"。它将设置所有引用,然后您可以安全地删除该 Start 函数。
基本上,我正在使用 Unity 中的 Vuforia 创建一个增强现实项目。我是 C# 的新手,所以我知道代码可能不是最优的,但它确实有效。我昨天和今天打开它再次测试并开发更多时保存并退出,突然抛出错误说:
NullReferenceException: Object reference not set to an instance of
an object
marsHVB_script.Start () (at Assets/marsHVB_script.cs:11)
我有两个独立的脚本,一个是主要脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class main : MonoBehaviour
{
public static GameObject helpObj;
public static GameObject NVB;
public static GameObject BVB;
public static GameObject helpMsg;
public static GameObject nText1;
public static GameObject nText2;
public static GameObject nText3;
public static GameObject nText4;
public static int stage = 1;
// Start is called before the first frame update
void Start()
{
helpObj = GameObject.Find("marsHVB");
helpMsg = GameObject.Find("marsHelp");
nText1 = GameObject.Find("nText1");
nText2 = GameObject.Find("nText2");
nText3 = GameObject.Find("nText3");
nText4 = GameObject.Find("nText4");
nText2.SetActive(false);
nText3.SetActive(false);
nText4.SetActive(false);
helpMsg.SetActive(false);
}
public static void IncrStage()
{
stage++;
Debug.Log("Stage Increased to " + stage);
}
public static void DecrStage()
{
stage--;
Debug.Log("Stage Decreased to " + stage);
}
public static int GetStage()
{
Debug.Log("Stage Got " + stage);
return stage;
}
// Update is called once per frame
void Update()
{
}
}
在下面显示的代码中,我创建了 public 应该可以从其他脚本访问的静态变量。我找到它们并在之后将它们关闭。
然后是控制虚拟按钮的第二个脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class marsHVB_script : MonoBehaviour, IVirtualButtonEventHandler
{
void Start()
{
main.helpObj.GetComponent<VirtualButtonBehaviour>().RegisterEventHandler(this);
}
void IVirtualButtonEventHandler.OnButtonPressed(VirtualButtonBehaviour vb)
{
switch (main.GetStage())
{
case 1:
main.nText1.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 2:
main.nText2.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 3:
main.nText3.SetActive(false);
main.helpMsg.SetActive(true);
break;
case 4:
main.nText4.SetActive(false);
main.helpMsg.SetActive(true);
break;
}
Debug.Log("Help Pressed");
}
void IVirtualButtonEventHandler.OnButtonReleased(VirtualButtonBehaviour vb)
{
switch (main.GetStage())
{
case 1:
main.helpMsg.SetActive(false);
main.nText1.SetActive(true);
break;
case 2:
main.helpMsg.SetActive(false);
main.nText2.SetActive(true);
break;
case 3:
main.helpMsg.SetActive(false);
main.nText3.SetActive(true);
break;
case 4:
main.helpMsg.SetActive(false);
main.nText4.SetActive(true);
break;
}
Debug.Log("Help Removed");
}
// Update is called once per frame
void Update()
{
}
}
第二个脚本对虚拟按钮的按下和释放做出反应。 在 main.helpObj.GetComponent 函数的第 11 行抛出错误,昨天有效,今天无效。
请帮我排查一下这是什么原因,我现在卡在这里了。
您永远不应使用 Start
void 来初始化代码中的变量。 Awake
通常用于此,因为 Awake
总是在 Start
之前调用。
如果您将 main
class 中的 Start()
更改为 Awake()
,您可以确保 helpObj
始终在 marsHVB_script class
尝试访问它。
您可以使用Reset() 函数,将您编写的所有代码放在Start 函数中。它将允许您在不玩游戏的情况下设置参考。
void Reset()
{
helpObj = GameObject.Find("marsHVB");
helpMsg = GameObject.Find("marsHelp");
nText1 = GameObject.Find("nText1");
nText2 = GameObject.Find("nText2");
nText3 = GameObject.Find("nText3");
nText4 = GameObject.Find("nText4");
nText2.SetActive(false);
nText3.SetActive(false);
nText4.SetActive(false);
helpMsg.SetActive(false);
}
写到这里,回去找编辑。单击脚本组件上的齿轮图标,然后单击 "Reset"。它将设置所有引用,然后您可以安全地删除该 Start 函数。