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);
}
}
}
将脚本添加到您想要的对象,然后将“开始”拖放到“脚本”字段中。当场景中已有对象或从存储中实例化预制件时,这会更好。
我有一个名为 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);
}
}
}
将脚本添加到您想要的对象,然后将“开始”拖放到“脚本”字段中。当场景中已有对象或从存储中实例化预制件时,这会更好。