Animator实战演练:实现人物行走,攻击动画切换

举报
呆呆敲代码的小Y 发表于 2021/10/29 18:43:20 2021/10/29
【摘要】 💕Animator实战演练:实现人物行走,攻击动画切换下面我们开始进行Animator实例介绍:实现人物行走,攻击动画切换这个实例就不需要我们自己设计动画了(不是科班出身,设计的动画还丑,怕你们吐槽~)我们只需要将现成的动画使用脚本控制来实现目的!开始操作首先我们新建一个场景,导入一个模型站立的小猫咪,如下图:因为我导入的这个小猫咪的模型自带几种动画,所以我这里就不需要自己制作模型动画啦...

💕Animator实战演练:实现人物行走,攻击动画切换

  • 下面我们开始进行Animator实例介绍:实现人物行走,攻击动画切换
  • 这个实例就不需要我们自己设计动画了(不是科班出身,设计的动画还丑,怕你们吐槽~)
  • 我们只需要将现成的动画使用脚本控制来实现目的!

开始操作

  • 首先我们新建一个场景,导入一个模型站立的小猫咪,如下图:

在这里插入图片描述

  • 因为我导入的这个小猫咪的模型自带几种动画,所以我这里就不需要自己制作模型动画啦~
  • 一般也都是这样,我们只需要将这个动画在Animator Controller进行设计就好啦!

在这里插入图片描述

  • 在小猫咪模型身上添加一个Animator组件:Add Component -> Animator
    在这里插入图片描述

新建一个Animator Controller,上面已经讲过了,这里再发一次~
并将这个Controller拖到Animator组件中~
在这里插入图片描述

在这里插入图片描述

  • 双击打开Controller后,直接将动画从Project面板将动画片段拖动到这个Animator面板中即可

  • 然后将他们之间的动画过渡关系设置好

  • 如下图中,Aert为待机动画,Move为移动动画,ATK3为攻击动画

  • 左边是Animation Parameters(动画参数),上面提到过~
    CanMove是一个Bool值,用来控制执行移动动画
    Attack是一个Trigger值,用来控制执行攻击动画
    MovePlayerSpeed是一个Float值,用来控制移动动画的播放速度

在这里插入图片描述

  • 这里有需要注意的一个点,点击Move状态,然后将MovePlayerSpeed添加上,因为我们待会要通过这个改变移动动画的播放速度
    在这里插入图片描述

待机动画向移动动画过渡设置:

  • 点击下图中左边待机动画向移动动画过渡的箭头,在右边有个小加号,将我们的动画参数CanMove加上,选择True
    在这里插入图片描述

-反过来则是CanMove加上,但是数值变为False
在这里插入图片描述

待机动画向攻击动画过渡:

  • 点击左边动画 Aert -> ATK3 的箭头,然后点击右边的小加号,将Attack添加上
    在这里插入图片描述

移动动画向攻击动画过渡:

  • 点击左边动画 Move-> ATK3 的箭头,然后点击右边的小加号,将Attack添加上
    在这里插入图片描述

  • 但是到这里有的小伙伴可能就有些疑惑,为什么动画参数一个用Bool,一个用Trigger,还有一个用Float呢?

  • 这个呢,是根据具体情况而定的

  • 因为移动动画,使我们按下某个键后就一直执行的,所以用Bool值来进行移动的判定

  • 但是攻击动画呢,是你按下去一次就执行一次,显然Trigger更适合攻击动画

  • 使用float值呢是为了改变动画的播放速度,显然是一个数值,使用float是最好的选择啦!

这样的话在Unity视图方面就设置完成了,接下来就是写代码控制动画的播放
直接上代码挂在我们的小猫咪身上就行啦!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CatAnimation : MonoBehaviour
{
    [Header("移动速度")]
    public float MoveSpeed = 1f;
    [Header("旋转速度")]
    public float TurnSpeed = 5f;
    
    private Animator ani;
    private  float hor, ver;
    private void Awake()
    {
        ani = GetComponent<Animator>();
    }
    private void Update()
    {
        hor = Input.GetAxis("Horizontal");
        ver = Input.GetAxis("Vertical");
        if (hor !=0 || ver !=0)
        {
            ani.SetBool("CanMove",true);
        }
        else
        {
            ani.SetBool("CanMove",false);
        }
        //判断当前角色是否正在播放移动动画
        if (ani.GetCurrentAnimatorStateInfo(0).IsName("Move"))
        {
            //声明一个临时播放速度
            float sp = 0;

            if (ver >= 0)
            {
                if (Input.GetKey(KeyCode.LeftShift))
                {
                    sp = 2;
                }
                else
                {
                    sp = 1;
                }
            }
            else
            {
                if (Input.GetKey(KeyCode.LeftShift))
                {
                    sp = -2;
                }
                else
                {
                    sp = -1;
                }
            }
            //前后移动
            transform.position += ver* transform.forward * Time.deltaTime * MoveSpeed;
            ani.SetFloat("MovePlaySpeed",sp);
            transform.eulerAngles += transform.up * TurnSpeed * hor;
        }
        if (Input .GetKeyDown(KeyCode.J))
        {
            ani.SetTrigger("Attack");
        }
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            MoveSpeed *= 2;
        }
        if(Input.GetKeyUp(KeyCode.LeftShift))
        {
            MoveSpeed /= 2;
        }
    }
}

代码解析:

  • 代码中在Awake中拿到Animator组件,在Update中定义了一个简单的移动和旋转的方法

  • 然后通过判断 是否按下水平和垂直轴 来进行 是否播放移动动画的方法

  • 如果按下任意一个WASD或者上下左右键,调用ani.SetBool(“CanMove”,true);进行播放移动动画

  • 不然就执行ani.SetBool(“CanMove”,false);执行待机动画

  • 然后对当前是否进行播放移动动画进行了一个判断:if (ani.GetCurrentAnimatorStateInfo(0).IsName(“Move”))

  • 如果在播放移动动画,则按下Shift键时,对移动动画播放进行加速,并且加速小猫咪的移动速度,这样就可以让小猫咪的移动速度和动画播放速度更协调

  • 不然的话小猫咪普通移动时的动画播放加速移动时的动画播放就是一样的,显然不符合常理,之前所添加的MovePlayerSpeed属性就是为了如此!

  • 再就是按下J键的时候调用 ani.SetTrigger(“Attack”);进行攻击动画的播放~

上动图,看效果!
在这里插入图片描述

  • 到此为止一个简单的Animator使用就完成啦!
  • 我做的这个只是最简单的Animator使用方法,在真正的一个游戏里面,对动画这块的内容操作也是极其复杂
  • 本篇文章只是作为一个对Unity动画系统的基础入门介绍+使用
  • 想更深入动画系统还需要更多的时间进行研究!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。