博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
U3D 代码自动化生成定制预置体的旋转问题
阅读量:6434 次
发布时间:2019-06-23

本文共 3127 字,大约阅读时间需要 10 分钟。

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
();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 else51 {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 }

 

转载于:https://www.cnblogs.com/timeObjserver/p/8473261.html

你可能感兴趣的文章
php token验证范例
查看>>
WebSocket的C++服务器端实现
查看>>
java中两种添加监听器的策略
查看>>
脑洞成现实!AI系统可提前10s预测地震
查看>>
Page页面生命周期——微信小程序
查看>>
Node.js编写CLI的实践
查看>>
Javascript数组对象的方法和属性
查看>>
趁年轻,赶快学一波vim
查看>>
面试题
查看>>
布局定位和图片属性
查看>>
java8新特性之lamda表达式
查看>>
HTTPS 配置教程
查看>>
Matrix源码分析————Resource Canary
查看>>
English Metric Units 介绍
查看>>
实现继承的几种方式及工作原理
查看>>
前端基础4:CSS文本样式和盒子模型问题
查看>>
数据库基本操做—表
查看>>
152 Maximum Product Subarray
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台 (六)分布式配置中心(Spring Cloud Config)...
查看>>
TiDB 3.0.0 Beta.1 Release Notes
查看>>