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上做开发的时候,可能需要同时开 ...
随机推荐
- [Javascript] Using JSHint for Linting with Gulp
gulpfile.js var gulp = require('gulp'); var jshint = require('gulp-jshint'); var stylish = require(' ...
- [AngularJS + Webpack] Uglifying your JavaScript
Angular requires some careful consideration when uglifying your code because of how angular's depend ...
- QT GUI总结
QT提供了设计师工具,可以很方便的使用鼠标拖拽的方式绘制界面.绘制完毕后自动生成一个界面的.h文件(如ui_mainwindow.h),其中含有一个自动生成的Ui_MainWindow类,这个类中 ...
- react native mac install
Mac上使用react native tips: 1. 安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ ...
- VMware虚拟机中调整Linux分区大小——使用gparted
虚拟机分配了50G大小的空间,最近发现不够用,于是将扩展一下分区的大小,查了几种方法都不是很好,后来借助了gparted分区空间完成了,这个工具简单,方便,下面就简单的介绍一下.扩展分区主要要分为两步 ...
- nginx php7 配置 备用
yum install epel-* -y yum install -y wget unzip gcc gcc-c++ make zlib zlib-devel pcre pcre-devel lib ...
- Python之路【第十篇】:HTML -暂无等待更新
Python之路[第十篇]:HTML -暂无等待更新
- java构造函数也可以用private开头
private 构造函数一般用于Singleton模式,指的是整个应用只有本类的一个对象,一般这种类都有一个类似getInstance()的方法!下面是一个Singleton的例子:public cl ...
- document.documentElement.style判断浏览器是否支持Css3属性
1.document.documentElement.style 属性定义了当前浏览器支持的所有Css属性 包括带前缀的和不带前缀的 例如:animation,webkitAnimation,msAn ...
- Android开发文摘集合1
作者:张明云 原标题:Android 开发中,有哪些坑需要注意? 作者github主页:zmywly8866.github.io/ 在Android library中不能使用switch-case语句 ...