Unity 对象引用在 SetActive false 之后未设置为对象的实例

Unity object reference not set to an instance of an object after SetActive false

我有一个名为 Starting 的游戏对象,其中包含一个 Square 和一个 legacy Text

方块用作按钮,上面写着“按下开始按钮”的文字。用户将按下开始按钮(映射到空格键)。这会将 Starting 游戏对象设置为非活动状态。代码如下:

void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
  if (CharacterController.started == false)
  {
      CharacterController.started = true;
      gameObject.SetActive(false);
  }
  else if (CharacterController.started == true)
  {
      CharacterController.started = false;
      gameObject.SetActive(true);
  }
}
}

CharacterController.started 是另一个游戏对象的布尔值。

我了解如果游戏对象已设置为非活动状态,GameObject.find() 将不起作用。我试图从 CharacterController 脚本中找到游戏对象,如下所示:

void Update()
    {

        if (started)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                starting = GameObject.Find("Starting");
                starting.SetActive(true);
            }
        }
 }

这不起作用并给出错误:

NullReferenceException: Object reference not set to an instance of an object CharacterController.Update () (at Assets/CharacterController.cs:33)

我是 Unity 新手。如何获取起始游戏对象并将其设置为活动状态?

你的问题基本上已经回答了,游戏对象“Starting”是不活跃的,所以它不会找到它。 尝试在游戏开始时在 CharacterController 上引用它,如下所示:

public GameObject startingObject;
private void Start(){
startingObject = GameObject.Find("Starting"); //Find it here, or drag it into the hierarchy
}

然后从 Update() 中删除这一行:

 starting = GameObject.Find("Starting");

因为无论如何在 Update 方法中使用 GameObject.Find() 都是不好的做法。 当然,如果可能的话,将组件引用到层次结构也比使用 GameObject.Find("") 更可取,但两种解决方案都应该可以正常工作

尝试手动声明它而不是 GameObject.Find()。

例如:

public GameObject starting;

然后将其用于 Update()

void Update()
{

    if (started)
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {     
            starting.SetActive(true);
        }
    }

}

将脚本添加到您想要的对象,然后将“开始”拖放到“脚本”字段中。当场景中已有对象或从存储中实例化预制件时,这会更好。