Unity3D的Generic和Legacy动画例子(C#脚本)

现在网上虽然讲解Unity3D动画的文章不少,但是却少很少带实际例子的。刚好我之前给美术做了个简单的例子,所以整理一下就共享给大家了。主要是做了两种动画,分别有例子,按空格可以改变动画。具体的制作过程不会非常详细(写的过程中,Generic被我写得有点详细了:),这里假设大家都是有一定的编程或者Unity基础的。

一、基础

  1. Unity3D 5.3.5可编译运行
  2. 脚本采用C#脚本编写
  3. 模型是FBX模型文件
    这里写图片描述
  4. 运行结果图
    这里写图片描述
  5. 性子急的或者有基础可以直接下载源码进行研究

    Unity3D动画例子源码

二、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,小游戏之类的,动画模型不多,还可以人力去做,去设置之间的关系。在实际开发手游项目过程,我们会采用一些脚本自动打包这些模型动作,以及自动绑定相关的脚本,这样维护性就高很多了。