这两种方法有什么区别?我为什么喜欢一个?
1)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().active = true;
2)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().SendMessage("setActive");
谢谢!
答案 0 :(得分:1)
发送消息搜索gameObject的所有组件,并调用与消息同名的任何函数。不是100%肯定,但我确定这使用通常被认为是慢的反射。
SetActive()或活动变量将gameObject设置为活动与否。如果它不活动则不会在场景中渲染,反之亦然。
答案 1 :(得分:0)
首先,您的代码似乎存在一些不一致之处:
1)Components
(和MonoBehavior)没有活动属性(active属于GameObject),因此第一行代码不应该编译。此外,最简单的统一版本不再有效,它被activeSelf和activeInHierarchy取代。
顺便说一下,activeSelf和activeInHierarchy都是只读的,所以你不能直接给它们赋值。要使用SetActive方法更改其值。
2)
第二行代码也不应该工作(除非Unity在幕后做了一些魔术),因为SetActive
方法属于GameObject
而不属于Rocket
Component
。< / p>
现在,我想你的问题是:
之间的区别gameObject.SetActive(true);
和
gameObject.SendMessage("SetActive",true);
结果是一样的,但第二种方式Unity3D
将使用reflection来查找要调用的正确方法(如果有的话)。反射对性能有很大的影响,所以我建议你尽可能地避免它。