unity setActive(true) 找不到物体

2015年01月27日 09:56 1 点赞 0 评论 更新于 2025-11-21 15:32

在使用 Unity 进行物体显示与隐藏操作时,你或许遇到过这样的情况:物体能够被隐藏,但使用 setActive(true) 时却找不到物体,导致无法将其显示出来。例如,有开发者遇到这样的问题:“Unity 能隐藏物体,但显示不了物体,请问怎么解决?”

下面是一段存在问题的示例代码:

using UnityEngine;
using System.Collections;

public class abc : MonoBehaviour {
void Update() {
if (Input.GetKey("up")) {
gameObject.SetActive(false);
}
if (Input.GetKey("down")) {
gameObject.SetActive(true);
}
}
}

问题分析

在上述代码中,gameObject 直接引用的是当前脚本所挂载的游戏对象。当使用 gameObject.SetActive(false) 隐藏该对象后,由于该对象已处于非激活状态,Unity 便不会再更新其脚本,后续的 gameObject.SetActive(true) 也就无法执行,从而造成“找不到物体”(实际上是对象未被激活,脚本不再运行)无法显示的现象。

解决方法

在面向对象编程中,如果将 gameObject 作为一个事先定义好的变量(对象)来使用,就可以解决这个问题。以下是改进后的示例代码:

using UnityEngine;
using System.Collections;

public class NewBehaviourScript1 : MonoBehaviour {
public GameObject obj;

void Start() {
// 可在此处进行一些初始化操作
}

void Update() {
if (Input.GetKeyDown(KeyCode.A)) {
obj.SetActive(false);
}
if (Input.GetKeyDown(KeyCode.B)) {
obj.SetActive(true);
}
}
}

代码解释

  • public GameObject obj;:定义了一个公共的 GameObject 类型的变量 obj,可以在 Unity 的 Inspector 面板中为其指定具体的游戏对象。
  • void Start():这是一个初始化方法,在脚本实例被启用时调用,可在此处进行一些必要的初始化操作。
  • void Update():每帧都会调用该方法。当按下键盘上的 A 键时,将 obj 对象隐藏;当按下 B 键时,将 obj 对象显示出来。

通过这种方式,将需要控制的对象作为一个独立的变量来处理,避免了因对象自身被禁用而导致脚本无法继续执行的问题,从而解决了 setActive(true) 找不到物体的问题。

作者信息

feifeila

feifeila

共发布了 3994 篇文章