0

这两种方法有什么区别?为什么我更喜欢一个?

1)

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

2)

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

谢谢!

4

2 回答 2

1

发送消息会搜索游戏对象的所有组件并调用与消息同名的任何函数。不是 100% 肯定,但我确信这使用了通常被认为很慢的反射。

SetActive() 或活动变量将游戏对象设置为活动或不活动。如果它不活动,它不会在场景中渲染,反之亦然。

于 2013-10-21T18:01:46.743 回答
0

首先,上面的代码似乎有几个不一致之处:

1)Components(和MonoBehavior)没有 active 属性(active 属于GameObject),所以第一行代码不应该编译。此外,unity 的最新版本不再具有 active,它被activeSelfactiveInHierarchy所取代。

顺便说一句,activeSelf 和 activeInHierarchy 都是只读的,所以你不能直接给它们赋值。要更改它们的值,请使用SetActive方法。

2)第二行代码也不应该工作(除非 Unity 在幕后做了一些魔法),因为SetActive方法属于GameObject而不属于你的Rocket Component.

现在,我想你的问题是:

gameObject.SetActive(true);

gameObject.SendMessage("SetActive",true);

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

于 2013-10-19T18:05:00.670 回答