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