[魂类复刻学习日志]4.跳跃动作完全
提要
- 在之前加入的跳跃动画中,有太多的问题需要去解决,本节将着重于解决跳跃动画的各方面问题
扩展·有限状态机(FSM)
- 有限状态机(Finite - state machine, FSM),又称有限状态自动机,简称状态机。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
- 简单来说,我们在Animator组件中对状态的一系列切换,其实就是在编辑状态机,而我们将会在游戏中通过一些操作,传递给Animator或者其他组件一些字符/操作数,使其切换不同的状态
重置触发器·解决连续跳两次
- 为什么会出现该问题:Animator的Trigger型会因为连续的触发而进行累计,但是我们只能让它触发一次,因此我们需要在每次进入或退出ground状态时清楚掉这个触发
- 这次,我们在ground状态下增加新的脚本,重置触发器
public class FSMClearSignals : StateMachineBehaviour
{
public string[] clearAtEnter;
public string[] clearAtExit;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var signal in clearAtEnter)
{
animator.ResetTrigger(signal);
}
}
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var signal in clearAtExit)
{
animator.ResetTrigger(signal);
}
}
实现高度变化·真正的跳跃
- 思路:首先我们发现之前改变位移是利用刚体的位移(速度),而我们没有动y方向的量(一直是0向量),这一次我们将会为其增加一个Y方向的跳跃冲量,实现高度的变化。同时跳在空中要锁死输入,这样避免出现乱跳的情况
- 改写FixedUpdate()中的代码,记住每次还要清零
private void FixedUpdate()
{
rg.velocity = new Vector3(planarVec.x, rg.velocity.y, planarVec.z) + thrustVec;
thrustVec = Vector3.zero;
}
-
为了在每次触发跳跃时锁死输入并且赋值跳跃冲量,而跳跃完毕(进入ground状态时)时又打开输入接收
-
这里又需要注意,在jump状态添加的这两个状态改变的脚本需要分开!!!
-
向上发送信息(父对象的脚本会接受这个字符串并且调用对应的函数)
public class FSMOnEnter : StateMachineBehaviour
{
public string[] onEnterMessages;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach(var msg in onEnterMessages)
{
animator.gameObject.SendMessageUpwards(msg);//朝父对象发送信息
}
}
- 在ActorController中编写对应调用函数,注意除了锁输入,还有锁定当前平面的移动速度向量
public void OnJumpEnter()
{
pl.inputEnabled = false;//锁定输入
lockPlanar = true;
thrustVec = new Vector3(0,jumpVelocity,0) ;
}