这两种方法有什么区别?为什么我更喜欢一个?差异btw。 sendmessage和设置值
1)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().active = true;
2)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().SendMessage("setActive");
的感谢!
这两种方法有什么区别?为什么我更喜欢一个?差异btw。 sendmessage和设置值
1)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().active = true;
2)
GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().SendMessage("setActive");
的感谢!
,首先它似乎有好几个不一致上面代码:
1)Components
(和MonoBehavior)没有积极性(主动属于GameObject),这样的代码不应该的第一线不会编译。此外,团结的最新版本不再有效,它被替换为activeSelf和activeInHierarchy。
而btw,activeSelf和activeInHierarchy都是只读的,所以你不能直接给它们赋值。如需更改其价值,请使用SetActive方法。
2) 的第二行代码不应该工作,要么(除非统一做幕后的一些神奇),因为SetActive
方法属于GameObject
,而不是你的Rocket
Component
。
现在,我想您的问题之间的区别:
gameObject.SetActive(true);
和
gameObject.SendMessage("SetActive",true);
的结果是一样的,但是在第二种方式Unity3D
将使用reflection找到正确的方法被叫,如果有的话。反思对性能有重大影响,所以我建议你尽可能避免它。
嗨Heisenbug,活跃是我身边的一个非常糟糕的例子。主动应该是由对象“火箭”的任何公共变量。不过谢谢你提供所有关于活动的细节。 但在你的例子中你调用函数,但我只是改变变量值。 gameObject.active = true; 那么现在与性能的区别如何? – user1767754
如果您有对组件的引用,请避免发送消息,并且可以直接或通过方法设置值。 – Heisenbug
发送消息搜索gameObject的所有组件并调用与该消息具有相同名称的任何函数。不是100%肯定,但我确定这使用通常被认为是慢的反射。
SetActive()或活动变量将gameObject设置为活动或不活动。如果它不活跃,它不会在场景中呈现,反之亦然。
避免使用'SendMessage',它总是成为最慢的解决方案(见Heisenbug的回答)。很多教程使用'SendMessage',因为它可以快速写入。 – Jerdak