Unity之选定模型文件夹进行动画切割

网上很多动画切割的都是在模型导入后进行的,需要额外的配置文件去处理动画的名字和切割的时间。个人嫌弃太麻烦,所以做成了可以导入之后再进行切割的编辑器脚本。

1.选定模型文件夹

通过选择包含fbx文件的文件夹去进行动画切割,而不是选择所有的fbx文件(有些fbx文件不在同一文件夹,甚至位置很难找)。

1.1
通过Selection.objects;得到选择的资源。
1.2
进行判断:如果是fbx则去切割动画;如果是文件夹则去搜索被其包含的fbx,再去切割动画。(其他类型不做处理)
搜索文件夹下fbx时,注意子文件夹下也要去所搜。
相关代码自行百度,很简单。

2.动画切割

https://blog.csdn.net/itsxwz/article/details/86495429
之前一篇博文有动画控制器中动画片段连线代码,在此不做讨论。
2.1
通过更改ModelImporterClipAnimation[]来达到切割动画的目的。
每一个ModelImporterClipAnimation都是可以进行设置的。

	private static ModelImporterClipAnimation SetClipAnimation(string name, int firstFrame, int lastFrame, bool isLoop) {
		ModelImporterClipAnimation animation = new ModelImporterClipAnimation();
		animation.name = name;
		animation.firstFrame = firstFrame;
		animation.lastFrame = lastFrame;
		animation.loop = isLoop;
		if (isLoop) {
			animation.wrapMode = WrapMode.Loop;
		}else if (!isLoop) {
			animation.wrapMode = WrapMode.Default;
		}

		return animation;
	}

所有的ModelImporterClipAnimation再赋值给ModelImporter的clipAnimations。
2.2
ModelImporterClipAnimation的名字自己取,是否循环可以bool控制,第一帧和最后一帧可以自己设置(只要在动画第一帧到最后一帧范围内即可)。

获取动画的总共帧数
		AnimationClip animationClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
		float frameRate = animationClip.frameRate;
		float time = animationClip.length;
		int frame = (int)(time * frameRate);
ps:path是该fbx资源所在的路径。多动画模型下的切割需要针对每一个动画进行处理,自行扩展,简单。

2.3
动画切割后,选择某一个fbx文件,在Inspector面板的Animation区域,发现clips属性下确实按照名字和帧数切分好了动画。但是展开fbx后,发现里面还是只有一个动画文件,动画控制器上也是没有相应的motion。

-> AssetDatabase.Refresh(); 没有用
-> 模型的Object序列化,再去SetDirty。 没有用

通过不断的F12找寻ModelImporter这个类的一些相关API,在其父类AssetImporter中发现了SaveAndReimport();这个方法,在2.2的赋值操作之后调用该方法即可,发现动画被按照代码预想的切割了!

ppps:我不断的寻找,解决问题的方法还是在源码里!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值