Unity3D 导入脚本のAnimation动画切割

原创文章如需转载请注明:转载自脱莫柔Unity3D学习之旅QQ群:【119706192】本文链接地址:Unity3D 导入脚本のAnimation动画切割

近期项目中为了缩减资源包,想把一个角色的所有动作全部放在原始模型模型中(后期证实,并无优化效果,,所以把动作文件和原始模型文件又拆分成了单独的文件)。

原始模型中有600多帧动作,需要手动设置AnimationClip的起始帧和结束帧还有是否循环,。每个模型30个动作,一共25个主角模型,想想都蛋疼。于是研究了下Unity的资源处理器(AssetPostprocessor)。

在导入模型之前(OnPreprocessModel)对动画进行切割。

首先导入脚本不可能智能到知道我们的某个动作的动作名、开始帧、结束帧和是否循环,这个时候就需要一个配置表。具体代码如下:using UnityEngine;using System.Collections;using System.Collections.Generic;public static class AnimationClipConfig{public static bool isInit = false;public static List<modelST> modelList = new List<modelST>();public static void init(){if (isInit)return;isInit = true;modelST tempModel = new modelST();tempModel.ModelName = "id_3000";//模型名字tempModel.clipSTs = new clipST[]{new clipST("stand01" , 0, 60, true),new clipST("stand02" , 143, 193, true),new clipST("stand01_to_02" , 61, 100, false),new clipST("stand02_to_01" , 120, 142, false),new clipST("shouji01" , 101, 119, false),new clipST("run01" , 253, 275, true),new clipST("jump01" , 606, 626, false),new clipST("jump01_01" , 627, 645, false),new clipST("jump02" , 646, 663, false),new clipST("jump02_01" , 664, 686, false),new clipST("jump02_atk01" , 687, 714, false),new clipST("jump02_atk02" , 442, 456, false),new clipST("1atk01" , 275, 285, false),new clipST("1atk02" , 297, 317, false),new clipST("1atk03" , 329, 349, false),new clipST("1atk04_end" , 361, 381, false),new clipST("1atk01_01" , 286, 296, false),new clipST("1atk02_01" , 318, 328, false),new clipST("1atk03_01" , 350, 360, false),new clipST("2atk01" , 382, 392, false),new clipST("2atk02" , 404, 424, false),new clipST("2atk03" , 436, 456, false),new clipST("2atk04_end" , 468, 488, false),new clipST("2atk01_01" , 393, 403, false),new clipST("2atk02_01" , 425, 435, false),new clipST("2atk03_01" , 457, 467, false),new clipST("3atk01" , 489, 499, false),new clipST("3atk02" , 521, 541, false),new clipST("3atk03" , 553, 573, false),new clipST("3atk04_end" , 585, 605, false),new clipST("3atk01_01" , 500, 520, false),new clipST("3atk02_01" , 542, 552, false),new clipST("3atk03_01" , 574, 584, false),new clipST("xl_atk01_01" , 194, 252 , false),new clipST("xl_atk01_02" , 194, 252, true),new clipST("xl_atk01_03" , 194, 252, false),new clipST("dead01" , 715, 745, false),};modelList.Add(tempModel);}#region STpublic class clipST{public string name;public int firstFrame;public int lastFrame;public bool isloop;public clipST(string _n,int _f,int _l,bool _i) {name = _n;firstFrame = _f;lastFrame = _l;isloop = _i;}}public class modelST{public string ModelName;public clipST[] clipSTs;}#endregion}知道了数据,然后就是高端洋气的自动切割AnimationClip了。直接上代码:using UnityEditor;using UnityEngine;public class FBXAnimationsFix : AssetPostprocessor{public void OnPreprocessModel(){//当前正在导入的模型ModelImporter modelImporter = (ModelImporter) assetImporter;AnimationClipConfig.init();foreach (AnimationClipConfig.modelST item in AnimationClipConfig.modelList){//当前导入模型的路径包含我们modelST动作数据表中的模型名字,那就要对这个模型的动画进行切割if (assetPath.Contains(item.ModelName)){modelImporter.animationType = ModelImporterAnimationType.Legacy;//modelImporter.splitAnimations = true;modelImporter.generateAnimations = ModelImporterGenerateAnimations.GenerateAnimations;ModelImporterClipAnimation[] animations = new ModelImporterClipAnimation[item.clipSTs.Length];for (int i = 0; i < item.clipSTs.Length; i++){animations[i] = SetClipAnimation(item.clipSTs[i].name, item.clipSTs[i].firstFrame, item.clipSTs[i].lastFrame, item.clipSTs[i].isloop);}modelImporter.clipAnimations = animations;}}}}ModelImporterClipAnimation SetClipAnimation(string _name, int _first, int _last, bool _isLoop){ModelImporterClipAnimation tempClip = new ModelImporterClipAnimation();tempClip.name = _name;tempClip.firstFrame = _first;tempClip.lastFrame = _last;tempClip.loop = _isLoop;if (_isLoop)tempClip.wrapMode = WrapMode.Loop;elsetempClip.wrapMode = WrapMode.Default;return tempClip;}后来逐渐发现,讲所有动作合并到原始模型中并没有起到多少优化的作用,反而对维护增添了很多不必要的麻烦,后来又把动作切割开了。动作和原始模型分成单独文件后,每个动作文件导入unity时,还会“非常智能”的把关联的材质、贴图再创建一个.fbm的文件夹导入一遍,但是我们原始模型已经导入了一套材质和贴图,动作就没必要再带进来一堆。所以要对动作进行一个设置,让他们不关联材质。using System.Collections.Generic;using UnityEditor;using UnityEngine;public class FBXScaleFix : AssetPostprocessor{public void OnPreprocessModel(){ModelImporter modelImporter = (ModelImporter) assetImporter;if (assetPath.Contains("@")){modelImporter.importMaterials = false;}}}

可你仍然感谢天地和人世所带来的这些变化和发生。

Unity3D 导入脚本のAnimation动画切割

相关文章:

你感兴趣的文章:

标签云: