2015-12-02 69 views
0

我試圖創建一個統一的2D平臺遊戲,當我嘗試使角色雙跳時,它將無法工作。我想知道我能否得到任何幫助。遊戲角色不會雙跳c#

using UnityEngine; 
using System.Collections; 

public class Player : MonoBehaviour { 

    public float maxSpeed = 3; 
    public float speed = 50f; 
    public float jumpPower = 150f; 

    public bool grounded; 
    public bool canDoubleJump; 

    private Rigidbody2D rb2d; 
    private Animator anim; 

    void Start() 
    { 
     rb2d = gameObject.GetComponent<Rigidbody2D>(); 
     anim = gameObject.GetComponent<Animator>(); 
    } 


    void Update() 
    { 

     anim.SetBool("Grounded", grounded); 
     anim.SetFloat("Speed", Mathf.Abs(rb2d.velocity.x)); 

     if(Input.GetAxis("Horizontal") < -0.1f) 
     { 
      transform.localScale = new Vector3(-1, 1, 1); 
     } 

     if(Input.GetAxis("Horizontal") > 0.1f) 
     { 
      transform.localScale = new Vector3(1, 1, 1); 
     } 

     if(Input.GetButton("Jump")) 
     { 
      if(grounded) 
      { 
       rb2d.AddForce(Vector2.up * jumpPower); 
       canDoubleJump = true; 
      } 
      else 
      { 
       if (canDoubleJump) 
       { 
        canDoubleJump = false; 
        rb2d.velocity = new Vector2(rb2d.velocity.x, 0); 
        rb2d.AddForce(Vector2.up * jumpPower); 

       } 
      } 
     } 

    } 

    void FixedUpdate() 
    { 
     Vector3 easeVelocity = rb2d.velocity; 
     easeVelocity.y = rb2d.velocity.y; 
     easeVelocity.z = 0.0f; 
     easeVelocity.x *= 0.75f; 

     float h = Input.GetAxis("Horizontal"); 

     //fake friction/easing x speed 
     if(grounded) 
     { 
      rb2d.velocity = easeVelocity; 
     } 


     //moving player 
     rb2d.AddForce((Vector2.right * speed) * h); 

     //limiting speed 
     if(rb2d.velocity.x > maxSpeed) 
     { 
      rb2d.velocity = new Vector2(maxSpeed, rb2d.velocity.y); 
     } 

     if(rb2d.velocity.x < -maxSpeed) 
     { 
      rb2d.velocity = new Vector2(-maxSpeed, rb2d.velocity.y); 
     } 
    } 
} 
+0

難道你不應該加倍跳jumpPower雙跳? –

+0

不完全,沒有。 「雙跳」並不意味着「跳高兩倍」,這意味着「在空中跳躍時再次跳躍」。雙跳(傳統上)甚至可以在脫離平臺後執行。也就是說,在添加跳躍速度之前,應將垂直速度歸零。 – Draco18s

+0

它可能是2D盒子對撞機,干擾腳本? @ Draco18s – Userbitcoin4life1

回答

1

問題是,您正在檢查跳轉按鈕當前是否處於停機狀態。按下和釋放按鈕通常發生在多個框架上(即在按鈕按下期間Update()被調用多次)。

有兩種方法可以解決這個問題。

最簡單的(也可能是最好的)是使這種改變:

,直到它被釋放並再次按下
if(Input.GetButtonDown("Jump")) 

GetButtonDown只返回其中按鈕被按下的第一幀真實的,虛假的。

另一種是包含第二個變量,該變量阻止第二個塊的激活,直到釋放按鈕後。這不太理想,但是顯示了GetButtonDown幕後的情況。

var isButtonDown = false; 

Update() { 
     if(Input.GetButton("Jump")) 
     { 
      if(grounded) 
      { 
       rb2d.AddForce(Vector2.up * jumpPower); 
       canDoubleJump = true; 
       isButtonDown = true; 
      } 
      else if(!isButtonDown) 
      { 
       if (canDoubleJump) 
       { 
        canDoubleJump = false; 
        rb2d.velocity = new Vector2(rb2d.velocity.x, 0); 
        rb2d.AddForce(Vector2.up * jumpPower); 

       } 
      } 
     } 
     else { 
      isButtonDown = false; 
     } 
    } 

請注意,這並沒有解決雙跳能力通常包括的「脫落平臺並跳一次」。我會把這個作爲練習留給讀者。

+0

哇,好的謝謝。非常感謝您的幫助! :) – Userbitcoin4life1

+0

不客氣。順便說一句,下次包含'Unity'標籤。畢竟,你使用的是Unity,Unity是一個在這裏被認可的標籤。另外不要忘記將此標記爲已接受的答案!左上角的複選標記。 ;) – Draco18s

+1

@ Draco18s請勿使用Unity標籤,Unity3d標籤。 Unity適用於IoC框架,而不是遊戲引擎。 –