Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda al colocar controles Touch para android

Iniciado por ehmmy10, Octubre 01, 2018, 05:39:38 PM

Tema anterior - Siguiente tema
Octubre 01, 2018, 05:39:38 PM Ultima modificación: Octubre 02, 2018, 02:30:57 AM por pioj

Buenos días, estoy comenzando a programar en Unity y necesito ayuda para colocar los botones touch en un
videojuego para ser jugado en android, solo he logrado colocar el salto del personaje, pero no logro hacer
que el personaje se mueva de derecha a izquierda, solamente voltea a la dirección que ha sido pulsado el
botón, y hace como un pequeño fotograma de que se va mover (levanta la piernita y así) pero no avanza.
En el enlace esta el juego que me descargué para ponerle los botones touch para android
https://github.com/BayatGames/RedRunner
De verdad espero puedan ayudarme, ya intente poniéndolo en un event trigger o haciendo otra clase que mande
a llamar al move y lo multiplique por -1 o 1 según la dirección, pero estoy muy primeriza para esto
De verdad espero su ayuda, gracias!

Cita de: ehmmy10 date=1538408378De verdad espero puedan ayudarme, ya intente poniéndolo en un event trigger o haciendo otra clase que mande a llamar al move y lo multiplique por -1 o 1 según la dirección, pero estoy muy primeriza para esto
   


Hola, moverse no es lo mismo que animar, dos cosas separadas, los event triggers se usan para disparar un evento en un dado momento del clip de animación, útil por ej para hacer daño con tu espada al enemigo en X fotograma, no para mover ni avisar de que se mueva, aunque se puede hacer.
 
Simplemente presentá los botones, poné mediante código que si se da X input de interés se imprima un print("Anda"). Luego reemplazá ese print anda con la funcionalidad de movimiento/animación que quieras, pero bueno ya por lo menos sabés que las inputs funcionan. Te digo esto porque si recién empezás pueden estar pasando 5 cosas distintas, y teniendo todo metido de una en la escena solo va a complicar las cosas.
 
Y bueno sería siempre ideal que en vez de pasarnos el link de un proyecto completo pases tu script así se puede ver lo que hiciste.
 
Saludos

buenas tardes, gracias por tu respuesta, creo haber entendido un poco lo que me mencionas y voy a intentar ser lo mas especifica posible, mira en esta parte de codigo es donde el personaje se mueve:
 

      public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {
         float speed = m_CurrentRunSpeed;
//            if ( CrossPlatformInputManager.GetButton ( "Walk" ) )
//            {
//               speed = m_WalkSpeed;
         //            }
         Vector2 velocity = m_Rigidbody2D.velocity;
         velocity.x = speed * horizontalAxis;
         m_Rigidbody2D.velocity = velocity;
         if ( horizontalAxis > 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
         else if ( horizontalAxis < 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
      }
   }

 
el personaje se mueve con las teclas de dirección o con ASWD, yo estaba intentando hacer que el personaje se moviera con un Event Trigger que le asigne a cada botón de la pantalla, en donde yo ponía un 1 o -1 para que se moviera  a la izquierda o a la derecha, pero el personaje solamente voltea hacia el lado que es presionado, sin avanzar. La verdad no se que hacer, ahora que me menciona que un event Trigger no es para eso.
 


Cita de: ehmmy10 date=1538424846buenas tardes, gracias por tu respuesta, creo haber entendido un poco lo que me mencionas y voy a intentar ser lo mas especifica posible, mira en esta parte de codigo es donde el personaje se mueve: 
   
   

      public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {
         float speed = m_CurrentRunSpeed;
//            if ( CrossPlatformInputManager.GetButton ( "Walk" ) )
//            {
//               speed = m_WalkSpeed;
         //            }
         Vector2 velocity = m_Rigidbody2D.velocity;
         velocity.x = speed * horizontalAxis;
         m_Rigidbody2D.velocity = velocity;
         if ( horizontalAxis > 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
         else if ( horizontalAxis < 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
      }
   }

   
      el personaje se mueve con las teclas de dirección o con ASWD, yo estaba intentando hacer que el personaje se moviera con un Event Trigger que le asigne a cada botón de la pantalla, en donde yo ponía un 1 o -1 para que se moviera  a la izquierda o a la derecha, pero el personaje solamente voltea hacia el lado que es presionado, sin avanzar. La verdad no se que hacer, ahora que me menciona que un event Trigger no es para eso.
   
   
      
   
   
      
   


Ahh @ehmmy10  disculpame, me confundí con los Events de animación! ahora te entiendo ... vamos a rebobinar... Sí, está bien lo que hacés, usas el PointerDown y le pasas en cada uno un argumento. El problema que tiene tu scripts es que utiliza el argumento solo para la parte de la escala:
 

if ( horizontalAxis > 0f )
{
Vector3 scale = transform.localScale;
scale.x = Mathf.Sign ( horizontalAxis );
transform.localScale = scale;
}
else if ( horizontalAxis < 0f )
{
Vector3 scale = transform.localScale;
scale.x = Mathf.Sign ( horizontalAxis );
transform.localScale = scale;
}

 
Pero nada en la parte de movimiento, osea, sí está pero no estás dando un valor a speed (de la forma que lo tenés). Me parece que solo basta con sacar el speed que está dentro del if:
 

public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {
         float speed = m_WalkSpeed; // < ------------
                                                     
         Vector2 velocity = m_Rigidbody2D.velocity;
         velocity.x = speed * horizontalAxis;
         m_Rigidbody2D.velocity = velocity;
                ...

 
OSea estaba bien pero speed es fijo, una magnitud, no debería variar bajo ninguna condición de entrada (salvo un "Run" por ej), lo que tiene que variar es tu horizontalAxis que está bien.
 
Osea:
 

public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {                                                                  
         Vector2 velocity = m_Rigidbody2D.velocity;
         velocity.x = m_WalkSpeed * horizontalAxis;
         m_Rigidbody2D.velocity = velocity;
                ...

 
Fijate si anda ahora, calculo que será eso.
 
Saludos

Lo hice pero sigue sin moverse, y es que el personaje va corriendo gradualmente, o sea, va aumentando su velocidad conforme va avanzando, y parece ser que el personaje se niega a moverse >n<
 
intente mejor agregarle el speed pero dentro de cada if y tampoco así, es mas hasta agregándole esta linea de código
 

         Move ( CrossPlatformInputManager.GetAxis ( "Horizontal" ) );

 
pero ni así :/
 
 
 
la verdad estoy muy perdida


      void Update ()
   {
      if ( !GameManager.Singleton.gameStarted || !GameManager.Singleton.gameRunning )
      {
         return;
      }
      if ( transform.position.y < 0f )
      {
         Die ();
      }
      // Speed
      m_Speed = new Vector2 ( Mathf.Abs ( m_Rigidbody2D.velocity.x ), Mathf.Abs ( m_Rigidbody2D.velocity.y ) );
      // Speed Calculations
      m_CurrentRunSpeed = m_RunSpeed;
      if ( m_Speed.x >= m_RunSpeed )
      {
         m_CurrentRunSpeed = Mathf.SmoothDamp ( m_Speed.x, m_MaxRunSpeed, ref m_CurrentSmoothVelocity, m_RunSmoothTime );
      }
      // Input Processing
      Move ( CrossPlatformInputManager.GetAxis ( "Horizontal" ) );
            if ( CrossPlatformInputManager.GetButtonDown ( "Jump" ) )
      {
         Jump ();
      }
      if ( IsDead.Value && !m_ClosingEye )
      {
         StartCoroutine ( CloseEye () );
      }
         }      
.........
 
 
        public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {
         float speed = m_CurrentRunSpeed;
//            if ( CrossPlatformInputManager.GetButton ( "Walk" ) )
//            {
//               speed = m_WalkSpeed;
         //            }
         Vector2 velocity = m_Rigidbody2D.velocity;
         velocity.x = speed * horizontalAxis;
         m_Rigidbody2D.velocity = velocity;
         if ( horizontalAxis > 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
         else if ( horizontalAxis < 0f )
         {
            Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
      }
   }
   public override void Jump ()
   {
      if ( !IsDead.Value )
      {
         if ( m_GroundCheck.IsGrounded )
         {
            Vector2 velocity = m_Rigidbody2D.velocity;
            velocity.y = m_JumpStrength;
            m_Rigidbody2D.velocity = velocity;
            m_Animator.ResetTrigger ( "Jump" );
            m_Animator.SetTrigger ( "Jump" );
            m_JumpParticleSystem.Play ();
            AudioManager.Singleton.PlayJumpSound ( m_JumpAndGroundedAudioSource );
         }
      }
   }

 
Aquí esta una parte del código en donde se puede mostrar como es que son los valores que necesita el personaje para moverse, al presionar las teclas si lo hace, pero al dar clic a los botones que agregué al GUI solo cambia de dirección el personaje.

logré hacer que corriera pero.... no va acelerando su velocidad constantemente, simplemente corre a una velocidad constante y no aumenta gradualmente como lo hace normalmente cuando pulsaba la tecla A o D.
 
 
 

public override void Move ( float horizontalAxis )
   {
      if ( !IsDead.Value )
      {
               
         if ( horizontalAxis > 0f )
         {
                    float speed = m_CurrentRunSpeed;
                    Vector2 velocity = m_Rigidbody2D.velocity;
                    velocity.x = speed * horizontalAxis;
                    m_Rigidbody2D.velocity = velocity;
                    Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
         else if ( horizontalAxis < 0f )
         {
                    float speed = m_CurrentRunSpeed;
                    Vector2 velocity = m_Rigidbody2D.velocity;
                    velocity.x = speed * horizontalAxis;
                    m_Rigidbody2D.velocity = velocity;
                    Vector3 scale = transform.localScale;
            scale.x = Mathf.Sign ( horizontalAxis );
            transform.localScale = scale;
         }
      }
   }

 
 

Etiquetas: