【你真的會Unity開發嗎?】第一期之UnityEngine.Object類與System.Object類差異所帶來的坑
丟擲問題
我們先來看一行程式碼
// 嘗試獲取該元件如果獲取為空則新增該元件
MeshFilter meshFilter = this.gameObject.GetComponent<MeshFilter>() ?? this.gameObject.AddComponent<MeshFilter>();
你覺得這行程式碼能在Unity中執行正確獲得期望的結果嗎?如果你覺得這行程式碼有問題,並知道問題的Key點,那麼這篇文章你可以略過過程看一下結論是否與你的猜想一致,如果你覺得沒問題,那麼繼續看下去吧.
執行結果
該行程式碼最後通過Debug.Log()方法輸出的值為null,沒想到吧?不信的同學可以自己去嘗試一下,也可以加深自己的理解與印象。
產生原因
經過一段時間的摸索,博主發現在Unity中MeshFilter的基類是UnityEngine.Object類,而非System.Object類,而因為UnityEngine.Object類重寫了==與!=的行為,這就導致了以下的結果,請看下列程式碼示範
bool sign = GetComponent<MeshFilter>() == null; //UnityEngine.Object
Debug.Log(sign);// True
bool Csharp_sign = (object)GetComponent<MeshFilter>() == null; //System.Object
Debug.Log(Csharp_sign); //False
//So ?? not work correct.
感興趣的同學也可以在自己的編輯器裡測試一下。
結論
由於Object類過載了型別隱式轉換運算子"==“與”!=",所以在使用該相關邏輯的地方需要尤為注意,否則很可能會產生非預期的結果。這個在與null比較時要特別注意,既使是有效的引用結果有可能在與null做等判斷時也是返回true的.
換句話講,也就是Unity中編寫相關指令碼時是不支援??空合併運算子與?.空條件運算子的,這會導致非預期的結果產生,更為詳細的介紹與說明可以參考Unity官網文件對UnityEngine.Object類的詳細說明.
那麼本期文章到此為止,如果你覺得對你有所幫助請給作者一個小小的贊吧~
相關文章
- Java內部類你真的會嗎?Java
- java中的Arrays這個工具類你真的會用嗎Java
- 你真的會閱讀Java的異常資訊嗎?Java
- 未來人工智慧會愈發強大 人類真的沒有機會戰勝嗎?人工智慧
- 帶你開發類似 Pokemon Go 的 AR 遊戲Go遊戲
- Flutter篇之你真的會使用Future嗎?Flutter
- 【譯】 React官方:函式元件與類元件的差異 ?React函式元件
- Linux與Windows中map類erase方法的差異LinuxWindows
- iOS、Android 開發的前景真的那麼差嗎?iOSAndroid
- 新火種AI | 人工智慧在未來真的會摧毀人類嗎?AI人工智慧
- 卡片開發使用偽類之踩坑記錄
- 你真的會用 Babel 嗎?Babel
- MVP模式(2):你真的理解下抽象類和介面嗎??MVP模式抽象
- 你真的會在async/await中捕獲異常嗎?AI
- 你所熱愛的Roguelike遊戲,在他們眼中卻是異類遊戲
- AI與區塊鏈的融合會給人類帶來什麼?AI區塊鏈
- 每天加班的你,真的會工作嗎?
- 智慧手機真的會逐漸影響人類的進化嗎?
- 你真的會vue-router嗎?Vue
- 你會去玩一款“類XX”遊戲嗎?遊戲
- 一文帶你學會AQS和併發工具類的關係AQS
- ORACLE與MYSQL程式碼開發差異OracleMySql
- 測試工程師看過來!面試,你真的會嗎?工程師面試
- [譯]React函式元件和類元件的差異React函式元件
- 一文帶你學會AQS和併發工具類的關係2AQS
- 堆排序你真的學會了嗎?排序
- 前端er,你真的會用 async 嗎?前端
- 你真的會寫單例模式嗎?單例模式
- 天天用的開發環境,你真的瞭解嗎?開發環境
- 天天用的開發環境 你真的瞭解嗎?開發環境
- 你真的會使用資料庫的索引嗎?資料庫索引
- 程式、會話、連線之間的差異會話
- 淺談社交遊戲的分類,以及各類社交遊戲帶來的社交關係體驗的異同遊戲
- iOS開發中你真的會用#define麼!!!?iOS
- Myabtis動態SQL,你真的會了嗎?SQL
- 你真的會搭建測試環境嗎?
- Android開發者:你真的會用AsyncTask嗎?Android
- 你真的會用標點符號嗎?符號