2013-10-19 30 views
0

这两种方法有什么区别?为什么我更喜欢一个?差异btw。 sendmessage和设置值

1)

GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().active = true; 

2)

GameObject.FindGameObjectWithTag("").GetComponent<Rocket>().SendMessage("setActive"); 

的感谢!

+0

避免使用'SendMessage',它总是成为最慢的解决方案(见Heisenbug的回答)。很多教程使用'SendMessage',因为它可以快速写入。 – Jerdak

回答

0

,首先它似乎有好几个不一致上面代码:

1)Components(和MonoBehavior)没有积极性(主动属于GameObject),这样的代码不应该的第一线不会编译。此外,团结的最新版本不再有效,它被替换为activeSelfactiveInHierarchy

而btw,activeSelf和activeInHierarchy都是只读的,所以你不能直接给它们赋值。如需更改其价值,请使用SetActive方法。

2) 的第二行代码不应该工作,要么(除非统一做幕后的一些神奇),因为SetActive方法属于GameObject,而不是你的RocketComponent

现在,我想您的问题之间的区别:

gameObject.SetActive(true); 

gameObject.SendMessage("SetActive",true); 

的结果是一样的,但是在第二种方式Unity3D将使用reflection找到正确的方法被叫,如果有的话。反思对性能有重大影响,所以我建议你尽可能避免它。

+0

嗨Heisenbug,活跃是我身边的一个非常糟糕的例子。主动应该是由对象“火箭”的任何公共变量。不过谢谢你提供所有关于活动的细节。 但在你的例子中你调用函数,但我只是改变变量值。 gameObject.active = true; 那么现在与性能的区别如何? – user1767754

+1

如果您有对组件的引用,请避免发送消息,并且可以直接或通过方法设置值。 – Heisenbug

1

发送消息搜索gameObject的所有组件并调用与该消息具有相同名称的任何函数。不是100%肯定,但我确定这使用通常被认为是慢的反射。

SetActive()或活动变量将gameObject设置为活动或不活动。如果它不活跃,它不会在场景中呈现,反之亦然。