Unity动画☀️通过 StringToHash ,控制Animator
Posted 橙子SKODE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity动画☀️通过 StringToHash ,控制Animator相关的知识,希望对你有一定的参考价值。
大家好,我是SKODE。
小提示:选中左侧目录,可快速找到所需内容
本系列博客地址:传送门
一、本节效果展示
下面是本节要实现的目标:
- 完成场景的搭建
- 通过键盘,控制人物从静止状态,到走路,再到跑起来
- 讲述控制物体运动的两种方式
二、Unity基础配置
这儿我们完成资源的导入,并打开场景。
模型的下载
将package拖入Unity,完成导入package
双击,打开文件夹中的 Origin 场景即可。
下图所示Origin场景为初始场景,我们可以从这个场景开始做起。
AnimationDemo为已经实现所有功能的场景。
三、配置人物的Animator组件
下面我们完成将我们要控制的人物放置到场景中,
并对他身上的Animator进行配置,方便我们使用代码,控制Animator,从而控制这个人物做出各种动作。
1、将人物放置到场景
在 Project - Character 文件夹下,
将 DefaultAvatar 拖到层级面板 Hierarchy 即可
2、创建AnimatorController
作用:
AnimatorController中可包含很多 AnimationClip,
AnimationClip是一个个的动画片段,控制模型这样运动。AnimatorController就像一个容器。
AnimationClip可以是美术同学做的,也可以是我们程序自己在Unity中做的动画。
若你的要控制的对象身上的Animator组件中,Controller属性中没有AnimatorController,就需要完成下面的操作:
创建AnimatorController:
在Project面板,右键 Create,创建AnimatorController。
将AnimatorController绑定在人物身上
拖动该 AnimatorController ,放置到拖到层级面板人物的 Animator 上
3、配置AnimatorController
上面我们了解了,AnimatorController中有AnimationClip,
AnimationClip可由美术同学创建,也可由程序在Unity中创建。
下面我们使用的是美术同学做好的AnimationClip。
🎯添加AnimationClip
双击 上面创建的 AnimationController,进入AnimationController的面板。
将Project中 DefaultAvatar@Idle、DefaultAvatar@Walk、DefaultAvatar@Run三个动画下的 AnimationClip,都拖到 AnimationController 面板。
🎯设置切换AnimationClip的条件
unity播放Animator中的动画,有两种方式:
- 直接播放AnimationClip
- 通知Animator,告诉Animator可以切换到另一个AnimationClip
第二种方法和第一种方法相比,第二种方法动画会有融合,动画切换不生硬。
做游戏一般用第二种方法。
但我们要是做不那么需要柔和的效果(比如PLC),第一种方法足够了。
四、柔和控制Animator的方法
我们在Animator中设置参数,并设置动画片段切换的条件。
我们用代码改变这些参数,Animator就会自行完成动画片段的切换。
这样做两个Animation切换时会融合一部分,会使得动画切换更柔和。
🥎设置动画切换的连线
右键各个clip,Make Transition,完成下图所示连线
注意箭头方向。
比如Idle和Run的连线,箭头是指向Idle的,并且只有这一条线,没有从Idle指向Run的。
这意味着Run可以切换到Idle,Idle只能先切换到Walk,再切换到Run。
🥎设置动画切换的参数
如图所示,添加 float类型的 Speed 、bool 类型的 isSpeedup
这些参数下面我们会配置到上面的连线上。
动画只能满足了这些条件,才能切换。否则不能随意切换。
比如Idle到Walk,Speed的数值只有到0.5,才能切换到Walk。
🥎配置clip切换的条件
- 下方展示了Idle-Walk的切换条件,是Speed>0.1。Walk-Idle的切换条件,是Speed<0.1
- 配置 Walk-Run切换条件,是 isSpeedup为true。
- 配置 Run-Walk切换条件,是 isSpeedup为false。
- 取消所有连线的 Has Exit Time。若勾选,则意味着,只有当播放完该片段,才能切换到下一片段。而我们想立刻切换,当然要取消勾选。
🥎代码实现人物行走
创建如下脚本,挂载到层级面板的 DefaultAvatar 身上,运行游戏,按下W看看效果吧。
代码如下:
using UnityEngine;
public class Player : MonoBehaviour
Animator anim;
int speedID = Animator.StringToHash("Speed");
void Start()
anim = GetComponent<Animator>();
void Update()
anim.SetFloat(speedID, Input.GetAxis("Vertical"));
🥎代码实现人物奔跑
将上方创建的player脚本,改为如下内容,运行游戏,按下 Shift+W,看看效果吧。
using UnityEngine;
public class Player : MonoBehaviour
Animator anim;
int speedID = Animator.StringToHash("Speed");
int isSpeedupID = Animator.StringToHash("isSpeedup");
void Start()
anim = GetComponent<Animator>();
void Update()
anim.SetFloat(speedID, Input.GetAxis("Vertical"));
if (Input.GetKeyDown(KeyCode.LeftShift))
anim.SetBool(isSpeedupID, true);
if (Input.GetKeyUp(KeyCode.LeftShift))
anim.SetBool(isSpeedupID, false);
五、直接控制Animator的方法
这可用在不需要那么柔和显示动画效果上,
方法比 "四方法" 简单,容易操作。
当我们在Animator中配置好Animation后,Animator的配置部分就完成了。
不需要连线、设置参数什么的。
接下来只需要通过代码,就可以控制Animator了。
示例代码如下:
private void Start()
//Walk为你想播放的Animation动画名称
GetComponent<Animator>().Play("Walk");
好啦,通过上述操作,我们便完成了对物体动画的控制。
大家还有什么问题,欢迎在下方留言!
如果你有 技术的问题 或 项目开发
都可以添加下面的联系方式
和我聊一聊你的故事🧡
以上是关于Unity动画☀️通过 StringToHash ,控制Animator的主要内容,如果未能解决你的问题,请参考以下文章
100个 Unity实用技能☀️ | Unity 复用动画控制器 Animator Override Controller 的简单使用
100个 Unity实用技能☀️ | Unity 复用动画控制器 Animator Override Controller 的简单使用