Unity3D批处理脚本
本文属于转载,如有侵权,请留言,我会及时删除!
Max09在模型到处的模型和U3D场景的尺寸不一致,Max09中的1m导到U3D中,只有0.01m,这时可以在U3D中将模型的FbxImporter中将Scale Factor改为1。
上述事情也可以通过脚本直接处理:
using UnityEditor;
using UnityEngine;
using System.Collections; public class FBXSeting : AssetPostprocessor
{
void OnPreprocessModel()
{
ModelImporter modelImporter = (ModelImporter)assetImporter;
if(assetImporter.assetPath.Contains(".fbx"))
{
modelImporter.globalScale = 1.0f;
modelImporter.generateMaterials = ModelImporterGenerateMaterials.None;
}
}
}
U3D有自动生成材质的功能(FbxImporter/Materials Generation,有3个选项可选),但我推荐使用脚本统一处理所有模型的材质。下面的代码抛砖引玉,通过菜单修改模型材质的颜色:
using UnityEditor;
using UnityEngine;
using System.Collections; public class MaterialGeneration
{
[MenuItem("Actor/Generate Material")]
static void Execute()
{
foreach (Object o in Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets))
{
if (!(o is GameObject)) continue;
if (o.name.Contains("@")) continue;
//if (!AssetDatabase.GetAssetPath(o).Contains("/characters/")) continue; GameObject charFbx = (GameObject)o; foreach (SkinnedMeshRenderer smr in charFbx.GetComponentsInChildren<SkinnedMeshRenderer>(true))
{
smr.material.color = Color.red;
}
}
}
}
上面是处理人物材质的蒙皮网格的材质,对于场景模型,则改为修改MeshRenderer的数据。思路大致如此,细节以此类推。
根据本人自己的经验,将modelImporter.generateMaterials设为PerMaterial(支持多重材质),然后批处理Fbx模型的Mesh,找到其材质,并修改之(包括修改Shader及Shader数据)。不建议删除现有材质,然后自己创建材质,并赋予给相应的Mesh,因为这种做法有个不好的地方:U3D重启后,材质关联丢失。而前面的方法,只是修改Mesh所关联材质的数据,后者是修改关联。
思绪:
U3D虽然降低了游戏编程门槛,不过定制功能真心强大,继续探索中......
有些地方需要手动创建Prefab,可以通过以下代码实现代码批处理创建:
Object tempPrefab = EditorUtility.CreateEmptyPrefab("Assets/" + name + ".prefab"); tempPrefab = EditorUtility.ReplacePrefab(go, tempPrefab);
通过脚本给模型prefab添加AnimationEvent:
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Collections;
using System.Collections.Generic; public class AnimationEventBatch
{
[MenuItem("Animation/AnimationEvent Batch")]
static void Execute()
{
List<string> lstAnimName = new List<string>(); foreach (Object o in Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets))
{
if (!(o is GameObject))
continue;
if (o.name.Contains("@"))
continue;
if (o.name.Contains("anim") || o.name.Contains("ANIM"))
continue;
if (o.name.Contains("meta"))
continue; GameObject charFbx = (GameObject)o; AnimationClip[] clips = AnimationUtility.GetAnimationClips(charFbx.animation); foreach(AnimationClip clip in clips)
{
if(clip.name.Contains("Take 0"))
continue; List<AnimationEvent> events = new List<AnimationEvent>(AnimationUtility.GetAnimationEvents(clip)); if(HasStartEvent(events) && HasEndEvent(events))
continue; if(!HasStartEvent(events))
{
AnimationEvent startEvent = new AnimationEvent();
startEvent.time = 0.0005f;
startEvent.functionName = "StartCallBack";
events.Add(startEvent);
} if(!HasEndEvent(events))
{
AnimationEvent endEvent = new AnimationEvent();
endEvent.time = clip.length - 0.0005f;
endEvent.functionName = "EndCallBack";
events.Add(endEvent);
} AnimationUtility.SetAnimationEvents(clip, events.ToArray());
} EditorUtility.DisplayDialog("fbxname", clips[].name, "OK");
}
} static bool HasStartEvent(List<AnimationEvent> events)
{
foreach(AnimationEvent eventElem in events)
{
if(eventElem.functionName == "StartCallBack")
return true;
}
return false;
} static bool HasEndEvent(List<AnimationEvent> events)
{
foreach(AnimationEvent eventElem in events)
{
if(eventElem.functionName == "EndCallBack")
return true;
}
return false;
}
}
上述代码仅供参考,代码中有几个注意事项:
(1)一定要在现有AnimationEvent[]数组的基础上添加,而不是新建一个这样的数组,然后Set给对应的AnimationClip,这样会导致现有的关键帧事件丢失;
(2)要避免重复添加同意关键帧事件(貌似u3d对于同样时间同样函数名的关键帧只会添加一次);
(3)可以看到,在添加关键帧事件时,只需要给出函数的名字,那么,在此动作执行时,U3D会检查这个GameObject身上的所有组件脚本,如果组件A包含此名字的函数,则会执行此函数。并且所有组件的此名字的函数都会执行一次。
Unity3D批处理脚本的更多相关文章
- Android测试提升效率批处理脚本(三)
前言: 前面放出过几次批处理,这次只放一个环境检查的被管理员给打回来了,不得不再找找几个有含金量的放出来,请看正文~~~ 目录 1.Android环境检查 2.Android内存监控 3.模拟蓝牙手柄 ...
- 【转】BAT 批处理脚本 教程
第一章 批处理基础第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在 ...
- Android测试提升效率批处理脚本(二)
前言: 前面放出过一次批处理,本次再放出一些比较有用的批处理(获得当前包名.查看APP签名信息等),好长时没来写博客了,简单化,请看正文,更多脚本尽请期待~~~(不定期) 目录 1.[手机录屏(安卓4 ...
- java_jdk_JDK版本切换批处理脚本
我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装多个版本的JDK,如下图所示:
- [windows]快速从ftp下载最新软件包的批处理脚本
背景 由于敏捷开发,快速迭代,我们项目一天会有三个版本,也就意味着我一天要去获取三次软件包.我负责服务端开发,所以我经常需要去拿最新的客户端.我们的客户端放置在一个公共的ftp上面.每天频繁登陆ftp ...
- windows下使用批处理脚本实现多个版本的JDK切换
一.JDK版本切换批处理脚本 我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装多个版本的JDK,如下图所 ...
- unity3d进行脚本资源打包加载
原地址:http://www.cnblogs.com/hisiqi/p/3204752.html 本文记录如何通过unity3d进行脚本资源打包加载 1.创建TestDll.cs文件 public c ...
- BAT 批处理脚本 教程
第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以 ...
- 转】windows下使用批处理脚本实现多个版本的JDK切换
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/5209386.html 感谢! 一.JDK版本切换批处理脚本 我们平时在window上做开发的时候,可能需要同时开 ...
随机推荐
- [RxJS] Combination operator: zip
CombineLatest and withLatestFrom are both AND-style combination operators. In this lesson, we will l ...
- java几种字符串反转
java实现的字符串翻转,能想到的这几种方法 假设有其它方法,欢迎交流 //字符串反转 public class ReverseString { public String reverse1(Stri ...
- android开发之使用Messenger实现service与activity交互
service与activity交互的方式有多种,这里说说使用Messenger来实现两者之间的交互. Service程序 public class MessengerService extends ...
- mssql 创建触发器
MS-SMS里创建触发器: 首先右击表内的触发器文件夹图标 然后输入触发器创建指令,一下案例:(添加创建时间) 创建: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFI ...
- alpha属性设置
alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopacity,style,startX,startY,finishX,finishY).opacity ...
- 项目报错,tomcat中引起
1.项目报错,但发现工程并没有错.此刻错误应该定位如下,即工程里面引用的jar可能有错,可能是路劲变了....
- 修改docker默认172.17网段
docker启动时默认使用172.17.x.x作为容器的ip地址,可以通过以下方法自定义该网段: sudo service docker stop通过命令route -n查看docker0是否存在,若 ...
- Dell服务器MegaCli命令只返回Exit Code: 0x00问题分析
今天同事给我说一台dell的服务器做了raid后,使用MegaCli看不到raid信息,上去看了一下确实不返回任何raid信息,但是确实机器上做了raid. 这就奇怪了,然后把MegaCli升级到最新 ...
- 段落排版--对齐(text-aliagn)
想为块状元素中的文本.图片设置居中样式吗?可以使用text-align样式代码,如下代码可实现文本居中显示.(那么什么是块状元素呢?后面会讲到呢~) h1{ text-align:center; } ...
- 初识sass框架
编写过页面的开发者都知道css这个东西,究其原意,也就是层叠样式表,我们页面的三大结构,html css javascript,其中html负责主要的页面结构,css就负责主要的页面样式,而我们的js ...