Unity 2D 平台跳跃问题

Unity 2D Platformer Jumping Issue

我可以使用 Axis.RawInput 让我的精灵跳跃。当 RawInput 大于 0 时,此输入还用作触发跳跃动画的参数。这个问题是当您释放键时,精灵会立即回落。如何在按下或按住按键时执行固定跳跃,然后让精灵以固定速率下降,同时触发动画?

这就是我现在的 PlayerMover 脚本中的内容。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMover : MonoBehaviour
{
    public Animator anim;
    public Vector3 velocity = Vector3.zero;
    public float runSpeed = 0f;
    public float jumpSpeed = 0f;
    private SpriteRenderer sp;
    public float maxJump = 4f;
   

    private void Awake()
    {
        sp = GetComponent<SpriteRenderer>(); 
    }

    void Update()
    {
        runSpeed = Input.GetAxisRaw("Horizontal");
        jumpSpeed = Input.GetAxisRaw("Vertical");
        anim.SetFloat("Jump", jumpSpeed); 
        anim.SetFloat("Speed", Mathf.Abs(runSpeed));

    }

    private void FixedUpdate()
    {
        Move(runSpeed, jumpSpeed*4);
    }

    void Move(float horizontal, float vertical)
    {
        if(horizontal > 0 || horizontal > 0 && vertical >0)
        {
            anim.SetBool("Idle", false);
            sp.flipX = false;
        }
        else if(horizontal < 0 || horizontal <0 && vertical >0)
        {
            anim.SetBool("Idle", false);
            sp.flipX = true;
        }
        else
            anim.SetBool("Idle", true);
        velocity.x = horizontal; 
        velocity.y = vertical;
        transform.position += velocity * Time.fixedDeltaTime; 
    }
}

我读过关于使用类似

的内容
if(Input.GetKeyDown(GetKeyCode("Space"){
    rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}

为了移动,但只要按下 Space 就允许额外的跳跃。

如果你想使用类似的东西:

if(Input.GetKeyDown(GetKeyCode("Space"))){
    rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}

但是当玩家已经在空中时需要阻止他们跳跃,只允许他们在已经在地板上时这样做。所以:

if(Input.GetKeyDown(GetKeyCode("Space")) && isOnFloor()){
    rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}

其中 isOnFloor() 是一些检查您的角色是否在地板上的函数。根据您的游戏实现,这可以通过多种方式完成,但最常见的一种是检查玩家角色是否与任何东西发生碰撞,如果是,则该碰撞对象是否在他们下方。 This stackexchange thread 提供了一些代码示例来说明如何实现这一点。

为了使用这个

if (Input.GetKeyDown(GetKeyCode("Space"))
{
    rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}

您需要检查您的玩家是否与地面发生碰撞,因此您可以使用 bool isGrounded 之类的布尔值来检查您是否正在接触地面,为此您可以在 OnCollisionStay() 与地面碰撞时确认它是真的。您可以使用标签来检查与您碰撞的对撞机是否在地面上。然后你跳的时候要说isGrounded = false;然后再落地才算真的

if (Input.GetKeyDown(GetKeyCode("Space") && isGrounded == true)
    {
        rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
        isGrounded = false;
    }