【问题标题】:Unity 2D Platformer Jumping IssueUnity 2D 平台跳跃问题
【发布时间】:2020-08-27 08:26:10
【问题描述】:

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

为了移动,但它允许在按下空格键时进行额外的跳跃。

【问题讨论】:

    标签: unity3d game-physics


    【解决方案1】:

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

    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 提供了一些代码示例来说明如何实现这一点。

    【讨论】:

    • addforce 是否仍然控制玩家的水平移动?我可以用它来代替我的 transform.positions += velocity * Time.FixedDeltaTime 吗?
    • 你可以这样做,但我可能不会推荐它,因为它不是应用稳定的增量,更像是用枪水平射击你的角色。对于垂直力,重力会像现实生活一样抵消它,但在水平方向上,它与游戏中角色的行走方式并不完全相同。
    【解决方案2】:

    为了使用这个

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多