2016-05-28 2 views
0

Я хочу прыгать и перемещать свой персонаж в том же порядке, используя только один джойстик. Есть идея?Как прыгать с помощью JoyStick в мобильном сенсорном экране?

В моем джойстике;

  • Левая клавиша позволит персонажу перемещаться влево.
  • Правая клавиша позволяет персонажу перемещаться вправо.
  • Клавиша Up дозволяет символу JUMP.

В настоящее время мой персонаж легко перемещается влево и вправо, используя CrossPlatformInput. Но я хочу добавить функцию перехода к клавише джойстика. Я не хочу использовать дополнительную кнопку перехода.

enter image description here

Вот мои коды для перемещения персонажу

public class Platformer2DUserControl : MonoBehaviour 
{ 
    private PlatformerCharacter2D m_Character; 
    private bool m_Jump; 


    private void Awake() 
    { 
     m_Character = GetComponent<PlatformerCharacter2D>(); 
    } 


    private void Update() 
    { 
     if (!m_Jump) 
     { 
      // Read the jump input in Update so button presses aren't missed. 
      m_Jump = CrossPlatformInputManager.GetButtonDown("Jump"); 
     } 
    } 


    private void FixedUpdate() 
    { 
     // Read the inputs. 
     bool crouch = Input.GetKey(KeyCode.LeftControl); 
     float h = CrossPlatformInputManager.GetAxis("Horizontal"); 
     // Pass all parameters to the character control script. 
     m_Character.Move(h, crouch, m_Jump); 
     m_Jump = false; 
    } 
} 

а другой;

private void Awake() 
    { 
     // Setting up references. 
     m_GroundCheck = transform.Find("GroundCheck"); 
     m_CeilingCheck = transform.Find("CeilingCheck"); 
     m_Anim = GetComponent<Animator>(); 
     m_Rigidbody2D = GetComponent<Rigidbody2D>(); 
     playerGraphics = transform.FindChild("Graphics"); 
     if (playerGraphics == null) 
     { 
      Debug.LogError("There is no 'Graphics' object as a child of the player"); 
     } 
    } 


    private void FixedUpdate() 
    { 
     bool wasGrounded = m_Grounded; 
     m_Grounded = false; 

     // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground 
     // This can be done using layers instead but Sample Assets will not overwrite your project settings. 
     Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround); 
     for (int i = 0; i < colliders.Length; i++) 
     { 
      if (colliders[i].gameObject != gameObject) 
       m_Grounded = true; 
     } 
     m_Anim.SetBool("Ground", m_Grounded); 
     // Set the vertical animation 
     m_Anim.SetFloat("vSpeed", m_Rigidbody2D.velocity.y); 
    } 


    public void Move(float move, bool crouch, bool jump) 
    { 
     // If crouching, check to see if the character can stand up 
     if (!crouch && m_Anim.GetBool("Crouch")) 
     { 
      // If the character has a ceiling preventing them from standing up, keep them crouching 
      if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround)) 
      { 
       crouch = true; 
      } 
     } 

     // Set whether or not the character is crouching in the animator 
     m_Anim.SetBool("Crouch", crouch); 

     //only control the player if grounded or airControl is turned on 
     if (m_Grounded || m_AirControl) 
     { 
      // Reduce the speed if crouching by the crouchSpeed multiplier 
      move = (crouch ? move * m_CrouchSpeed : move); 

      // The Speed animator parameter is set to the absolute value of the horizontal input. 
      m_Anim.SetFloat("Speed", Mathf.Abs(move)); 

      // Move the character 
      m_Rigidbody2D.velocity = new Vector2(move * m_MaxSpeed, m_Rigidbody2D.velocity.y); 

      // If the input is moving the player right and the player is facing left... 
      if (move > 0 && !m_FacingRight) 
      { 
       // ... flip the player. 
       Flip(); 
      } 
      // Otherwise if the input is moving the player left and the player is facing right... 
      else if (move < 0 && m_FacingRight) 
      { 
       // ... flip the player. 
       Flip(); 
      } 
     } 
     // If the player should jump... 
     if (m_Grounded && jump && m_Anim.GetBool("Ground")) 
     { 
      // Add a vertical force to the player. 
      m_Grounded = false; 
      m_Anim.SetBool("Ground", false); 
      m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce)); 
     } 
    } 


    private void Flip() 
    { 
     // Switch the way the player is labelled as facing. 
     m_FacingRight = !m_FacingRight; 

     // Multiply the player's x local scale by -1. 
     Vector3 theScale = playerGraphics.localScale; 
     theScale.x *= -1; 
     playerGraphics.localScale = theScale; 
    } 
} 

ответ

3

С CrossPlatformInputManager.GetAxis("Horizontal"); для перемещения влево и право затем CrossPlatformInputManager.GetAxis ("Vertical"); для перемещения вверх и вниз.

Когда CrossPlatformInputManager.GetAxis ("Vertical"); возвращает значение, равное > 0, то оно вверх. Любое значение, которое < 0 не работает. Когда 0, это означает, что он не перемещается вверх или вниз.

Замените функцию Update() в первом скрипте на ваш вопрос с помощью приведенного ниже кода.

private void Update() 
{ 
    if (!m_Jump) 
    { 
     //Read the jump input in Update so button presses aren't missed. 
     //m_Jump = CrossPlatformInputManager.GetButtonDown("Jump"); 

     float checkJump = CrossPlatformInputManager.GetAxis ("Vertical"); 
     if(checkJump>0.3f){ 
      //Up 
      m_Jump = true; 
     } 
    } 
} 
+0

большое спасибо @Programmer, я попробовал то, что вы предложили, он работает, но он прыгает со слишком большой силой. Вы знаете, как я могу это ограничить? – komtan

+1

@komtan да, это в вашем втором коде. Это строка 'm_Rigidbody2D.AddForce (новый Vector2 (0f, m_JumpForce));' измените значение 'm_JumpForce' на что-то меньшее, чем оно есть сейчас. Вы не указали, как это определено. Просто продолжайте опускать его, пока вам не понравится высота прыжка. – Programmer

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