//定制预置体
//要求: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. Java并发--并发容器之ConcurrentHashMap

    下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为 ...

  2. DVD项目

    package sy.com.cn;import java.util.*; public class DvdWorker { public static void main(String[]args) ...

  3. 应该抛出什么异常?不应该抛出什么异常?(.NET/C#)

    我在 .NET/C# 建议的异常处理原则 中描述了如何 catch 异常以及重新 throw.然而何时应该 throw 异常,以及应该 throw 什么异常呢? 究竟是谁错了? 代码中从上到下从里到外 ...

  4. angular中的ng-bind-html和$sce服务

    输入的内容存储在数据库中,然后再在数据库中将这些数据读写到页面上,比如你使用了某个第三方的脚本或者库.加载了一段html等等,可能会多了一些css的样式(显示在界面上) 这个时候我们可以利用angul ...

  5. 一个jquery-ajax post例子ajax 登陆

    index.html文件 <html> <head> <meta http-equiv="Content-Type" content="te ...

  6. css3实现气泡效果的聊天框

    因为CSS3尚未形成标准,所以现行的浏览器对于css3支持不太一致,某些特性需要加上浏览器前缀 css属性的浏览器前缀 前缀 渲染引擎 使用该引擎的浏览器 -khtml- KHTML Konquero ...

  7. MySQL5.7.18,初始化完成登录,提示密码过

    初始化完成登录,提示密码过期 原因: 安装CentOs的时候,默认安装了mysql,并且版本与自己安装的mysql版本不一致,直接使用mysql -uroot -p'password'连接,默认调用的 ...

  8. MySQL 存储引擎、锁、调优、失误与事务回滚、与python交互、orm

    1.存储引擎(处理表的处理器) 1.基本操作 1.查看所有存储引擎 mysql> show engines; 2.查看已有表的存储引擎 mysql> show create table 表 ...

  9. node中的socket.io制作命名空间

    如果开发者想在一个特定的应用程序中完全控制消息与事件的发送,只需要使用一个默认的"/"命名空间就足够了.但是如果开发者需要将应用程序作为第三方服务提供给其他应用程序,则需要为一个用 ...

  10. node中express的中间件之basicAuth

    basicAuth中间件为网站添加身份认证功能.在使用了该中间件后, 用户访问网站时必须输入用户名与密码,在用户输入了用户名与密码并通过验证之后才能访问网站. 当用户输入的用户名和密码符合条件,中间件 ...