以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine。用Machine动画的时候需要创建一个AnimatorController这个文件,需要手动的把动画绑上去,我觉得这东西绝对不能手动绑上去,手动操作很容易出错,而且假如你已经做好了300个模型 动画。 策划第二天给你说 我们要给每个模型加一个动画,难道还要手动绑吗??必须脚本自动化!!!
1、Machine的优点我就不累赘了网上现在已经一大堆了。
2、Prefab自动化生成的方法我也不累赘了,如果模型的Prefab你还在手动做的话我建议你一定要换成自动生成的方法。尽量让美术不要碰U3D,只让美术出原始模型、贴图、动作、策划提供一个表格来描述 每个Prefab是由那些模型、动画、贴图组成,程序自动生成Prefab。
上代码
using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditorInternal;
public class Test :Editor {
[MenuItem("Test/Test")]
static void DoCreateAnimationAssets()
{
//创建animationController文件,保存在Assets路径下
AnimatorController animatorController = AnimatorController.CreateAnimatorControllerAtPath("Assets/animation.controller");
//得到它的Layer, 默认layer为base 你可以去拓展
AnimatorControllerLayer layer = animatorController.GetLayer(0);
//把动画文件保存在我们创建的AnimationController中
AddStateTransition("Assets/Resources/airenlieren@Idle.FBX",layer);
AddStateTransition("Assets/Resources/attack@attack.FBX",layer);
AddStateTransition("Assets/Resources/aersasi@Run.FBX",layer);
}
private static void AddStateTransition(string path, AnimatorControllerLayer layer)
{
UnityEditorInternal.StateMachine sm = layer.stateMachine;
//根据动画文件读取它的AnimationClip对象
AnimationClip newClip = AssetDatabase.LoadAssetAtPath(path, typeof(AnimationClip)) as AnimationClip;
//取出动画名子 添加到state里面
State state = sm.AddState(newClip.name);
state.SetAnimationClip(newClip,layer);
//把state添加在layer里面
Transition trans = sm.AddAnyStateTransition(state);
//把默认的时间条件删除
trans.RemoveCondition(0);
}
}
在导航菜单里点击Test按钮,你的AnimatorController文件就创建好了。
接下来就是生成Prefab ,你可以根据美术提供的描述文件,来生成Prefab,生成的时候把我们创建的AnimatorController绑到生成的Prefab上面。
我觉得用Machine动画最好的一点就是可以多个模型的骨骼可以并用,这样的话可以减少包的大小。但是我个人觉得既然骨骼重用,那么肯定是行为比较相似的模型的可以重用,一些比较有个性的模型恐怕也不能重用。如果要用machine动画我觉得策划和美术就需要在这里考虑了,把模型分好类分好哪一类模型重用一套骨骼。(如果你有更好的经验请在下面留言,谢谢)
OK如下图所示,动画的结构我已经生成出来了。
最后给你的Prefab绑定上如下测试代码,如果你现在还在用老版本的动画,看到如下代码你应该觉得很亲切,因为很像没啥区别。。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
Animator animator ;
void Start ()
{
animator = GetComponent();
}
void OnGUI()
{
if(GUILayout.Button("attack"))
{
animator.Play("attack");
}
if(GUILayout.Button("Run"))
{
animator.Play("Run");
}
}
}
OK,按下不同的按钮控制动画的播放。由于我的例子里面用的模型涉及到一些隐私,所以本文的工程我就不分享了,一共也没几行代码,大家照着打一遍估计就出来了。 有问题就在下面留言吧,也希望你提出你宝贵的看法。
8月26日补充,前几天有朋友问我如何在Unity2D上去生成AnimationController,3D的话因为动画文件是美术做好的,但是2D美术只会提供图片,所以动画也需要我们自动来生成。因为我一直没时间研究。后来他把自己的研究成果告诉了我,我就补充在博客里。
- 本文固定链接: https://www.xuanyusong.com/archives/2811
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表


![[]GWSS19928W@3~YZE`WT)9](https://www.xuanyusong.com/wp-content/uploads/2014/06/GWSS19928W@3YZEWT9.jpg)
AnimatorController里动画引用改变了,AnimatorOverrideController引用AnimatorController,AnimatorController里的动画引用会变空,有什么更好的解决办法吗
你删错了,这条是发错的,删的那条才是正确的
好吧。我以为一样的。 准备有空研究一下呢。。。
MOMO 你好! AnimatorOverrideController OverrideController;用这个控制器打包后 OverrideController[“walk”] = AnimationClip 这种是空呢?? 但是在Unity上运行就有值
MOMO老师您好。“我试了它必须等上一个动画播放完毕后才能播放下一个条件开启的动画”,我试了一下这个Machine动画系统,好像不是这个样子。我测试的时候,发现只要两个动画状态之间的参数Parameters条件成立的时,会立即播放下一个动画状态的,不需要等等上一个动画播放完毕。我是初学Unity3D,不知道有没有理解错~~
查看你两个动画间的转换条件,如果有Exit Time这一条,那就是得等播放到指定时间(默认是90%)后,并且满足其余条件,才会播放下一个动画~如果把这个条件删掉,就不需要等待时间,只要条件满足就会立刻切换~
对, 但是这个条件会默认带上, 所以生成的animationController的时候可以把它删除。。
想问一下,是否可以动态的设置Animator中的某个动画为默认动画???
想问下哪里有animator的圣典信息之类的下载,还有animator如果他的转换条件是bool之类的而不是时间的话动画衔接的部分是不能改的,比如idle状态一定要播了0.5秒后才能转入攻击状态,有没办法能改变动画衔接的时间??求解
请问 动作位移怎么处理的?
有段时间没来了,没想到变化很大啊,这个网站有趣多了。
您好,现在unity4.5里的animator里 在选择状态机的时候,他的属性栏里多了一个Mirror的开关选项。不知道这个怎么用。 还有现在的动画系统能做反运动么(就像是视频的倒播)?
多谢楼主分享,现在我已经能动态生成状态机了,但是只能直接在编辑器里运行,build成exe的时候会报错The type or namespace name `UnityEditorInternal’ could not be found. Are you missing a using directive or an assembly reference?请问如何破解?万谢。
UnityEditorInternal 提示你少这个包。。
关键就在这里。获得和生成状态机需要用到UnityEditor和UnityEditorInternal,而这两个类(包)据说只能在unity编辑器里面使用。当我在编辑器里面运行游戏的时候是正常的,但是当我要把游戏build成exe的时候,就会报编辑错误了。所以想问大神怎么把这两个包带出去,或者使用其他类代替UnityEditor。
好吧。 带Editor的类 都是不能运行时使用的。。。
谢谢楼主回复。看来在游戏运行的时候自动根据生成状态机是不可行了。可在大型游戏里面一个player各种不同的技能我不能都在运行前就生成到一个controller上啊,animator真鸡肋。
4.5多了个AnimatorOverrideController,可以重写AnimatorController动画,可想而知你可以设置多套技能不是一件难事了
学到了。非常感谢。
我们是人物模型只有一个 然后有多套武器 对应每种武器有一全套动作 所以 我想的是在换武器的时候 换成对应的AnimatorController 你的意思是 我把所有的AnimatorController都挂在模型prefab上吗 刚开始学 各种不懂啊
雨松MOMO 你好 按照你的方法 成功生成了AnimatorController 但是它只能手动制定 不能动态加载 好像因为它是编辑器类 查询发现AnimatorOverrideController可以动态加载 但是将AnimatorController拖到对应的AnimatorOverrideController上时 对应的动作还是需要一个一个拖拽上去 不知道这个能不能动态生成
哦 , 我还有一个问题 怎么用 UIslider去控制一个模型动画的播放呢? 类似控制视频播放进度的滑条。
你好,你这个例子是给一个模型的多个动画批量。 我现在遇到的问题是有多个模型,每个模型一个动画怎么批量给所有模型配置动画呢
我现在是有很多个模型,每个模型都只有一个不同的动画。怎么批量给模型里的( ).Controller 这个变量附值。 这个值就是模型拖进Unity后自带的Take001。(这个Take001在模型里处于子对象,我找不到。)foreach(GameObject g in Selection.gameObjects){g.GetComponent< Animator >(). Controller = ?}
哦,是挺好,不过我觉得这样好像也挺麻烦,还有不同的模型它们动画间的连线关系也不会一样的,难道全部都要做成这种从AnyState单向的关系吗
请问,U3D 的 Humanoid动画系统可以做 武器脱手动作吗?
谢谢MOMO分享,脚本带走了哦。猛戳了几下广告
借个地方问一下,我想做个射箭的游戏,但是箭的移动姿态我不知道该怎么解决,现在我用2D贴图做,加了刚体之后箭只会水平下落,而不是箭头落地求教思路
Animator-mask-transform 下面的骨骼加载有全选功能吗?
Animator的动画能暂停么???