Single Tech Games

unity 2.5D Diablo isometrico zelda

Tutorial de Unity 2.5D VI – Usando varias animaciones con el Joystick

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
Cazador RojoVí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!

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments