這兩種方法有什麼區別?爲什麼我更喜歡一個?差異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