首页 > 解决方案 > 我正在制作一个 2d 平台游戏,这段代码让玩家可以无限跳转修复?

问题描述

这是代码,大部分是其他移动选项,但是当玩家按下空格时,跳跃是主要问题,他会无限跳跃,请帮助。

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float runSpeed= 2;
    public float jumpSpeed= 3;
    Rigidbody2D rb2D;
    public bool betterJump = false;
    public float fallMultipliplier =  0.5f;
    public float lowJumpMultiplier = 1f;
    
    void Start()
    {
       rb2D = GetComponent<Rigidbody2D>(); 
    }

    void FixedUpdate()
    {
        if (Input.GetKey("d") || Input.GetKey("right"))
        {
            rb2D.velocity = new Vector2(runSpeed,rb2D.velocity.y);
        }        
        else if (Input.GetKey("a") || Input.GetKey("left"))
        {
            rb2D.velocity = new Vector2(-runSpeed,rb2D.velocity.y);
        }  
        else
        {
            rb2D.velocity=new Vector2(0,rb2D.velocity.y);
        }
        if (Input.GetKey("space") && CheckGround.isGrounded)
        {
            rb2D.velocity = new Vector2(rb2D.velocity.x, jumpSpeed);
        }
    }
}

下面是代码CheckGround

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

public class CheckGround : MonoBehaviour
{
    public static bool isGrounded;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        isGrounded = true;
    }

    private void OnTiggerExit2D(Collider collision)
    {
        isGrounded = false;
    }
}

谢谢你看我的问题!

标签: c#unity3d

解决方案


使用额外的仅触发对象来检测您的角色是否在地板上。这意味着添加另一个游戏对象作为角色的子对象,给它一个 2d 的 box collider,并将其放置在角色脚下方,主对撞机之外。通过这种放置,可以确保其他固体物体(如墙壁和天花板)永远不会撞到它,因为整个角色将由于其主对撞机而停止。然后向该子对象添加一个脚本,该脚本处理碰撞并将“is_grounded”布尔值设置为主要角色控制器。

此外,您应该阅读有关“层”的信息:https : //docs.unity3d.com/Manual/LayerBasedCollision.html 例如,通过将您的跳跃处理对撞机放在另一层,将您的敌人放在第三层,您可以防止该角色可以通过禁用这两个新层之间的碰撞来跳下敌人的头部(同时保持角色本身仍然可以与敌人碰撞以受到伤害等)


推荐阅读