目前整理Unity4.x 項目升級Unity5.x以及Unity2017.x 過程中出現的各種常見異常問題,與大家經驗共享。按照問題出現的版本分為Unity5.x 升級到Unity2017.x 以及Unity4.x 升級到Unity5.x 兩種情形進行總結:
- Unity5.x 升級 Unity2017.x 容易出現的問題:
問題1: Unity開發導航尋路的源代碼中原本定義的”NavMeshAgent” 類,系統已經不再識別?
解答:
應該是從Unity5.6以上版本,導航尋路中的大量API類,已經封裝到新的命名空間“UnityEngine.AI”下。也就是說程序開頭使用Using 導入命名空間UnityEngine.AI即可。
問題2: 項目升級到Unity2017.x 過程中,源代碼中的“Application.LoadLevelAsync()”(也包括“Application.LoadLevel()”) 系統提示已經過時, 如何處理?
解答:
這個問題應該是Unity5.3以上版本就已經發生了變化。以上腳本可以通過導入“Using UnityEngine.SceneManagement”命名控件,然后改為如下代碼:
SceneManager.LoadSceneAsync("");//異步場景轉換
SceneManager.LoadScene(""); //同步場景轉換
問題3: 項目升級到Unity2017.x 導航尋路失效,不再有反應?
解答;
Unity5.6之后的版本,其導航尋路的底層API做了重寫,所以原本導航尋路的NavMesh 是需要重新做導航烘焙才可解決。
問題4: 項目升級到Unity2017.x 后,烘焙的場景變得格外高亮(不正常)?
解答:
Unity2017.x 的光影系統內部Shader等算法進一步優化與改善,所以在Unity5.x 中烘焙的場景應該再次重新烘焙,就可顯示正常光影效果。
- Unity4.x 升級Unity5.x 容易出現的問題:
問題1:Unity4.x 項目升級到Unity5.x 中, 3D模型其材質丟失,成為“白模”?
解答;
Unity5.x(包含Unity2017.x)中對於材質采用基於物理着色(PBS)的材質系統,所以3D模型升級后需要手工重新賦值材質與貼圖等。
問題2:Unity4.x 項目中的NavMesh 升級報錯:“NavMesh asset format has changed. Please rebake the NavMesh data.”?
解答;
按照字面含義,重新對靜態物體進行新的導航烘焙即可。
問題3: Unity4.x 項目天空盒子升級后顯示混亂?
解答;
找到項目中“標准資源”(Standard Assets),點擊天空盒子的材質,出現提示信息“This texture contains alpha, but is not RGBM(Incompatible with HDR[高動態光照渲染])”點擊“Fix Now”進行自動修復即可。。
問題4: Unity4.x 在升級后出現某些3D模型不顯示的“嚴重”問題?
解答;
由於Unity5.x 與Unity4.x版本的底層編碼變化較大,Unity5.x已經不能正確識別部分老“預設”,從而造成不顯示問題。此時我們找到對應模型的“原型”3D模型,重新建立“預設”在場景中的原位置進行重新加載即可。(注意與原來的方位需要一致才可以)。
問題5: Unity4.x 項目升級后部分Animation動畫失效(即:不動沒有反應)?
解答;
我們把Animation動畫在Unity5.x中重新編輯與應用即可。
問題6: Unity4.x 的布料模擬升級到Unity5.x 無法應用,也找不到原來的組件了?
解答:
Unity5.x (包含Unity2017.x)中廢棄了Interactive Cloth 與Cloth Renderer 組件,轉而使用Cloth 與Skinned Mesh Rederer 組件代替。(注:詳情請查閱本書籍11.5.5章節)
- 腳本問題匯總, 由於腳本升級過程中造成的各種異常現象匯總如下:
- 光標鎖定腳本
Screen.lockCursor = true; //Unity4.x傳統寫法
Cursor.lockState = CursorLockMode.Locked;//Unity5.x(2017.x)等價替換
2. 腳本AddComponent()、GetComponent() 問題
例如1:
GoNeedAddScriptsObj.AddComponent("類名稱");// Unity4.x傳統寫法
GoNeedAddScriptsObj.AddComponent();//必須用泛型代替。
例如2:
GoCreatObj.Renderer.Material.color=Color.red;// Unity4.x傳統寫法
GoCreatObj.GetComponent().material.color = Color.red//Unity5.x(2017.x)等價替換
例如3:
AddComponent(“腳本字符串”);Unity4.x 中這種API寫法,可以實現動態加載腳本功能。而到了Untiy5.x 被否決禁止使用,替代寫法如下: GoNeedObj.AddComponent(System.Type.GetType(“腳本字符串”);
3. 腳本Animation 播放動畫問題
例如:
this.animation.Play("xxx"); // Unity4.x傳統寫法
this.GetComponent().Play("xxx"); // Unity5.x(2017.x)等價替換
4.腳本剛體組件寫法
例如:
con.gameObject.collider.xx(); // Unity4.x傳統寫法,已經被否決。
con.gameObject.GetComponent().xxx();//Unity5.x(2017.x)等價替換
5. 關於AssetBundle錯誤信息
報錯信息: “UnityEngine.AssetBundle.Load(string)' is obsolete: `Method Load has been deprecated. Script updater cannot update it as the loading behaviour has changed. Please use LoadAsset instead and check the documentation for details.”
解答:分析以上錯誤信息表明AssetBundle.Load(“”) 這個API已經否決不再允許使用。替代寫法是:AssetBundle.LoadAsset (“”)