//定制预置体
//要求: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 代码自动化生成定制预置体的旋转问题的更多相关文章

  1. 【Unity】工具类系列教程—— 代码自动化生成!

    转载自:https://zhuanlan.zhihu.com/p/30716595?utm_medium=social&utm_source=qq [为什么要做自动化工具] 工具类的创建是为了 ...

  2. 不可能的工作:在FBX模型导入脚本中生成模型的预置体

    #if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using System.IO; using ...

  3. Guns自动化生成代码使用

    一.Guns简介 Guns基于Spring Boot2,致力于做更简洁的后台管理系统.包含系统管理,代码生成,多数据库适配,SSO单点登录,工作流,短信,邮件发送,OAuth2登录,任务调度,持续集成 ...

  4. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  5. GhostDoc Pro v4.9.14093.Cracked.By.SubMain 一款好用的代码注释生成工具——VS插件

    一款比较好用的 VS 插件,能够快速生成注释. 这是 Pro 版本,与标准版本相比,支持对类.文件批量生成注释并且可以生成 CHM 帮助文件. 具体差异请转到: http://submain.com/ ...

  6. 使用C#通过调用minitab的COM库自动化生成报表

    本文介绍通过C#调用minitab com组建自动化生成报表的方法. 首先需要在minitab中通过手动配置的方式生成报表来得到该报表的命令行,过程如下 选择菜单“编辑器”->“启用命令”启用命 ...

  7. 通过shell脚本实现代码自动化部署

    通过shell脚本实现代码自动化部署 一.传统部署方式及优缺点 1.传统部署方式 (1)纯手工scp (2)纯手工登录git pull.svn update (3)纯手工xftp往上拉 (4)开发给打 ...

  8. 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)

            目录:            第1版:http://blog.csdn.net/vipbooks/article/details/51912143            第2版:htt ...

  9. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

随机推荐

  1. jenkins for mac

    Mac环境中Jenkins的停止和启动命令启动sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist停止sudo launchc ...

  2. js去重复和取重复数据

    js数组中取重复数据的方法: 方法一:去重复数据 <script> Array.prototype.distinct=function(){ var a=[],b=[]; for(var ...

  3. Linux系统下位(Ubuntu 11.04) 下安装配置 JDK 7安装步骤指导

    第一步:下载jdk下载内容为:jdk分为:jdk-7-linux-i586.tar.gzjdk-7u51-linux-x64.tar.gz(适合64位Linux操作系统) hadoop版本为:hado ...

  4. SQL夯实基础(九)MySQL联接查询算法

    书接上文<SQL夯实基础(八):联接运算符算法归类>. 这里先解释下EXPLAIN 结果中,第一行出现的表就是驱动表(Important!). 对驱动表可以直接排序,对非驱动表(的字段排序 ...

  5. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  6. php基础语法(控制语句、数组、函数)

    流程控制 if -else if -else语句: switch语句: while循环: do while循环 for循环: 控制脚本执行进度 die(“输出内容”) exit是die的同义词. sl ...

  7. Matlab 之 FFT的理解和应用

    网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解. 不知道大家有没有类似以下几点的困惑: 问题的提出 对于1秒钟输出的连续信号,使用采样率Fs不同,就会 ...

  8. [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

    本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...

  9. Oracle 之 AIO (异步io)

    Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能.它是Linux 2.6 版本内核的一个标准特性,AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等 ...

  10. Eclipse Failed to load D:\android-sdk-windows\build-tools\27.0.3\lib\dx.jar

    Failed to load D:\android-sdk-windows\build-tools\27.0.3\lib\dx.jar Unknown error: Unable to build: ...