首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)
2014
06-22

Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)

以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine。用Machine动画的时候需要创建一个AnimatorController这个文件,需要手动的把动画绑上去,我觉得这东西绝对不能手动绑上去,手动操作很容易出错,而且假如你已经做好了300个模型 动画。 策划第二天给你说 我们要给每个模型加一个动画,难道还要手动绑吗??必须脚本自动化!!!

1、Machine的优点我就不累赘了网上现在已经一大堆了。

2、Prefab自动化生成的方法我也不累赘了,如果模型的Prefab你还在手动做的话我建议你一定要换成自动生成的方法。尽量让美术不要碰U3D,只让美术出原始模型、贴图、动作、策划提供一个表格来描述 每个Prefab是由那些模型、动画、贴图组成,程序自动生成Prefab。

上代码

 在导航菜单里点击Test按钮,你的AnimatorController文件就创建好了。

接下来就是生成Prefab ,你可以根据美术提供的描述文件,来生成Prefab,生成的时候把我们创建的AnimatorController绑到生成的Prefab上面。

我觉得用Machine动画最好的一点就是可以多个模型的骨骼可以并用,这样的话可以减少包的大小。但是我个人觉得既然骨骼重用,那么肯定是行为比较相似的模型的可以重用,一些比较有个性的模型恐怕也不能重用。如果要用machine动画我觉得策划和美术就需要在这里考虑了,把模型分好类分好哪一类模型重用一套骨骼。(如果你有更好的经验请在下面留言,谢谢)

OK如下图所示,动画的结构我已经生成出来了。

 Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一) - 雨松MOMO程序研究院 - 1

最后给你的Prefab绑定上如下测试代码,如果你现在还在用老版本的动画,看到如下代码你应该觉得很亲切,因为很像没啥区别。。

 OK,按下不同的按钮控制动画的播放。由于我的例子里面用的模型涉及到一些隐私,所以本文的工程我就不分享了,一共也没几行代码,大家照着打一遍估计就出来了。 有问题就在下面留言吧,也希望你提出你宝贵的看法。

 

8月26日补充,前几天有朋友问我如何在Unity2D上去生成AnimationController,3D的话因为动画文件是美术做好的,但是2D美术只会提供图片,所以动画也需要我们自动来生成。因为我一直没时间研究。后来他把自己的研究成果告诉了我,我就补充在博客里。

Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一) - 雨松MOMO程序研究院 - 2

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. momo知道怎么u5用代码添加animatorcontroller的layer并且赋予参数么?类似AnimatorControllerLayer layer=animatorController.AddLayer(“Left”);layer.blendingMode=AnimatorLayerBlendingMode.Override;这代码原来在4好使,到了5因为AddLayer的接口变了,返回值没有layer

  2. 你好,请问有没办法可以获取AnimatorController里面的所有parameters?,我在做一个通用的动画检查功能,目前是要一个一个值填进去,有没什么办法可以获取所有的parameters?

  3. //把state添加在layer里面
    UnityEditor.Animations.AnimatorStateTransition trans = sm.AddAnyStateTransition(state);
    明明是给动画状态添加过渡的, 怎么成了添加到layer里面? addState 才是给layer添加动画状态!
    虽然我是菜鸟,但是给我的误解有点大, 希望有人能指正

  4. using System.Collections;using UnityEditor;using UnityEditorInternal;public class DynamicCreateAnimatorController :Editor { [MenuItem(“Test/Test”)] static void DoCreateAnimationAssets() { //创建animationController文件,保存在Assets路径下 UnityEditor.Animations.AnimatorController animatorController = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(“Assets/animation.controller”); //得到它的Layer, 默认layer为base 你可以去拓展 UnityEditor.Animations.AnimatorControllerLayer layer = animatorController.layers[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, UnityEditor.Animations.AnimatorControllerLayer layer) { UnityEditor.Animations.AnimatorStateMachine sm = layer.stateMachine; //根据动画文件读取它的Motion对象 Motion motion = AssetDatabase.LoadAssetAtPath(path, typeof(Motion)) as Motion; UnityEditor.Animations.AnimatorState state = sm.AddState(motion.name); //取出动画名子 添加到state里面 state.motion=motion; //把state添加在layer里面 UnityEditor.Animations.AnimatorStateTransition trans = sm.AddAnyStateTransition(state); //把默认的时间条件删除 trans.hasExitTime=false; }5.x改了好多东西- -啊

  5. 请问一下 新的动画系统里 一个FBX文件里有几个动作Clip 向您在上面写得这样 AnimationClip newClip = AssetDatabase.LoadAssetAtPath(path, typeof(AnimationClip)) as AnimationClip; //取出动画名子 添加到state里面 State state = sm.AddState(newClip.name); 想把里面的某一个动作取出来 有什么好方法吗

  6. 其中有个问题,EditorCurveBinding 的propertyName 属性,为什么必须是”m_Sprite”?这是什么意思?而且最奇怪的居然是m_sprite这个奇怪的名字

  7. AnimatorController里动画引用改变了,AnimatorOverrideController引用AnimatorController,AnimatorController里的动画引用会变空,有什么更好的解决办法吗

  8. MOMO 你好! AnimatorOverrideController OverrideController;用这个控制器打包后 OverrideController[“walk”] = AnimationClip 这种是空呢?? 但是在Unity上运行就有值

  9. MOMO老师您好。“我试了它必须等上一个动画播放完毕后才能播放下一个条件开启的动画”,我试了一下这个Machine动画系统,好像不是这个样子。我测试的时候,发现只要两个动画状态之间的参数Parameters条件成立的时,会立即播放下一个动画状态的,不需要等等上一个动画播放完毕。我是初学Unity3D,不知道有没有理解错~~

    • 查看你两个动画间的转换条件,如果有Exit Time这一条,那就是得等播放到指定时间(默认是90%)后,并且满足其余条件,才会播放下一个动画~如果把这个条件删掉,就不需要等待时间,只要条件满足就会立刻切换~

  10. 想问下哪里有animator的圣典信息之类的下载,还有animator如果他的转换条件是bool之类的而不是时间的话动画衔接的部分是不能改的,比如idle状态一定要播了0.5秒后才能转入攻击状态,有没办法能改变动画衔接的时间??求解

  11. 您好,现在unity4.5里的animator里 在选择状态机的时候,他的属性栏里多了一个Mirror的开关选项。不知道这个怎么用。 还有现在的动画系统能做反运动么(就像是视频的倒播)?

  12. 多谢楼主分享,现在我已经能动态生成状态机了,但是只能直接在编辑器里运行,build成exe的时候会报错The type or namespace name `UnityEditorInternal’ could not be found. Are you missing a using directive or an assembly reference?请问如何破解?万谢。

      • 关键就在这里。获得和生成状态机需要用到UnityEditor和UnityEditorInternal,而这两个类(包)据说只能在unity编辑器里面使用。当我在编辑器里面运行游戏的时候是正常的,但是当我要把游戏build成exe的时候,就会报编辑错误了。所以想问大神怎么把这两个包带出去,或者使用其他类代替UnityEditor。

  13. 我们是人物模型只有一个 然后有多套武器 对应每种武器有一全套动作 所以 我想的是在换武器的时候 换成对应的AnimatorController 你的意思是 我把所有的AnimatorController都挂在模型prefab上吗 刚开始学 各种不懂啊

  14. 雨松MOMO 你好 按照你的方法 成功生成了AnimatorController 但是它只能手动制定 不能动态加载 好像因为它是编辑器类 查询发现AnimatorOverrideController可以动态加载 但是将AnimatorController拖到对应的AnimatorOverrideController上时 对应的动作还是需要一个一个拖拽上去 不知道这个能不能动态生成

  15. 我现在是有很多个模型,每个模型都只有一个不同的动画。怎么批量给模型里的( ).Controller 这个变量附值。 这个值就是模型拖进Unity后自带的Take001。(这个Take001在模型里处于子对象,我找不到。)foreach(GameObject g in Selection.gameObjects){g.GetComponent< Animator >(). Controller = ?}

  16. 哦,是挺好,不过我觉得这样好像也挺麻烦,还有不同的模型它们动画间的连线关系也不会一样的,难道全部都要做成这种从AnyState单向的关系吗

  17. 借个地方问一下,我想做个射箭的游戏,但是箭的移动姿态我不知道该怎么解决,现在我用2D贴图做,加了刚体之后箭只会水平下落,而不是箭头落地求教思路