Single Tech Games

Tutorial en español de Unity 2D – Animación y movimiento (2da parte)

Hola gente! Hoy termino está miniserie de tutoriales extra sobre animación en mecanim en unity 2D con un poco de movimiento en el jefe final y algo de inteligencia artificial, quizás muy poquito, pero bueno intentando que sea un poco divertido, aprenderán uno que otro truquito que fui aprendiendo mientras programo mi nuevo juego para celulares, que me está tomando mucho tiempo, pero bueno ojalá lo tenga listo para marzo y como máximo para quincena.

Estoy pensando hacer un video sobre todo lo que uno necesita saber para publicar en Android, IOS, Windows Phone, la parte básica como Admob, las consolas, lo hago porque mucha gente me pregunta lo mismo por la página de contacto y ya me canse de escribir lo mismo siempre XD y un video es mejor que 10000 palabras.
Imágenes
shuriken
Código

Este es el código de VampiroScript

using UnityEngine;
using System.Collections;
public class VampiroScript : MonoBehaviour {
	private bool aparecio;
	//  almacenamos los componentes
	private MovimientoScript movimientoScript;
	private ArmaScript[] armas;
	private Animator animador;
	private SpriteRenderer[] renderizadores;
	// Tiempo del disparo
	public float tiempoMinimoAtaque = 0.5f;
	public float tiempoMaximoAtaque = 1.5f;
	private float tiempoMinimoIA;
	private bool estaAtacando;
	private Vector2 posicionObjetivo;
	void Awake()
	{
		armas = GetComponentsInChildren<ArmaScript>();
		movimientoScript = GetComponent<MovimientoScript>();
		animador = GetComponent<Animator>();
		renderizadores = GetComponentsInChildren<SpriteRenderer>();
	}
	void Start()
	{
		aparecio = false;
		// Que nada funcione
		// -- Colisionador
		collider2D.enabled = false;
		// -- Movimiento
		movimientoScript.enabled = false;
		// -- Disparo
		foreach (ArmaScript arma in armas)
		{
			arma.enabled = false;
		}
		// comportamiento por defecto
		estaAtacando = false;
		tiempoMinimoIA = tiempoMaximoAtaque;
	}
	void Update()
	{
		// verificar si aparecio
		if (aparecio == false)
		{
			// Revisar el primer renderizador
			// Anque no sabemos si es algun ala o la cara
			if (renderizadores[0].IsVisibleFrom(Camera.main))
			{
				Aparecer();
			}
		}
		else
		{
			// IA
			//------------------------------------
			// Mover o atacar, esperar, repetir
			tiempoMinimoIA -= Time.deltaTime;
			if (tiempoMinimoIA <= 0f)
			{
				estaAtacando = !estaAtacando;
				tiempoMinimoIA = Random.Range(tiempoMinimoAtaque, tiempoMaximoAtaque);
				posicionObjetivo = Vector2.zero;
				// Poner en False o True el atacar
				animador.SetBool("Ataque", estaAtacando);
			}
			// Atacar
			//----------
			if (estaAtacando)
			{
				// Parar cualquier movimiento
				movimientoScript.direccion = Vector2.zero;
				foreach (ArmaScript arma in armas)
				{
					if (arma != null && arma.enabled && arma.PuedeAtacar)
					{
						arma.Ataque(true);
						EfectosDeSonido.Instancia.ReproducirSonidoRayo();
					}
				}
			}
			// Mover
			//----------
			else
			{
				// Definir objetivo
				if (posicionObjetivo == Vector2.zero)
				{
					// inicializar un punto en la pantalla y convertirlo a punto del mundo
					Vector2 puntoRandom = new Vector2(Random.Range(0f, 1f), Random.Range(0f, 1f));
					posicionObjetivo = Camera.main.ViewportToWorldPoint(puntoRandom);
				}
				// Si somos el punto, que busque otro punto
				if (collider2D.OverlapPoint(posicionObjetivo))
				{
					// Resetear al siguiente frame
					posicionObjetivo = Vector2.zero;
				}
				// Ir al punto
				Vector3 direccion = ((Vector3)posicionObjetivo - this.transform.position);
				// utilizar el script de movimiento
				movimientoScript.direccion = Vector3.Normalize(direccion);
				//Debug.Log(movimientoScript.direccion.x + "," + movimientoScript.direccion.y);
			}
		}
	}
	private void Aparecer()
	{
		aparecio = true;
		// Que todo funcione
		// -- Colisionador
		collider2D.enabled = true;
		// -- Movimiento
		movimientoScript.enabled = true;
		// -- Disparo
		foreach (ArmaScript arma in armas)
		{
			arma.enabled = true;
		}
		// Detener el desplazamiento principal
		foreach (DesplazamientoScript desplazamiento in FindObjectsOfType<DesplazamientoScript>())
		{
			if (desplazamiento.estaUnidoaLaCamara)
			{
				desplazamiento.velocidad = Vector2.zero;
			}
		}
	}
	void OnTriggerEnter2D(Collider2D otherCollider2D)
	{
		// Recibio un golpe? cambiar la animacion
		DisparoScript disparo = otherCollider2D.gameObject.GetComponent<DisparoScript>();
		if (disparo != null)
		{
			if (disparo.esDisparoEnemigo == false)
			{
				// Parar el ataque e irse
				tiempoMinimoIA = Random.Range(tiempoMinimoAtaque, tiempoMaximoAtaque);
				estaAtacando = false;
				// Cambiar la animacion
				animador.SetTrigger("Golpe");
			}
		}
	}
	void OnDrawGizmos()
	{
		// Con Gizmos puedes poner informacion de debug en pantalla
		if (aparecio && estaAtacando == false)
		{
			Gizmos.DrawSphere(posicionObjetivo, 0.25f);
		}
	}
}


Suerte!

0 0 votes
Article Rating
Subscribe
Notify of
guest
8 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
emanuel rearte

hola, muy buenos tus videos y tu blog. quisiera saber si puedes hacer un tutorial para crear un videojuego de carrera sin fin o endless runnig game. gracias

Bruno Ferro

DE 10, MUY BUENOS VIDEOS VAMOS A ESPERAR!

Bruno Ferro

jaja.. gracias! algo para la proxima semana?

Bruno Ferro

Buenisimo, el VampiroScript podrias subir?