Unity 2D Platformer跳跃问题

问题描述

我可以使用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);
}

为了移动,但是每当按下空格键时,它都允许其他跳跃。

解决方法

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

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

,但是当他们已经在空中时,需要阻止玩家跳下去,只允许他们已经在地面上时才做。所以:

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

isOnFloor()的某个功能可以检查您的角色是否在地板上。根据您的游戏实现,可以通过几种方法来完成此操作,但是最常见的一种方法是检查玩家角色是否与任何物体碰撞,如果存在,则该碰撞对象是否在其下方。 This stackexchange thread提供了一些有关如何实现此目标的代码示例。

,

为了使用它

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

您需要检查玩家是否与地面相撞,因此,您将拥有bool isGrounded之类的笨蛋来检查您是否触地,为此您可以在{{1 }}以确认它在与地面碰撞时为真。您可以使用标签来检查与之碰撞的对撞机是否为地面。然后,当您跳下时,您需要说OnCollisionStay(),直到您再次降落在地面上时,它才会成立

isGrounded = false;