【你真的會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
- 【譯】 React官方:函式元件與類元件的差異 ?React函式元件
- iOS、Android 開發的前景真的那麼差嗎?iOSAndroid
- Flutter篇之你真的會使用Future嗎?Flutter
- Javers 比較兩個類的差異
- 你真的會在async/await中捕獲異常嗎?AI
- 卡片開發使用偽類之踩坑記錄
- 新火種AI | 人工智慧在未來真的會摧毀人類嗎?AI人工智慧
- AI與區塊鏈的融合會給人類帶來什麼?AI區塊鏈
- 你所熱愛的Roguelike遊戲,在他們眼中卻是異類遊戲
- 每天加班的你,真的會工作嗎?
- [譯]React函式元件和類元件的差異React函式元件
- 一文帶你學會AQS和併發工具類的關係AQS
- 你真的會vue-router嗎?Vue
- 一文帶你學會AQS和併發工具類的關係2AQS
- 測試工程師看過來!面試,你真的會嗎?工程師面試
- 你會去玩一款“類XX”遊戲嗎?遊戲
- 類與類之間的基本關係
- 前端er,你真的會用 async 嗎?前端
- 堆排序你真的學會了嗎?排序
- 你真的會使用資料庫的索引嗎?資料庫索引
- JavaScript物件:我們真的需要模擬類嗎?JavaScript物件
- Python使用.NET開發的類庫來提高你的程式執行效率Python
- 你真的瞭解JAVA中物件和類、this、super和static關鍵字嗎Java物件
- 000.【Web安全】你所使用的隨機數真的安全嗎?Web隨機
- 淺談社交遊戲的分類,以及各類社交遊戲帶來的社交關係體驗的異同遊戲
- Android開發工具類之DownloadManagerProAndroid
- Scala與Java差異(五)之Map與TupleJava
- iOS開發中你真的會用#define麼!!!?iOS
- Android 開發:使用繪製基金圖表類(帶快取的圖表類)Android快取
- 你真的會用PostGIS中的buffer緩衝嗎?
- 你真的會搭建測試環境嗎?
- Myabtis動態SQL,你真的會了嗎?SQL
- 你真的知道協程是怎麼來的嗎?
- 【愣錘筆記】你真的瞭解什麼是偽類和偽元素嗎筆記
- 前端與後端開發中技術差異的全面對比前端後端
- Scala與Java差異(三)之函式Java函式