我一直在尝试使用SetActive ()
打开和关闭GameObjects。
我无法弄清楚并最终使用:
GameObject.Find ("ObjectName").GetComponent<Image> ().enabled = false;
关闭图像。
我不是试图使用相同的脚本来关闭嵌套在其中的多个动画的GameObject。
GameObject.Find ("ObjectName").GetComponent<???> ().enabled = false;
GameObject.Find ("ObjectName").SetActive (false);
我不确定<>
中有什么内容,但我已经阅读了SetActive ()
我可以做到的,但这似乎不起作用并给了我一个{{1}错误。
那么这两者之间有什么区别?我将如何正确使用它们?
答案 0 :(得分:3)
使用GetComponent
可以启用/禁用GameObject上的特定组件并与之交互。
例如,您可能需要在某个时刻禁用GameObject的刚体,但您仍然希望该对象及其上的所有其他对象都处于活动状态。所以你可以简单地说:
GameObject.Find("MyObject").GetComponent<Rigidbody>().enabled = false;
请注意“&lt;&gt;”内的内容是要与之交互的组件的类名。
例如,如果你有一个脚本,你自己写了一个名为MyScript
的游戏对象,你就可以抓住它:
MyScript script = GamesObject.Find("MyObject").GetComponent<MyScript>().enabled = true;
此外,GetComponent
的另一个好用途是从对象的脚本中读取信息。
例如,如果您在对象上有一个名为Health
且带有公共变量HitPoints
的脚本,则另一个脚本可以使用GetComponent
访问该信息。
if( enemyGameObject.GetComponent<Health>().HitPoints < 0 )
{
enemyGameObject.SetActive(false);
}
使用SetActive
将完全启用和禁用GameObject。这比删除/创建新对象便宜,因此常用于Object Pooling等技术。
例如,如果你有一个你需要禁用的GameObject,但是你知道你很快就会再次需要它,那么只需要打电话便宜得多
MyGameObject.SetActive(false);
...
MyGameObject.SetActive(true);
完全删除该对象,然后在准备再次使用时再创建一个新对象。
答案 1 :(得分:1)
设置.enabled
打开或关闭GameObject上的一个组件,例如一个图像。使用SetActive()
打开或关闭整个GameObject。
选择使用哪个应与您要禁用的内容相对应。
答案 2 :(得分:1)
要添加其他答案,当组件被禁用时,意味着不再调用MonoBehaviour回调。所以没有Update,FixedUpdate,OnCollisionXXX等等。
创建对象时会调用Awake,因此在该阶段默认启用它。在Awake之后的第一次运行时调用Start。因此,如果您在Awake中关闭组件,Start将等到您从其他地方重新启动它。
修改enabled属性时会调用OnEnable / OnDisable。
SetActive适用于GO,几乎是一次禁用所有组件的快捷方式。
gameObject.SetActive(false);
foreach(var comp in GetComponentsInChildren<MonoBehaviour>()){
comp.enabled = false;
}
结果非常相似(可能效率不高)。实际上,当您打开/关闭游戏对象时,会调用每个组件的OnEnable / OnDisable。如果关闭对象,则不再调用所有MonoBehaviour回调。
所以,选择取决于你所追求的是什么,如果你想禁用移动但仍然看到对象和其他动作:
GetComponent<Movement>().enabled = false;
如果你想杀死一个敌人:
enemy.gameObject.SetActive(false);
请注意,即使组件处于禁用状态,也不意味着您无法与其进行交互。您仍然可以手动调用其上的任何方法。考虑一下:
AnyComponent ac = gameObject.GetComponent<AnyComponent>();
ac.enabled = false;
ac.AnyMethod();
考虑到它不需要Update或FixedUpdate(物理操作),有效并将执行它的意图。
使用GetComponent无法找到已停用的组件,您可以使用GetComponentInChildren(true)获取它,因为它还会搜索游戏对象及其子对象。我不确定它是返回第一个找到的还是第一个找到的活动。
myGameObject.SetActive(假); AnyComponent ac = myGameObject.GetComponent(); AnyComponent acic = myGameObject.GetComponentInChildren(true);
即使GO附加了AnyComponent,ac也为null,acic不是(虽然似乎是5.3功能)。 http://docs.unity3d.com/ScriptReference/Component.GetComponentInChildren.html
最后,对于一个公开tick的组件,它需要在脚本中有一个Start方法(不要问为什么......)。