U3D 代码自动化生成定制预置体的旋转问题
生活随笔
收集整理的這篇文章主要介紹了
U3D 代码自动化生成定制预置体的旋转问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
U3D 代碼自動化生成定制預置體的旋轉問題
1 //定制預置體 2 //要求:1,模型面向U3D的Z軸正向(由MAX導出時是面向U3D的X負向的) 3 //2,增加一些常用掛點,3增加一個圓形陰影片,4,添加包圍盒 4 //根據這些要求制作預置休 5 static GameObject CreateCustomPrefab(string fbxResPath, string saveDir, string saveName) 6 { 7 Directory.CreateDirectory(saveDir); 8 var fbx = AssetDatabase.LoadAssetAtPath(fbxResPath, typeof(GameObject)) as GameObject; 9 if (fbx == null) 10 { 11 Debug.LogError("加載FBX失敗:" + fbxResPath); 12 return null; 13 } 14 15 //往預置體中添加陰影,掛點等。 16 //注意:必須先將FBX和陰影都實例化出來,設置好層次關系,然后保存為預置體 17 18 // 19 //制作出的預置體需要對模型朝向進行調整-旋轉90度后讓它剛好面向U3D的Z軸正向 20 //這個旋轉不能施加到預置體的根上,因為進入游戲后,這個值將被人物走路的朝向值覆蓋 21 //同樣,旋轉操作不能直接施加到模型的幾何體上,因為它們將在骨骼變換中被覆蓋 22 23 //生成根 24 var root = new GameObject(saveName); 25 26 //掛上模型 27 var fbxgo = GameObject.Instantiate(fbx, root.transform); 28 fbxgo.transform.localRotation = Quaternion.Euler(0, 90, 0);//旋轉模型,使面向Z軸正向 29 fbxgo.name = "Mesh"; 30 31 //添加陰影 32 var shadow = AssetDatabase.LoadAssetAtPath("assets/res/prefabs/char/shadow.prefab", typeof(GameObject)) as GameObject; 33 var shadowgo = GameObject.Instantiate(shadow); 34 shadowgo.name = "shadow"; 35 shadowgo.transform.SetParent(root.transform); 36 37 //添加包圍盒 38 var cap = root.AddComponent<CapsuleCollider>(); 39 cap.height = GameConst.charCapsuleHeight; 40 cap.radius = GameConst.charCapsuleRadius; 41 cap.center = new Vector3(0, cap.height / 2 -0.1f, 0); 42 43 //添加掛點,注意:這些掛點在未優化的FBX層級中已存在了(由MAX導出時,這些掛點選擇與否都會導出,原因不明) 44 var fbxDir = Path.GetDirectoryName(fbxResPath); 45 var fpath = fbxDir + "/linkpts.txt"; 46 if (!File.Exists(fpath)) 47 { 48 EditorUtility.DisplayDialog("缺少掛點配置文件", fbxResPath, "ok"); 49 } 50 else 51 { 52 var sr = new StreamReader(File.OpenRead(fpath), Encoding.ASCII); 53 var longStr = sr.ReadToEnd(); 54 var dats = longStr.Split('\"'); 55 56 for (var i = 0; i < dats.Length; ++i) 57 { 58 if (dats[i] == "" || dats[i] == "\r\n") 59 continue; 60 var subdat = dats[i].Split(' '); 61 var lpt = new GameObject(subdat[0]); 62 63 //因為模型縮放了,掛點位置也要縮放 64 var fx = GameConst.modelFileScale * float.Parse(subdat[1]); 65 var fy = GameConst.modelFileScale * float.Parse(subdat[2]); 66 var fz = GameConst.modelFileScale * float.Parse(subdat[3]); 67 68 lpt.transform.position = new Vector3(fx, fy, fz); 69 lpt.transform.SetParent(root.transform); 70 } 71 } 72 73 74 var pb = PrefabUtility.CreatePrefab(saveDir + saveName, root); 75 76 //刪除場景中生成的模型和陰影實例 77 GameObject.DestroyImmediate(root); 78 GameObject.DestroyImmediate(fbxgo); 79 GameObject.DestroyImmediate(shadowgo); 80 81 return pb; 82 }?
posted on 2018-02-26 14:53 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的U3D 代码自动化生成定制预置体的旋转问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【摘录】UNITY优化-有关骨骼数量的上
- 下一篇: LUA upvalue使用陷阱一例