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动画系统的基础入门介绍+使用
- 想更深入动画系统还需要更多的时间进行研究!
- 点赞
- 收藏
- 关注作者
评论(0)