Unity3D研究院之Machine动画脚本自动生成AnimatorController
原地址:
http://www.xuanyusong.com/archives/2811
以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine。用Machine动画的时候需要创建一个AnimatorController这个文件,需要手动的把动画绑上去,我觉得这东西绝对不能手动绑上去,手动操作很容易出错,而且假如你已经做好了300个模型 动画。 策划第二天给你说 我们要给每个模型加一个动画,难道还要手动绑吗??必须脚本自动化!!!
1、Machine的优点我就不累赘了网上现在已经一大堆了。
2、Prefab自动化生成的方法我也不累赘了,如果模型的Prefab你还在手动做的话我建议你一定要换成自动生成的方法。尽量让美术不要碰U3D,只让美术出原始模型、贴图、动作、策划提供一个表格来描述 每个Prefab是由那些模型、动画、贴图组成,程序自动生成Prefab。
上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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里面
sm.AddAnyStateTransition(state);
}
}
|
在导航菜单里点击Test按钮,你的AnimatorController文件就创建好了。
接下来就是生成Prefab ,你可以根据美术提供的描述文件,来生成Prefab,生成的时候把我们创建的AnimatorController绑到生成的Prefab上面。
我觉得用Machine动画最好的一点就是可以多个模型的骨骼可以并用,这样的话可以减少包的大小。但是我个人觉得既然骨骼重用,那么肯定是行为比较相似的模型的可以重用,一些比较有个性的模型恐怕也不能重用。如果要用machine动画我觉得策划和美术就需要在这里考虑了,把模型分好类分好哪一类模型重用一套骨骼。(如果你有更好的经验请在下面留言,谢谢)
OK如下图所示,动画的结构我已经生成出来了。
文档上写的是用参数Parameters来控制动画的播放条件,我试了它必须等上一个动画播放完毕后才能播放下一个条件开启的动画,然而游戏里面我们需要的是立即播放,比如玩家正处于行走中按下某个键,必须是立即播放才行。所以我就没有用它提供的参数,而使用Animator.Play()直接播放。
最后给你的Prefab绑定上如下测试代码,如果你现在还在用老版本的动画,看到如下代码你应该觉得很亲切,因为很像没啥区别。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
Animator animator ;
void Start ()
{
animator = GetComponent<Animator>();
}
void OnGUI()
{
if(GUILayout.Button("attack"))
{
animator.Play("attack");
}
if(GUILayout.Button("Run"))
{
animator.Play("Run");
}
}
}
|
OK,按下不同的按钮控制动画的播放。由于我的例子里面用的模型涉及到一些隐私,所以本文的工程我就不分享了,一共也没几行代码,大家照着打一遍估计就出来了。 有问题就在下面留言吧,也希望你提出你宝贵的看法。
Unity3D研究院之Machine动画脚本自动生成AnimatorController的更多相关文章
- Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)
以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine.用Machine动画的时候需要创建一个A ...
- Unity自动生成AnimatorController
上一篇写了如何自动切割动画,这一篇写如何自动生成AnimatorController. 之前网上查了很多资料,看的一直很蒙,看不懂是怎么回事的,这里我先给大家明确几个概念: 画的不好,大家将就着看,写 ...
- 转 [教程] Unity3D中角色的动画脚本的编写(二)
在上一篇,我们介绍了有关Animation这个类中的部分方法,我后来想了想,这么介绍也不是个办法(其实有些方法我自己也没用过),该介绍点实际的东西了,毕竟我们是要做东西出来的.那好 ...
- Unity3D读取模型文件自动生成AnimatorController简单实例
前几天接到一个任务,做一个导入.控制模型动画的工具类,没有太具体的要求,于是就自行思考实际需求,最终根据宣雨松老师的一篇博客,自己规范了一下写了一个工具类.相关工具代码及测试用例已上传至Github. ...
- (转)Unity3D研究院之游戏架构脚本该如何来写(三十九)
这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏 ...
- 【原创】使用批处理脚本自动生成并上传NuGet包
Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...
- Fitnesse测试用例脚本自动生成设计
Fitnesse是通过wiki形式来展示.管理和执行测试用例,若要在Fitnesse上设计测试用例,前提是必须熟悉一定的wiki语法,虽然wiki语法简单,但是若要设计成百上千的测试用例还是有很大的工 ...
- odoo14开发之脚本自动生成代码
通过解析excel,自动生成odoo代码实现 一.首先做一个字段配置的excel模板 第二步.读取excel里面的模板,并写入到txt文件里 逻辑代码: # -*- coding: utf-8 -*- ...
- (转) [教程] Unity3D中角色的动画脚本的编写(一)
ps: 这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲解的很详细. 已有好些天没写什么了,今天想起来该写点东西了.这次我所介绍的内容 ...
随机推荐
- VC中调用COM组件的方法(转载)
原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...
- PowerDesigner提示This data item is already used in a primary identifier.的处理
原文链接: http://blog.csdn.net/lopper/article/details/5293545 今天同事在编制一个数据库脚本的时候,提示了This data item is alr ...
- highcharts实现统计图效果
highcharts实现统计图效果 ① 根据需求确定需要使用的案例图 把这个界面的html模板文件复制出来,放入./Application/Admin/View/User下改名为chart.html ...
- Android四大组件之一:BroadCastReceiver(广播接收者)
广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...
- mysql主从复制-linux版本
来自:http://www.osyunwei.com/archives/7269.html,改版 mysql主从复制本文采用的是centos6.5+mysql-5.6.23版本之前在 windows7 ...
- HIVE中join、semi join、outer join举例详解
转自 http://www.cnblogs.com/xd502djj/archive/2013/01/18/2866662.html 举例子: hive> select * from zz0; ...
- res/raw文件的存放和读取
通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐.图等资源),那么 ...
- Sublime Text 前端开发常用扩展插件推荐
Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...
- javascript和jquery 获取触发事件的元素
一个很简单的问题,却因为大意,经常忘了处理,导致程序运行出错. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- C# 实例化接口对象
在head first 设计模式中 用到了很多很多接口对象 首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入. 一.接口回调 这就是继承中的向上转型.父类 FL= ...