unity setActive(true) 找不到物体
在使用 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) 找不到物体的问题。