簡體   English   中英

C# 2D平台動作代碼

[英]C# 2D platformer movement code

即使它不在地面上,這段代碼也會繼續跳躍你如何阻止它(使用 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;
    }
}

有幾種方法可以實現這一點,但要遵循您當前的實現:為什么不在跳躍時將 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 設置 "" 但我不確定我對此很陌生,我的用戶名說它。

我是編程新手,所以我把這當作一個挑戰。 我才注意到這是五年前的事,但無論如何我都不會發送我的解決方案。 我仍然不知道你的腳本是如何工作的。 哈哈

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

public class Movement: MonoBehaviour
{

    //Movement
    public float speed;
    public float jump;
    float moveVelocity;
    public Rigidbody2D rb;

    void Update()
    {
        //Grounded?
        if (rb.position.y < 5.52)
        {
            //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);

    }
}

我知道已經 6 年了,但我找到了一個對我有用的解決方案。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM