c# 2D平台移动代码

本文关键字:代码 移动 平台 2D | 更新日期: 2023-09-27 18:15:33

这段代码会一直跳下去,即使它不是在地面上,你怎么阻止它(使用Unity)。

代码:

using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour 
{
    //Movement
    public float speed;
    public float jump;
    float moveVelocity;
    //Grounded Vars
    bool grounded = true;
    void Update () 
    {
        //Jumping
        if (Input.GetKeyDown (KeyCode.Space) || Input.GetKeyDown (KeyCode.UpArrow) || Input.GetKeyDown (KeyCode.Z) || Input.GetKeyDown (KeyCode.W)) 
        {
            if(grounded)
            {
                GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, jump);
            }
        }
        moveVelocity = 0;
        //Left Right Movement
        if (Input.GetKey (KeyCode.LeftArrow) || Input.GetKey (KeyCode.A)) 
        {
            moveVelocity = -speed;
        }
        if (Input.GetKey (KeyCode.RightArrow) || Input.GetKey (KeyCode.D)) 
        {
            moveVelocity = speed;
        }
        GetComponent<Rigidbody2D> ().velocity = new Vector2 (moveVelocity, GetComponent<Rigidbody2D> ().velocity.y);
    }
    //Check if Grounded
    void OnTriggerEnter2D()
    {
        grounded = true;
    }
    void OnTriggerExit2D()
    {
        grounded = false;
    }
}

c# 2D平台移动代码

有几种方法可以实现这一点,但遵循您当前的实现:为什么不将isGrounded标志设置为false,当您跳跃时,只是让触发器处理重置标志,当您着陆时?

你可以检查:你所有的碰撞器是否都是2D并设置为触发器?
你检查过你的图层碰撞是否真的发生了吗?

public class PlayerController : MonoBehaviour 
{
    //Movement
    public float speed;
    public float jump;
    float moveVelocity;
    //Grounded Vars
    bool isGrounded = true;
    void Update () 
    {
        //Jumping
        if (Input.GetKeyDown (KeyCode.Space) || Input.GetKeyDown (KeyCode.UpArrow) || Input.GetKeyDown (KeyCode.Z) || Input.GetKeyDown (KeyCode.W)) 
        {
            if(isGrounded)
            {
                GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, jump);
                isGrounded = false;
            }
        }
        moveVelocity = 0;
        //Left Right Movement
        if (Input.GetKey (KeyCode.LeftArrow) || Input.GetKey (KeyCode.A)) 
        {
            moveVelocity = -speed;
        }
        if (Input.GetKey (KeyCode.RightArrow) || Input.GetKey (KeyCode.D)) 
        {
            moveVelocity = speed;
        }
        GetComponent<Rigidbody2D> ().velocity = new Vector2 (moveVelocity, GetComponent<Rigidbody2D> ().velocity.y);
    }
    //Check if Grounded
    void OnTriggerEnter2D()
    {
        isGrounded = true;
    }
}

我很确定你需要有"对于GetKeyDown在()但我不确定我很新在这个,我的用户名说它。

我知道已经六年了,但我找到了一个适合我的解决方案。

 //Movement
public float speed;
public float jump;
float moveVelocity;
public Rigidbody2D rb;
bool isGrounded;
void Update()
{
    //Grounded?
    if(isGrounded == true){
        //jumping
        if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Z) || Input.GetKeyDown(KeyCode.W))
        {
    
        GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jump);
        }
        
  }
   moveVelocity = 0;
   //Left Right Movement
   if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
   {
       moveVelocity = -speed;
   }
   if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
   {
       moveVelocity = speed;
   }
   GetComponent<Rigidbody2D>().velocity = new Vector2(moveVelocity, GetComponent<Rigidbody2D>().velocity.y);
}
 void OnCollisionEnter2D(Collision2D col)
{
    Debug.Log("OnCollisionEnter2D");
    isGrounded = true;
}
  void OnCollisionExit2D(Collision2D col)
{
    Debug.Log("OnCollisionExit2D");
    isGrounded = false;
}

}