當(dāng)前位置:
首頁(yè) >
U3D 代码自动化生成定制预置体的旋转问题
發(fā)布時(shí)間:2025/3/18
59
豆豆
生活随笔
收集整理的這篇文章主要介紹了
U3D 代码自动化生成定制预置体的旋转问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
U3D 代碼自動(dòng)化生成定制預(yù)置體的旋轉(zhuǎn)問(wèn)題
1 //定制預(yù)置體 2 //要求:1,模型面向U3D的Z軸正向(由MAX導(dǎo)出時(shí)是面向U3D的X負(fù)向的) 3 //2,增加一些常用掛點(diǎn),3增加一個(gè)圓形陰影片,4,添加包圍盒 4 //根據(jù)這些要求制作預(yù)置休 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 //往預(yù)置體中添加陰影,掛點(diǎn)等。 16 //注意:必須先將FBX和陰影都實(shí)例化出來(lái),設(shè)置好層次關(guān)系,然后保存為預(yù)置體 17 18 // 19 //制作出的預(yù)置體需要對(duì)模型朝向進(jìn)行調(diào)整-旋轉(zhuǎn)90度后讓它剛好面向U3D的Z軸正向 20 //這個(gè)旋轉(zhuǎn)不能施加到預(yù)置體的根上,因?yàn)檫M(jìn)入游戲后,這個(gè)值將被人物走路的朝向值覆蓋 21 //同樣,旋轉(zhuǎn)操作不能直接施加到模型的幾何體上,因?yàn)樗鼈儗⒃诠趋雷儞Q中被覆蓋 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);//旋轉(zhuǎn)模型,使面向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 //添加掛點(diǎn),注意:這些掛點(diǎn)在未優(yōu)化的FBX層級(jí)中已存在了(由MAX導(dǎo)出時(shí),這些掛點(diǎn)選擇與否都會(huì)導(dǎo)出,原因不明) 44 var fbxDir = Path.GetDirectoryName(fbxResPath); 45 var fpath = fbxDir + "/linkpts.txt"; 46 if (!File.Exists(fpath)) 47 { 48 EditorUtility.DisplayDialog("缺少掛點(diǎn)配置文件", 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 //因?yàn)槟P涂s放了,掛點(diǎn)位置也要縮放 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 //刪除場(chǎng)景中生成的模型和陰影實(shí)例 77 GameObject.DestroyImmediate(root); 78 GameObject.DestroyImmediate(fbxgo); 79 GameObject.DestroyImmediate(shadowgo); 80 81 return pb; 82 }?
posted on 2018-02-26 14:53 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
總結(jié)
以上是生活随笔為你收集整理的U3D 代码自动化生成定制预置体的旋转问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【摘录】UNITY优化-有关骨骼数量的上
- 下一篇: LUA upvalue使用陷阱一例