U3D 代码自动化生成定制预置体的旋转问题
//定制预置体
//要求:1,模型面向U3D的Z轴正向(由MAX导出时是面向U3D的X负向的)
//2,增加一些常用挂点,3增加一个圆形阴影片,4,添加包围盒
//根据这些要求制作预置休
static GameObject CreateCustomPrefab(string fbxResPath, string saveDir, string saveName)
{
Directory.CreateDirectory(saveDir);
var fbx = AssetDatabase.LoadAssetAtPath(fbxResPath, typeof(GameObject)) as GameObject;
if (fbx == null)
{
Debug.LogError("加载FBX失败:" + fbxResPath);
return null;
} //往预置体中添加阴影,挂点等。
//注意:必须先将FBX和阴影都实例化出来,设置好层次关系,然后保存为预置体 //////////////////////////////////////////////////////////////////////////
//制作出的预置体需要对模型朝向进行调整-旋转90度后让它刚好面向U3D的Z轴正向
//这个旋转不能施加到预置体的根上,因为进入游戏后,这个值将被人物走路的朝向值覆盖
//同样,旋转操作不能直接施加到模型的几何体上,因为它们将在骨骼变换中被覆盖 //生成根
var root = new GameObject(saveName); //挂上模型
var fbxgo = GameObject.Instantiate(fbx, root.transform);
fbxgo.transform.localRotation = Quaternion.Euler(, , );//旋转模型,使面向Z轴正向
fbxgo.name = "Mesh"; //添加阴影
var shadow = AssetDatabase.LoadAssetAtPath("assets/res/prefabs/char/shadow.prefab", typeof(GameObject)) as GameObject;
var shadowgo = GameObject.Instantiate(shadow);
shadowgo.name = "shadow";
shadowgo.transform.SetParent(root.transform); //添加包围盒
var cap = root.AddComponent<CapsuleCollider>();
cap.height = GameConst.charCapsuleHeight;
cap.radius = GameConst.charCapsuleRadius;
cap.center = new Vector3(, cap.height / -0.1f, ); //添加挂点,注意:这些挂点在未优化的FBX层级中已存在了(由MAX导出时,这些挂点选择与否都会导出,原因不明)
var fbxDir = Path.GetDirectoryName(fbxResPath);
var fpath = fbxDir + "/linkpts.txt";
if (!File.Exists(fpath))
{
EditorUtility.DisplayDialog("缺少挂点配置文件", fbxResPath, "ok");
}
else
{
var sr = new StreamReader(File.OpenRead(fpath), Encoding.ASCII);
var longStr = sr.ReadToEnd();
var dats = longStr.Split('\"'); for (var i = ; i < dats.Length; ++i)
{
if (dats[i] == "" || dats[i] == "\r\n")
continue;
var subdat = dats[i].Split(' ');
var lpt = new GameObject(subdat[]); //因为模型缩放了,挂点位置也要缩放
var fx = GameConst.modelFileScale * float.Parse(subdat[]);
var fy = GameConst.modelFileScale * float.Parse(subdat[]);
var fz = GameConst.modelFileScale * float.Parse(subdat[]); lpt.transform.position = new Vector3(fx, fy, fz);
lpt.transform.SetParent(root.transform);
}
} var pb = PrefabUtility.CreatePrefab(saveDir + saveName, root); //删除场景中生成的模型和阴影实例
GameObject.DestroyImmediate(root);
GameObject.DestroyImmediate(fbxgo);
GameObject.DestroyImmediate(shadowgo); return pb;
}
U3D 代码自动化生成定制预置体的旋转问题的更多相关文章
- 【Unity】工具类系列教程—— 代码自动化生成!
转载自:https://zhuanlan.zhihu.com/p/30716595?utm_medium=social&utm_source=qq [为什么要做自动化工具] 工具类的创建是为了 ...
- 不可能的工作:在FBX模型导入脚本中生成模型的预置体
#if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using System.IO; using ...
- Guns自动化生成代码使用
一.Guns简介 Guns基于Spring Boot2,致力于做更简洁的后台管理系统.包含系统管理,代码生成,多数据库适配,SSO单点登录,工作流,短信,邮件发送,OAuth2登录,任务调度,持续集成 ...
- [goa]golang微服务框架学习(二)-- 代码自动生成
之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...
- GhostDoc Pro v4.9.14093.Cracked.By.SubMain 一款好用的代码注释生成工具——VS插件
一款比较好用的 VS 插件,能够快速生成注释. 这是 Pro 版本,与标准版本相比,支持对类.文件批量生成注释并且可以生成 CHM 帮助文件. 具体差异请转到: http://submain.com/ ...
- 使用C#通过调用minitab的COM库自动化生成报表
本文介绍通过C#调用minitab com组建自动化生成报表的方法. 首先需要在minitab中通过手动配置的方式生成报表来得到该报表的命令行,过程如下 选择菜单“编辑器”->“启用命令”启用命 ...
- 通过shell脚本实现代码自动化部署
通过shell脚本实现代码自动化部署 一.传统部署方式及优缺点 1.传统部署方式 (1)纯手工scp (2)纯手工登录git pull.svn update (3)纯手工xftp往上拉 (4)开发给打 ...
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
目录: 第1版:http://blog.csdn.net/vipbooks/article/details/51912143 第2版:htt ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
随机推荐
- hihocoder1618 单词接龙
#1618 : 单词接龙 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个单词字典和一个起始字母.小Hi需要从起始字母开始,每次再加上一个字母,生成长度为2.3. ...
- tensorflow图像基本处理
tensorflow库提供的专门的图片处理库,以下只是部分示例,更多函数请参照源码'\tensorflow_api\v1\image__init__.py' 加载图像 方式1: 使用tf.gfile. ...
- 每天一个linux命令:【转载】tail命令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...
- .NET中的那些受特别对待的类型(CriticalFinalizerObject)
转自:http://www.cnblogs.com/yuyijq/archive/2009/08/09/1542435.html 股票里面有个ST股,就是Special Treatment的意思.就是 ...
- oracle-分区(笔记)
partition by 用于指定分区方式 range 表示分区的方式是范围划分 partition pn 用于指定分区的名字 values less than 指定分区的上界(上限) ------- ...
- SQL server无法连接,服务无法启动
Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126 在使用SQL2005(或2008)是可能会遇到错误提示: “Windows 不能在 本地计算机 启动 SQL Se ...
- Web API的发布问题
配置“ISAPI 和 CGI 限制”的4.0版本设置为允许,要不然出现“由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面.”的错误. “An error has ...
- Python编码规范和Python风格规范
一.原因 1.长期的工作中,发现大多数程序员的代码可读性差 2.不同的程序员之间的协作很重要,代码可读性必须很好 3.版本升级时,要基于源码升级 4.不友好的代码会影响python的执行效率 二.基于 ...
- JLink RTT Client代替printf(IAR测试OK)
1.打开J-Link安装目录,确保SEGGER目录中有J-Link RTT Client,没有的话必须安装4.9以上版本: 2.打开SEGGER目录下软件SEGGER目录,硬件版本Hardware是8 ...
- 从汇编的角度看待const与#define
先观察一下的代码: #include<stdio.h> int main(){ ; int y; int *pi=(int*)&i; *pi=; y=*pi; int tempi; ...