现在网上虽然讲解Unity3D动画的文章不少,但是却少很少带实际例子的。刚好我之前给美术做了个简单的例子,所以整理一下就共享给大家了。主要是做了两种动画,分别有例子,按空格可以改变动画。具体的制作过程不会非常详细(写的过程中,Generic被我写得有点详细了:),这里假设大家都是有一定的编程或者Unity基础的。
一、基础
- Unity3D 5.3.5可编译运行
- 脚本采用C#脚本编写
- 模型是FBX模型文件
Image may be NSFW.
Clik here to view. - 运行结果图
Image may be NSFW.
Clik here to view. 性子急的或者有基础可以直接下载源码进行研究
二、Generic动画
Generic是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。
1. 设置资源格式
选中Generic_Animation资源,在显示面板那里 Rig选择Generic
Image may be NSFW.
Clik here to view.
2. 创建AnimatorController
Image may be NSFW.
Clik here to view.
最后命名为GenericController放在Anim文件夹下面
在Swordman的目录下,选择Generic_Animation,然后把里面自己需要用到的动作添加到控制器去
Image may be NSFW.
Clik here to view.
先拖一个Idle进去,再拖Run进来,如下图
Image may be NSFW.
Clik here to view.
3. 关联Idle和Run动作
需要给这两个动作设置相关参数,方便我们程序调用
Image may be NSFW.
Clik here to view.
在Idle上右键- — 选择 Make Transition,然后控制鼠标箭头连到Run
同样的Run也关联到Idle
Image may be NSFW.
Clik here to view.
4. 增加动作之间的状态
动作配置好了之后,我们就要动作设置状态了,这里我们简单设置,增加一个布尔值 Move来表示移动和停止。
那么Move为true的时候,表示需要移动了,则是从Idle切换到Run,false则是从Run切换到Idle
首先在Animator的paramer那里增加一个布尔的Move参数(没有之前是 list is Empty)
Image may be NSFW.
Clik here to view.
点击旁边的+号,然后选择Bool类型,最后命名为Move
Image may be NSFW.
Clik here to view.
5. 设置动作之间的状态
选中Idle到Run的箭头,然后在旁边设置move属性为true
Image may be NSFW.
Clik here to view.
Run到Idle的箭头,设置Move属性为false
Image may be NSFW.
Clik here to view.
6. 添加人物模型
前面的基础动作配置好了,那么就在场景中增加模型吧
首先把Swordman_No_Animation拖放到舞台,然后命名为GenericAnimation
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
刚拖进入是背面的,那么设置一下Y-180。
把Unity自带的Animation给删除掉(这个其实就是Legacy动画要用到了,后面再讲)
然后给增加一个Animator组建,在Add Component那里搜索Animator,然后点击添加进去
Image may be NSFW.
Clik here to view.、
同时给这个组件设置相关参数了。
Controller和Avatar分别给添加上,点击那个小圆圈会出现选项了。最后添加GenericAnimMgr脚本。
Image may be NSFW.
Clik here to view.
到这里,暂时需要直接在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脚本
最后如何图
Image may be NSFW.
Clik here to view.
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,小游戏之类的,动画模型不多,还可以人力去做,去设置之间的关系。在实际开发手游项目过程,我们会采用一些脚本自动打包这些模型动作,以及自动绑定相关的脚本,这样维护性就高很多了。