问题描述
当我按下跳转按钮时,他将始终跳转。我希望你能帮助我。这是我的第一场比赛,所以我不太了解。这是我的代码:
Rigidbody2D rb;
float dirX;
float jumpForce = 300f;
private bool canJump = false;
private bool hasSwitchedLayers = false;
public Transform Teleport1;
private Vector3 startPos;
void Start()
{
startPos = new Vector3(-10,1.5f,0);
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
dirX = CrossplatformInputManager.GetAxis("Horizontal");
rb.veLocity = new Vector2(dirX * 10,rb.veLocity.y);
if (CrossplatformInputManager.GetButtonDown("Jump") )
{
rb.AddForce(new Vector2(rb.veLocity.x,jumpForce),ForceMode2D.Force);
}
}
解决方法
在脚本中添加一个
isGrounded
布尔值。在您的跳转if语句中添加isGrounded
的支票,例如if(CrossPlatformInputManager.GetButtonDown("Jump") && isGrounded){}
。但是,您将必须添加一条语句以检查播放器是否在地面上是真实的。您可以通过多种方式进行操作。
您可以使用simple short raycast来检测自己是否在地面上。
isGrounded = Physics2D.Raycast(transform.position,Vector3.down,distToGround + 0.2)
,请注意distToGround = collider.bounds.extents.y
。这将创建一个光线投射,该光线投射将从播放器向下传播(其传播距离将是从播放器的碰撞轴到底部的碰撞边缘,再加上一点,以防万一您在斜坡上等)。如果命中路径中的任何对象,它将返回true。此方法将要求它在update方法中。但是,您也可以通过执行以下操作将其添加到isGrounded本身中:
bool isGrounded(){
return Physics2D.Raycast(transform.position,distToGround + 0.2);
}
void Update(){
if(isGrounded() && .......){}
}
如果您的角色具有角色控制器,您也可以只使用简单的
if(CharacterController.isGrounded)
statement
您可以使用的另一种方法是在玩家的脚下添加一个小的碰撞球/盒子。这可以通过两种方式完成。首先,您可以让玩家检测到碰撞,然后检查是否是地面,
private bool IsGrounded;
void OnCollisionEnter2D(Collision2D c){
if(c.tag == "ground"){
isGrounded = true;
}
}
void OnCollisionExit2D(Collision2D c){
if(c.tag == "ground"){
isGrounded = false;
}
}
第二(更复杂),您可以在编辑器中添加一个空的游戏对象,该对象带有附加的碰撞盒/球体(带有isTrigger == true)和一个脚本。该游戏对象将是玩家的孩子,并且应该靠近玩家的脚。在其脚本中,可以添加一个静态变量
public static bool isPlayerGrounded
,然后添加一个简单的OnTriggerEnter2D
和OnTriggerExit2D
函数,并检查它们触发的对象是否通过使用标记进行了接地。 / p>
public static bool IsPlayerGrounded;
void OnTriggerEnter2D(Collider2D c){
if(c.tag == "ground"){
IsPlayerGrounded = true;
}
}
void OnTriggerExit2D(Collider2D c){
if(c.tag == "ground"){
IsPlayerGrounded = false;
}
}
然后,您可以检查播放器脚本中的播放器是否已接地
private Isgrounded;
void Update(){
Isgrounded = NameofOtherScript.IsPlayerGrounded;
}
,
有多种方法可以防止游戏对象跳到空中,但是我想说这是最简单的方法。首先,请确保您的游戏对象具有附加的对撞机。如果是这样,您将必须创建一个响应所有冲突的方法,并且还必须引入一个名为isJumping
的新变量:
bool isJumping = false;
void OnCollisionEnter2D(Collision2D col) //this method responds to all collisions
{
jumping = false;
}
if (CrossPlatformInputManager.GetButtonDown("Jump") && !jumping) //making sure that the game object is not already jumping
{
rb.AddForce(new Vector2(rb.velocity.x,jumpForce),ForceMode2D.Force);
jumping = true;
}
虽然此解决方案可能并不完美,并且您可能会遇到一些错误,例如游戏对象与墙壁/障碍物在空中碰撞时能够跳跃,但这是我能想到的最简单的解决方案。并且,为了避免该错误,请确保为此使用的对撞机位于游戏对象的底部(这样,它只有在落在地面上时才可以跳跃)。另外,如果您想了解有关OnCollisionEnter2D方法的更多信息,请查看Unity文档中的OnCollisionEnter2D(Collision2D)。