2015-12-02 3 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, а не для игрового движка. –

Смежные вопросы