2013-10-19 61 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設置爲活動或不活動。如果它不活躍,它不會在場景中呈現,反之亦然。