unity 动画系统简单教程

demo仓库

https://github.com/wyy5552/lifecycle

前言


unity动画根据使用方式划分,分为两种:一种是Animation,一种是Animator。其中Animation可以实现一些基本的动画操作,如果要制作复杂的,比如动画有各种状态切换,比如人型动画,则需要使用Animator。
当然,Animator需要通过控制Animation来实现状态管理。

一、简单动画Animation


我们来实现一个立方体在1s内运动的动画。场景创建一个立方体,打开Animation窗口,通过windows/windows/Animation打开。

image

不要直接点击Create按钮,如果点击后,则会通过Animator来管理。

选中立方体,在Inspector界面添加组件Animation,然后点击Animation窗口里面的Create按钮,会单独创建一个影片,保存。(记得场景树要选中需要被编辑的节点)

image

1. 手动设置关键帧

点击AddProperty,选择Position,默认会生成两个关键帧0s && 60s位置。默认0s处,选中60s处,设置位置。点击播放,则可以看到移动的动画。
image

2. 录制

点击红色按钮,开始录制。拖动游标到动画结束的时间,设置结束时候的位置。

image

二、新版动画

我们需要一个角色模型来介绍。并不是说只能用来控制角色,而是因为角色控制相对繁琐,可以展示更多的Animator功能。

1. 导入模型

我们拷贝.fbx 模型到assets目录。设置好材质。点击fbx模型,在Inspector里面选择Animation,将动画根据类型进行划分。我们分割出来5个动画:站立(idle),死亡(die),重生(reborn),跑步(run),射击(fire)。

image

2. 设置状态机

将模型拖入场景,创建Animator Controller,拖入到节点的组件上。

image

双击创建的控制器组件,进入状态机编辑。展开模型,拖动idle动画到animator面板,默认会创建一个状态转移,从Entryidle。点击播放按钮,场景角色循环播放待机状态。默认也有一个Base Layer的层。

image

我们继续完善状态机。然后编写脚本,实现:场景初始状态角色待机,1s后进入射击状态,当射击结束后,返回待机状态。

image

public class PlayerFsm : MonoBehaviour
{
    public Animator ani;

    void Start()
    {
        this.Invoke("changeState", 1);
    }

    void changeState()
    {
        ani.SetInteger("player_state", (int)Player_State_Trans.ToFire);
    }
    // Update is called once per frame
    void Update()
    {
        AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
        if(info.normalizedTime>=1.0f && info.IsName(Player_State.fire))
        {
            Debug.Log(info.normalizedTime);
            ani.SetInteger("player_state", (int)Player_State_Trans.ToIdle);
        }
    }
}

添加脚本到角色节点身上。点击播放,则角色按照我们的预期执行。

注意 transition上面的has exit time参数,如果勾选,则在状态转换的时候会增加一个延迟时间。

3. blendTree

如果我们需要一个混合的状态,比如边跑边射击,则需要新增一个blend tree。编辑器窗口创建,双击进入编辑模式。选择节点,然后右键add motion,添加两个。将runfire拖入对应的框中。我们发现,在parameters里面多出一个参数blend,这个参数是用来设置混合位置的。我们可以拖动inspector里面的混合图来进行设置。脚本同普通参数。

image

我们可以测试一下效果。

4. layer

新建一个layer,我们拖一个fire上去,让其循环播放,方便观察。运行游戏。发现生成的效果与我们做的blend tree类似。
BaseLayer默认run,New Layer默认fire

image

5. Avatar Mask

我们发现,通过上面的设置,一边跑动,一边射击,模型状态非常不自然。是因为射击的时候,脚的运动是跑动,受到射击的影响。
此时有个问题,如果直接导入模型,并没有人型状态。需要我们设置一下模型。

image

新建一个avatar mask,添加给New Layer


image

双击mask文件,进入编辑。绿色身体表示当前层级能够影响。点击任意部位,红色表示不影响当前部位。

image

观察新的动画样式,边跑边射击看起来就非常自然了。

image

6. 脚本

点击Layer,点击Add behaviour,可以新增 状态机的脚本。也可以点击状态,同样有Add behaviour按钮。两者生命周期有些区别。注意区分。

后记

通过层层尝试,我们大致了解了unity动画系统的使用。当然,真实做项目的时候复杂程度要远远高于本Demo

参考列表:
unity】角色动画的 Has Exit Time是什么?什么时候需要打钩?
https://blog.csdn.net/weixin_37749732/article/details/121979165
Unity Animator Layer动画分层
https://www.jianshu.com/p/9a90496764b6
unity Animator 怎么判断一个动画播放结束
https://blog.csdn.net/tomato00001/article/details/78427538
Unity动画系统详解3:如何播放、切换动画?
https://blog.csdn.net/zhenghongzhi6/article/details/106459895
Unity 动画系统 Animation 和 Animator 联系与区别
https://www.cnblogs.com/01zxs/p/9965115.html

posted on 2022-04-19 20:18  老豆浆  阅读(1216)  评论(0编辑  收藏  举报

导航