今天实现的内容:
跳跃信号
要实现跳跃,首先要实现跳跃的输入。跳跃信号是按下的当场触发的一次性触发控制(Trigger Once Signal)。
public class PlayerInput : MonoBehaviour
{
...
// 一次性信号
public bool jump; //跳跃信号
public bool lastJump; //记录上一次的jump信号 用于和当前jump信号做比对 理解为是否正在跳跃
...
// Update is called once per frame
void Update()
{
...
// 获取跳跃键输入
bool newJump = Input.GetKey(keyJump);
// 这样只有当按下跳跃键时jump会被设置为true 等同于GetKeyDown
if (newJump != lastJump && newJump)
{
jump = true;
}
else
{
jump = false;
}
lastJump = newJump;
}
}
以上代码如果图便宜可以直接采用GetKeyDown来省略if判断。if判断的功能就是让jump只有在按下跳跃键的时候(不是按住,也不是松开)才为true。
跳跃动画的应用
动画机配置很简单,新增trigger参数jump来作为跳跃条件。
动画触发目前也很简单。
// 跳跃动画
if(pi.jump) anim.SetTrigger("jump");
跳跃时锁死Input
为了让跳跃时不能再控制角色旋转,我们需要将Input在跳跃时锁死。好在之前我们就已经实现了输入模块的软开关(详见:魂类游戏的玩家输入模块)。现在的问题就是何时开关输入模块,我们将使用动画状态机StateMachineBehaviour脚本来实现控制。关于StateMachineBehaviour脚本可以往下翻到 值得注意的 部分,里面有讲到。通过下图展示的办法添加一个StateMachineBehaviour脚本。
以下是FSMOnEnter 的代码,作用是通过重载OnStateEnter,在动画状态机执行到挂载该脚本的动画状态时向父物体及自身的所有MonoBehavior发送消息调用名叫msg的方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 使用SendMessage来在OnStateEnter时调用animator.gameObject上的其它方法
public class FSMOnEnter : StateMachineBehaviour
{