Hola gente! Hoy les traigo un nuevo vídeo tutorial de un juego 2.5D en el entorno de Unity 2D, esta vez continuaremos perfeccionando el Joystick de la semana anterior, esta vez lo haremos funcionar con los múltiples estados que creamos al inicio y para ambos casos, animaciones creadas por Mecanim y animaciones creadas por código. No es un vídeo muy largo, ojala lo disfruten 🙂
Código
JoystickAnimacionScript
using UnityEngine; using System.Collections; public class JoystickAnimacionScript : MonoBehaviour { public CNJoystick movementJoystick; private Transform transformCache; private AnimacionesScript animador; // public float turnSpeed; public float Velocidad; // Use this for initialization void Awake() { animador = GetComponent<AnimacionesScript>(); if (movementJoystick == null) { throw new UnassignedReferenceException("Please specify movement Joystick object"); } movementJoystick.FingerTouchedEvent += StartMoving; movementJoystick.FingerLiftedEvent += StopMoving; movementJoystick.JoystickMovedEvent += Move; transformCache = transform; } // You can extend this class and override any of these virtual methods protected virtual void Move(Vector3 relativeVector) { // It's actually 2D vector //transformCache.position = transformCache.position + relativeVector*Velocidad; //FaceMovementDirection(relativeVector); relativeVector.Normalize(); Vector3 sigPosicion = relativeVector * Velocidad + transformCache.position; transform.position = Vector3.Lerp( transformCache.position, sigPosicion, Time.deltaTime ); FaceMovementDirection(relativeVector); } private void FaceMovementDirection(Vector3 direction) { //avanza en cualquier direccion //animador.estado = 1; //Debug.Log (direction.x + "," +direction.y); // if (direction.sqrMagnitude > 0.1) // { // transform.up = direction; // } float AnguloObjetivo = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; if(AnguloObjetivo > 68 & AnguloObjetivo <= 112) animador.estado = 1; if(AnguloObjetivo > 22 & AnguloObjetivo <= 68) animador.estado = 3; if(AnguloObjetivo > -22 & AnguloObjetivo <= 22) animador.estado = 5; if(AnguloObjetivo > -68 & AnguloObjetivo <= -22) animador.estado = 7; if(AnguloObjetivo > -112 & AnguloObjetivo <= -68) animador.estado = 9; if(AnguloObjetivo > -158 & AnguloObjetivo <= -112) animador.estado = 11; if((AnguloObjetivo > 158 & AnguloObjetivo <= 180)|(AnguloObjetivo > -180 & AnguloObjetivo <= -158)) animador.estado = 13; if(AnguloObjetivo > 112 & AnguloObjetivo <= 158) animador.estado = 15; // if(targetAngle > 68 & targetAngle <= 112) // animador.estado = 5; // if(targetAngle > 22 & targetAngle <= 68) // animador.estado = 5; // if(targetAngle > -22 & targetAngle <= 22) // animador.estado = 5; // if(targetAngle > -68 & targetAngle <= -22) // animador.estado = 5; // if(targetAngle > -112 & targetAngle <= -68) // animador.estado = 5; // if(targetAngle > -158 & targetAngle <= -112) // animador.estado = 5; // if((targetAngle > 158 & targetAngle <= 180)|(targetAngle > -180 & targetAngle <= -158)) // animador.estado = 5; // if(targetAngle > 112 & targetAngle <= 158) // animador.estado = 5; // // transform.rotation = // Quaternion.Slerp( transform.rotation, // Quaternion.Euler( 0, 0, targetAngle ), // turnSpeed * Time.deltaTime ); // Debug.Log (targetAngle+", "+ animador.estado); } protected virtual void StopMoving() { //Se mueve arriba animador.pararAnimacion (); } protected virtual void StartMoving() { //avanza en cualquier direccion animador.comenzarAnimacion (); } }
JoystickScript
using UnityEngine; using System.Collections; public class JoystickScript : MonoBehaviour { public CNJoystick movementJoystick; private Transform transformCache; private Animator animador; private int estado, estadoAnterior; public float Velocidad; // Use this for initialization void Awake() { animador = GetComponent<Animator>(); if (movementJoystick == null) { throw new UnassignedReferenceException("Please specify movement Joystick object"); } movementJoystick.FingerTouchedEvent += StartMoving; movementJoystick.FingerLiftedEvent += StopMoving; movementJoystick.JoystickMovedEvent += Move; transformCache = transform; } // You can extend this class and override any of these virtual methods protected virtual void Move(Vector3 relativeVector) { // It's actually 2D vector transformCache.position = transformCache.position + relativeVector*Velocidad; FaceMovementDirection(relativeVector); } private void FaceMovementDirection(Vector3 direction) { //avanza en cualquier direccion // // //Debug.Log (direction.x + "," +direction.y); // if (direction.sqrMagnitude > 0.1) // { // transform.up = direction; // } float AnguloObjetivo = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; if(AnguloObjetivo > 68 & AnguloObjetivo <= 112) estado = 1; if(AnguloObjetivo > 22 & AnguloObjetivo <= 68) estado = 2; if(AnguloObjetivo > -22 & AnguloObjetivo <= 22) estado = 3; if(AnguloObjetivo > -68 & AnguloObjetivo <= -22) estado = 4; if(AnguloObjetivo > -112 & AnguloObjetivo <= -68) estado = 5; if(AnguloObjetivo > -158 & AnguloObjetivo <= -112) estado = 6; if((AnguloObjetivo > 158 & AnguloObjetivo <= 180)|(AnguloObjetivo > -180 & AnguloObjetivo <= -158)) estado = 7; if(AnguloObjetivo > 112 & AnguloObjetivo <= 158) estado = 8; if(estado != estadoAnterior) { if(estado == 1) animador.SetTrigger("Norte"); if(estado == 2) animador.SetTrigger("NorEste"); if(estado == 3) animador.SetTrigger("Este"); if(estado == 4) animador.SetTrigger("SurEste"); if(estado == 5) animador.SetTrigger("Sur"); if(estado == 6) animador.SetTrigger("SurOeste"); if(estado == 7) animador.SetTrigger("Oeste"); if(estado == 8) animador.SetTrigger("NorOeste"); estadoAnterior = estado; } animador.SetTrigger("Avanzar"); } protected virtual void StopMoving() { //Se mueve arriba if(estado == 1) animador.SetTrigger("Norte"); if(estado == 2) animador.SetTrigger("NorEste"); if(estado == 3) animador.SetTrigger("Este"); if(estado == 4) animador.SetTrigger("SurEste"); if(estado == 5) animador.SetTrigger("Sur"); if(estado == 6) animador.SetTrigger("SurOeste"); if(estado == 7) animador.SetTrigger("Oeste"); if(estado == 8) animador.SetTrigger("NorOeste"); } protected virtual void StartMoving() { //avanza en cualquier direccion animador.SetTrigger("Avanzar"); } }
Proyecto
https://www.box.net/shared/ro18kx5ednc8jkja89je
Imagen del cazador rojo
Vídeo
Parte 1: Programando el Joystick para usarlo con la animación por código
https://www.youtube.com/watch?v=U55C4g6Ky0I#t=0m39s
Parte 2: Explicación del eje de coordenadas y de como funciona los angulos utilizados
https://www.youtube.com/watch?v=U55C4g6Ky0I#t=6m26s
Parte 3: Finalizando la implementación del Joystick por código
https://www.youtube.com/watch?v=U55C4g6Ky0I#t=10m27s
Parte 3: Actualización del Joystick por Mecanim para que funcione con múltiples Animaciones
https://www.youtube.com/watch?v=U55C4g6Ky0I#t=12m13s
Suerte!