//定制预置体
//要求: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. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

    BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...

  2. 【DUBBO】dubbo的Cluster接口

    Directory中的多个Invoker伪装成一个Invoker, 对上层透明,包含集群的容错机制 Cluster可以看做是工厂类, 将目录directory下的invoker合并成一个统一的Invo ...

  3. Python 函数-max()

    max( x, y, z, .... )max() 方法返回给定参数的最大值,参数可以为序列.返回给定参数的最大值.x.y.z数值表达式. 实例 #!/usr/bin/python print &qu ...

  4. 【转】简述configure、pkg-config、pkg_config_path三者的关系

    原文网址:http://www.mike.org.cn/articles/description-configure-pkg-config-pkg_config_path-of-the-relatio ...

  5. JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  6. 黄聪:如何使用Add-on SDK开发一个自己的火狐扩展

    火狐开放了扩展的开发权限给程序员们,相信很多人都会希望自己做一些扩展来方便一些使用. 我最近做一些项目也需要开发一个火狐扩展,方便收集自己需要的数据,因此研究了几天怎么开发,现在已经差不多完成了,就顺 ...

  7. C语言函数返回值和变量类型

    前言 最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂.借此机会,重新梳理下C语言中函数的返回值与变量类型的关系. 按照变量的寿命,可以分为三种类型 1.静态变量 寿命从程序开 ...

  8. Firewalld的panic模式

    原文地址:http://www.excelib.com/article/289/show Firewalld有一种Panic模式,Panic的单词含义为“恐慌”.“惊慌”,在firewalld中他表示 ...

  9. JNI的一个简单实例

    本例子使用的操作系统MacOS, 64位JVM. JNI编写的几个步骤如下: 编写Java代码,并注明native方法: public class HelloJni { public native v ...

  10. 在Eclipse中使用Maven部署项目的Tomcat

    方式一:打war包到tomcat/webapps目录 点击在项目上面 -> 右键 -> Run As -> Maven install 之后查看Maven输出路径: D:\apach ...