c# - 我正在制作一个 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;
}
}
谢谢你看我的问题!
解决方案
使用额外的仅触发对象来检测您的角色是否在地板上。这意味着添加另一个游戏对象作为角色的子对象,给它一个 2d 的 box collider,并将其放置在角色脚下方,主对撞机之外。通过这种放置,可以确保其他固体物体(如墙壁和天花板)永远不会撞到它,因为整个角色将由于其主对撞机而停止。然后向该子对象添加一个脚本,该脚本处理碰撞并将“is_grounded”布尔值设置为主要角色控制器。
此外,您应该阅读有关“层”的信息:https : //docs.unity3d.com/Manual/LayerBasedCollision.html 例如,通过将您的跳跃处理对撞机放在另一层,将您的敌人放在第三层,您可以防止该角色可以通过禁用这两个新层之间的碰撞来跳下敌人的头部(同时保持角色本身仍然可以与敌人碰撞以受到伤害等)
推荐阅读
- swift - 快速四舍五入到最接近的小数点 0.5
- javascript - 如何在 PrettyPhoto 的 JS 中调用 PHP 以在描述中包含链接?
- java - 健全性检查:在 conda 环境中正确降级 Java
- java - 在 Jython 中捕获 java 异常
- r - 使用 R 和没有选择器的 Jazzy Scraping
- opencv - 如何通过网络摄像头实时识别图像并使用 Keras 实时准确地显示标签
- android - 如何制作透明状态栏
- wordpress - 如果没有备份数据库,将 public_html 文件夹上传到另一个托管服务提供商还不够吗?
- sql-server - 在 OPENQUERY 中包含参数列表
- java - 如何创建通知