2-4. 实现人物跳跃
InputAction 添加跳跃键
代码实现
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Scripting.APIUpdating;
public class PlayerController : MonoBehaviour
{
public PlayerInputControl inputControl;
private Rigidbody2D rb;
public Vector2 inputDirection;
[Header("基本参数")]
public float speed;
public float jumpForce;
private void Awake()
{
// 获取 Player 上面的刚体组件
rb = GetComponent<Rigidbody2D>();
inputControl = new PlayerInputControl();
// 按下键盘上的空格键,或者手柄上的 EAST 键,就会触发 Jump 函数
inputControl.Gameplay.Jump.started += Jump;
}
private void OnEnable()
{
inputControl.Enable();
}
private void OnDisable()
{
inputControl.Disable();
}
private void Update()
{
inputDirection = inputControl.Gameplay.Move.ReadValue<Vector2>();
}
private void FixedUpdate()
{
// 在 FixedUpdate 里面对刚体进行操作
Move();
}
public void Move()
{
// 设置刚体的速度,这样刚体就能移动了
rb.velocity = new Vector2(inputDirection.x * speed, rb.velocity.y);
// 初始人物是面朝 x 轴正方向的
int faceDir = 0;
if (transform.localScale.x > 0)
{
faceDir = 1;
}
else if (transform.localScale.x < 0)
{
faceDir = -1;
}
// 输入是 x 轴正方向的时候面朝也是 x 轴正方向
// 输入是 x 轴负方向的时候面朝也是 x 轴负方向
if (inputDirection.x > 0)
{
faceDir = 1;
}
if (inputDirection.x < 0)
{
faceDir = -1;
}
// 人物翻转
transform.localScale = new Vector3(faceDir * Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
private void Jump(InputAction.CallbackContext context)
{
// Debug.Log("JUMP");
// 这里使用的是 ForceMode2D.Impulse,表示瞬间修改人物上方向的速度为 jumpForce 对应的数值
rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
}
}
我对参数的思考
我设定人物跑步的时候,最快速度是 5米/秒,垂直起跳的时候最高速度是 5米/秒,这样人物可以跳上1米高的平台,看起来更加符合现实,虽然游戏就是游戏,没必要按现实来