现在网上虽然讲解Unity3D动画的文章不少,但是却少很少带实际例子的。刚好我之前给美术做了个简单的例子,所以整理一下就共享给大家了。主要是做了两种动画,分别有例子,按空格可以改变动画。具体的制作过程不会非常详细(写的过程中,Generic被我写得有点详细了:),这里假设大家都是有一定的编程或者Unity基础的。
一、基础
- Unity3D 5.3.5可编译运行
- 脚本采用C#脚本编写
- 模型是FBX模型文件
- 运行结果图
性子急的或者有基础可以直接下载源码进行研究
二、Generic动画
Generic是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。
1. 设置资源格式
选中Generic_Animation资源,在显示面板那里 Rig选择Generic
2. 创建AnimatorController
最后命名为GenericController放在Anim文件夹下面
在Swordman的目录下,选择Generic_Animation,然后把里面自己需要用到的动作添加到控制器去
先拖一个Idle进去,再拖Run进来,如下图
3. 关联Idle和Run动作
需要给这两个动作设置相关参数,方便我们程序调用
在Idle上右键- — 选择 Make Transition,然后控制鼠标箭头连到Run
同样的Run也关联到Idle
4. 增加动作之间的状态
动作配置好了之后,我们就要动作设置状态了,这里我们简单设置,增加一个布尔值 Move来表示移动和停止。
那么Move为true的时候,表示需要移动了,则是从Idle切换到Run,false则是从Run切换到Idle
首先在Animator的paramer那里增加一个布尔的Move参数(没有之前是 list is Empty)
点击旁边的+号,然后选择Bool类型,最后命名为Move
5. 设置动作之间的状态
选中Idle到Run的箭头,然后在旁边设置move属性为true
Run到Idle的箭头,设置Move属性为false
6. 添加人物模型
前面的基础动作配置好了,那么就在场景中增加模型吧
首先把Swordman_No_Animation拖放到舞台,然后命名为GenericAnimation
刚拖进入是背面的,那么设置一下Y-180。
把Unity自带的Animation给删除掉(这个其实就是Legacy动画要用到了,后面再讲)
然后给增加一个Animator组建,在Add Component那里搜索Animator,然后点击添加进去
、
同时给这个组件设置相关参数了。
Controller和Avatar分别给添加上,点击那个小圆圈会出现选项了。最后添加GenericAnimMgr脚本。
到这里,暂时需要直接在Unity设置的东西就差不多了,那么开始写C#脚本了
7. C#控制脚本
脚本比较简单,主要是通过Animator 组件来数值Move的true和false
using UnityEngine;
using System.Collections;
/// <summary>
/// 使用Animator控制角色动作的例子
/// </summary>
public class GenericAnimMgr : MonoBehaviour
{
private Animator animator;
private bool isRun;
// Use this for initialization
void Start ()
{
animator = this.GetComponent<Animator>();
//默认播放 idle
animator.SetBool("Move", false);
}
// Update is called once per frame
void Update ()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (isRun)
//平滑切换
animator.SetBool("Move", false);
else
animator.SetBool("Move", true);
isRun = !isRun;
}
}
}
三、Legacy动画
legacy是老的动画系统,不多说。在引入Mecanim之前,Unity使用了自己的动画系统以便向后兼容,此系统仍然可用。 使用旧版动画系统主要是为了方便继续开发没有使用新Mecanim系统的项目。 然而,不推荐再在新项目中使用旧版动画系统。
1. 添加模型
步骤和Generic一样,把Swordman_No_Animation拖放到舞台,然后命名为LegacyAnimation
2.添加动作
直接在Animation组件里进行添加,不需要额外的其他控制器制作
Animation属性,是默认出现的动作,这里选择Idle
Animations表示这个模型有多少动作,这里选择2,同时增加Idle和Run
3.添加LegacyAnimMgr脚本
最后如何图
4. C#脚本
using System;
using UnityEngine;
using System.Collections;
/// <summary>
/// 动画控制器(基于Legacy的动画类型)
/// by sodaChen
/// </summary>
public class LegacyAnimMgr : MonoBehaviour
{
/** 动画控制器 **/
private Animation anim;
private bool isRun;
void Start ()
{
//获取到动画组件
anim = this.GetComponent<Animation>();
//默认播放站立动作(如果组件有配置,这里则可以不用写)
//anim.Play("Sword-Idle");
}
// Update is called once per frame
void Update ()
{
//通过不同的键盘控制来播放指定的动画
if (Input.GetKeyDown(KeyCode.Space))
{
if (isRun)
anim.CrossFade("Sword-Idle");
else
//角色跑起来
anim.Play("Sword-Run");
isRun = !isRun;
}
if (Input.GetKeyDown(KeyCode.LeftAlt))
{
//渐变到站立动作,有个缓冲动作。具体看API描述作用
anim.CrossFade("Sword-Idle");
//直接切换站立动作
//anim.Play("Sword-Idle");
}
}
}
四、总结
Unity做动画还是比较简单的,其实还有Humanoid动画,就是新的人形重定向动画系统。不过这里的制作还是比较依赖Unity,小游戏之类的,动画模型不多,还可以人力去做,去设置之间的关系。在实际开发手游项目过程,我们会采用一些脚本自动打包这些模型动作,以及自动绑定相关的脚本,这样维护性就高很多了。