根据自己的情况 仿照 雨松MOMO 写了一个自动生成动画的脚本 原地址 http://www.xuanyusong.com/archives/3243

代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System;
using System.IO;
using UnityEditor.Animations;public enum Orientation
{Down = 1, RightDown, Right, RightUp, Up, LeftUp, Left, LeftDown
}public class BuildAnimation : Editor
{#region 常量#endregion#region 事件#endregion#region 字段private static string m_prefabPath = "Assets/Resources/Prefabs";private static string m_AnimationControllerPath = "Assets/AnimationController";private static string m_animationPath = "Assets/Animation";private static string m_rawImagePath = Application.dataPath + "/Raw";#endregion#region 属性#endregion#region 方法[MenuItem("Assets/BuildAnimation")]static void BuildAnimations() {DirectoryInfo raw = new DirectoryInfo(m_rawImagePath);foreach (DirectoryInfo directories in raw.GetDirectories()){List<AnimationClip> clips = new List<AnimationClip>();foreach (DirectoryInfo ActionList in directories.GetDirectories()){List<AnimationClip> clipList = BuildAnimationList(ActionList);foreach (AnimationClip clip in clipList){clips.Add(clip);}}AnimatorController controller = BuildAnimationController(clips, directories.Name);BuildPrefab(directories, controller);}}/// <summary>/// Build预设/// </summary>/// <param name="directories"></param>/// <param name="animatorController"></param>private static void BuildPrefab(DirectoryInfo directories, AnimatorController animatorController){FileInfo _image = directories.GetDirectories()[0].GetFiles("*.png")[0];GameObject _go = new GameObject();_go.name = directories.Name;SpriteRenderer _spriteRenderer = _go.AddComponent<SpriteRenderer>();_spriteRenderer.sprite = AssetDatabase.LoadAssetAtPath<Sprite>(DataPathToAssetPath(_image.FullName));Animator _animator = _go.AddComponent<Animator>();_animator.runtimeAnimatorController = animatorController;System.IO.Directory.CreateDirectory(m_prefabPath);PrefabUtility.CreatePrefab(m_prefabPath + "/" + _go.name + ".prefab", _go);DestroyImmediate(_go);}/// <summary>/// Build控制器/// </summary>/// <param name="clips"></param>/// <param name="name"></param>/// <returns></returns>private static AnimatorController BuildAnimationController(List<AnimationClip> clips, string name){//string _parentName = System.IO.Directory.GetParent(directories.FullName).Name;//创建文件夹System.IO.Directory.CreateDirectory(m_AnimationControllerPath);AnimatorController animatorController = AnimatorController.CreateAnimatorControllerAtPath(m_AnimationControllerPath + "/" + name + ".controller");AnimatorControllerLayer layer = animatorController.layers[0];AnimatorStateMachine sm = layer.stateMachine;foreach (AnimationClip newClip in clips){AnimatorState state = sm.AddState(newClip.name);state.motion = newClip;//设置默认状态if (state.name == "idle_Down"){sm.defaultState = state;}//_state.SetAnimationClip(newClip, _layer);//AnimatorStateTransition trans = sm.AddAnyStateTransition(_state);//trans.RemoveCondition(0);}AssetDatabase.SaveAssets();return animatorController;}/// <summary>/// build八个方向动画/// </summary>/// <param name="directories"></param>/// <returns></returns>private static List<AnimationClip> BuildAnimationList(DirectoryInfo directories){string _animationName = directories.Name;FileInfo[] _images = directories.GetFiles("*.png");//创建unit文件夹string _parentName = System.IO.Directory.GetParent(directories.FullName).Name;System.IO.Directory.CreateDirectory(m_animationPath + "/" + _parentName);Dictionary<int, List<FileInfo>> _Dic = new Dictionary<int, List<FileInfo>>();List<AnimationClip> _dicClips = new List<AnimationClip>();//创建方向文件夹for (int i = 1; i < 9; i++){string _enumName = EnumToString((Orientation)i);System.IO.Directory.CreateDirectory(m_animationPath + "/" + _parentName + "/" + _enumName);_Dic.Add(i, new List<FileInfo>());}for (int i = 0; i < _images.Length; i++){//获取无扩展名的文件名string _fileName = Path.GetFileNameWithoutExtension(_images[i].ToString());int initial = (int)(_fileName[0]);//根据首字母添加// Debug.Log(_fileName[0]);// Debug.Log(initial);_Dic[initial - 48].Add(_images[i]);}foreach (int key in _Dic.Keys){AnimationClip _clip = new AnimationClip();_clip = BuildAnimationClip(_Dic[key]);//动画循环if (_animationName.IndexOf("idle") >= 0){//设置idle文件为循环动画SerializedObject serializedClip = new SerializedObject(_clip);AnimationClipSetting clipSettings = new AnimationClipSetting(serializedClip.FindProperty("m_AnimationClipSettings"));clipSettings.loopTime = true;serializedClip.ApplyModifiedProperties();}string _enumName = EnumToString((Orientation)key);System.IO.Directory.CreateDirectory(m_animationPath + "/" + _parentName + "/" + _enumName);AssetDatabase.CreateAsset(_clip, m_animationPath + "/" + _parentName+ "/" + _enumName + "/" + _animationName + "_" + _enumName + ".anim");_dicClips.Add(_clip);}return _dicClips;}static string EnumToString(Orientation ori){return Enum.GetName(typeof(Orientation), ori);}/// <summary>/// Build动画/// </summary>/// <param name="fi"></param>/// <returns></returns>static AnimationClip BuildAnimationClip(List<FileInfo> fi) {AnimationClip _clipTemp = new AnimationClip();_clipTemp.frameRate = 30;//AnimationUtility.SetAnimationType(_clipTemp, ModelImporterAnimationType.Generic);EditorCurveBinding _curveBinding = new EditorCurveBinding();_curveBinding.type = typeof(SpriteRenderer);_curveBinding.path = "";_curveBinding.propertyName = "m_Sprite";ObjectReferenceKeyframe[] _keyFrames = new ObjectReferenceKeyframe[fi.Count];float _frameTime = 1 / 10f;for (int i = 0; i < _keyFrames.Length; i++){Sprite _sprite = AssetDatabase.LoadAssetAtPath<Sprite>(DataPathToAssetPath(fi[i].FullName));//过时 Resources.LoadAssetAtPath<Sprite>(DataPathToAssetPath(_images[i].FullName));_keyFrames[i] = new ObjectReferenceKeyframe();_keyFrames[i].time = _frameTime * i;_keyFrames[i].value = _sprite;}AnimationUtility.SetObjectReferenceCurve(_clipTemp, _curveBinding, _keyFrames);AssetDatabase.SaveAssets();return _clipTemp;}private static string DataPathToAssetPath(string path){if (Application.platform == RuntimePlatform.WindowsEditor){return path.Substring(path.IndexOf("Assets\\"));}else {return path.Substring(path.IndexOf("Assets/"));}}#endregion#region Unity回调#endregion#region 事件回调#endregion#region 帮助方法#endregion
}class AnimationClipSetting
{private SerializedProperty m_Property;private SerializedProperty Get(string property){return m_Property.FindPropertyRelative(property);}public AnimationClipSetting(SerializedProperty prop){this.m_Property = prop;}public float startTime {get { return Get("m_StartTime").floatValue; }set { Get("m_StartTime").floatValue = value; }}public float OrientationOffsetY {get { return Get("m_OrientationOffsetY").floatValue; }set { Get("m_OrientationOffsetY").floatValue = value; }}public float level {get { return Get("m_Level").floatValue; }set { Get("m_Level").floatValue = value; }}public float cycleOffset {get { return Get("m_CycleOffset").floatValue; }set { Get("m_CycleOffset").floatValue = value; }}public bool loopTime{get { return Get("m_LoopTime").boolValue; }set { Get("m_LoopTime").boolValue = value; }}public bool loopBlend {get { return Get("m_LoopBlend").boolValue; }set { Get("m_LoopBlend").boolValue = value; }}public bool loopBlendOrientation {get { return Get("m_LoopBlendOrientation").boolValue; }set { Get("m_LoopBlendOrientation").boolValue = value; }}public bool loopBlendPositionY {get { return Get("m_LoopBlendPositionY").boolValue; }set { Get("m_LoopBlendPositionY").boolValue = value; }}public bool loopBlendPositionXZ {get { return Get("m_LoopBlendPositionXZ").boolValue; }set { Get("m_LoopBlendPositionXZ").boolValue = value; }}public bool keepOriginalOrientation{get { return Get("m_KeepOriginalOrientation").boolValue; }set { Get("m_KeepOriginalOrientation").boolValue = value; }}public bool keepOriginalPositionY {get { return Get("m_KeepOriginalPositionY").boolValue; }set { Get("m_KeepOriginalPositionY").boolValue = value; }}public bool keepOriginalPositionXZ {get { return Get("m_KeepOriginalPositionXZ").boolValue; }set { Get("m_KeepOriginalPositionXZ").boolValue = value; }}public bool heightFromFeet {get { return Get("m_HeightFromFeet").boolValue; }set { Get("m_HeightFromFeet").boolValue = value; }}public bool mirror {get { return Get("m_Mirror").boolValue; }set { Get("m_Mirror").boolValue = value; }}
}

这样做有个问题,每一次点击BuildAnimation都会重新加载所有资源,如果数据量大的话,更新会很不方便。

有以下修改:

    [MenuItem("Assets/BuildAnimation")]static void BuildAnimations(){//选中的文件夹,不包括子文件夹UnityEngine.Object[] filter = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.TopLevel);//路径中包含"Raw" 或者选中的是"Raw"if (!AssetDatabase.GetAssetPath(filter[0]).Contains("Raw") || Path.GetFileNameWithoutExtension(AssetDatabase.GetAssetPath(filter[0])) == "Raw"){Debug.LogError("没有选中对的文件夹");return;}DirectoryInfo[] filterInfo = new DirectoryInfo[filter.Length];for (int i = 0; i < filter.Length; i++){filterInfo[i] = new DirectoryInfo(Application.dataPath.Substring(0,Application.dataPath.LastIndexOf("/")) + "/" + AssetDatabase.GetAssetPath(filter[i]));}foreach (DirectoryInfo directories in filterInfo){List<AnimationClip> clips = new List<AnimationClip>();foreach (DirectoryInfo ActionList in directories.GetDirectories()){List<AnimationClip> clipList = BuildAnimationList(ActionList);foreach (AnimationClip clip in clipList){clips.Add(clip);}}AnimatorController controller = BuildAnimationController(clips, directories.Name);BuildPrefab(directories, controller);}}

这样写,只会Build选中的文件夹。

[Unity编辑器] 根据图片自动生成动画相关推荐

  1. android生成大分辨率图片,自动生成Android不同分辨率下的图片

    转自: http://blog..net/offbye/article/details/50012605 Android屏幕分辨率适配的图标处理比较麻烦,让UI做不同尺寸的图片也挺浪费时间的,并且容易 ...

  2. jQuery图片自动轮转动画特效

    本例的功能是用jQuery图片自动轮转动画特效实现阿里巴巴首页图片动画效果. 所用到的图片截图: 从网上下载一个jQuery文件jquery.js: 具体HTML网页代码如下: <!DOCTYP ...

  3. 3d 自动生成物体_根据 2D 图片自动生成 3D 图书封面的牛逼工具

    小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天要给推荐一个小众但很实用的工具,毕竟要用这个工具,你要么是图书工作者,要么就得自己写过书. 它就是一款能够根据 2D 图片 ...

  4. 根据 2D 图片自动生成 3D 图书封面的牛逼工具

    大家好,我是你们的小金子. 今天要给推荐一个小众但很实用的工具,毕竟要用这个工具,你要么是图书工作者,要么就得自己写过书. 它就是一款能够根据 2D 图片自动生成 3D 图书封面的工具,完全使用 CS ...

  5. WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)

    WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能. 下面仅需两段函数代码即可彻底禁用该功能. ...

  6. 纯css 图片自动旋转动画

    css能否实现图片自动旋转动画呢?答案当然是肯定的, 首先看下效果: HTML代码 <img src="https://gimg2.baidu.com/image_search/src ...

  7. adobe xd导出html,Adobe XD2018年10月更新,自动生成动画、导出到 After Effects等功能...

    Adobe XD 是一款超前且免费的用户体验设计工具,可以轻松完成网站.移动应用程序.语音交互.触摸屏等内容的设计和原型创建,目前保持每月更新一次的节奏,10月的今天,在Adobe MAX 2018到 ...

  8. 语音识别插件_2D动画唇动合成,根据语音自动生成动画人物口型

    蕾师师 发自 凹非寺 量子位 报道 | 公众号 QbitAI 只需要输入一段语音,代码会自动生成与之相对的动画唇形. 还是毫无违和感的那种. 这是一个在GitHub上拥有501星的开源项目,叫做Rhu ...

  9. 2D动画唇动合成,根据语音自动生成动画人物口型

    蕾师师 发自 凹非寺 量子位 报道 | 公众号 QbitAI 只需要输入一段语音,代码会自动生成与之相对的动画唇形. 还是毫无违和感的那种. 这是一个在GitHub上拥有501星的开源项目,叫做Rhu ...

最新文章

  1. Self-reflection for career
  2. 方向梯度直方图(Histogram Of Gradient)详解
  3. mongodb ttl java,在mongoDB集合上设置ttl-是在应用程序中还是在shell中?
  4. 4.2Python数据类型(2)之布尔类型
  5. 动态规划-最长不下降子序列
  6. .Top域名:新顶级域名还原互联网安全发展
  7. 菜鸟程序猿的工作心态
  8. 传智播客java课程表,先睹为快
  9. 介绍一下小规模纳税人如何开具增值税专用发票的流程
  10. 简述u盘安装计算机系统的方法,电脑系统安装常见的两种方式(U盘)
  11. 使用fiddler绕过“请在微信客户端打开链接”
  12. 网易云音乐基于用户的推荐系统
  13. html+css 炫彩流光按钮
  14. 最新苹果同步器技术-手机群控操作-脚本录制分屏控制-实时同步操作一系列APP功能解析分享
  15. linux下学习db2
  16. tomcat错误“Attribute value is quoted with which must be escaped when used within the value”
  17. [MAC各类右键菜单修改]Automator WorkFlow: 扩展右键菜单
  18. 搜索优化—如何在Google搜索引擎上排名靠前Google左侧排名
  19. html菜鸟教程 动态天气,Blinker 天气时钟8266 12864LCD屏(针对新版库v0.3.4接口更新)...
  20. USB -- BULK_ONLY和UFI协议

热门文章

  1. Elixir-Pattern matching
  2. RabbitMQ流量削峰应用
  3. 两条边延长角会有什么变化_用图中这种测量工具可以量出图中零件上ab cd这两条轮廓线的延长线所成的角你能说出其中的道理吗...
  4. 云小朵软件内测分发测试平台说明文档
  5. 2015-8-29阿里校园招聘研发project师笔试题
  6. 机器学习(一)——随机游走
  7. 基于ICSharpCode.SharpZipLib组件的打包压缩目录的方法
  8. 同样是倒排索引,Elasticsearch为何如此优秀?
  9. Python-docx:读写word文档的Python库
  10. 登录密码显示服务器错误是什么意思,密码和账号都没有错,为什么登教育人人通会显示服务器错误,我该怎么呢?...