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
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!
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
Hola Emanuel, pues si ves la serie de tutoriales de unity 2D facilmente podrías modificarlo para hacerlo un juego de naves infinito, solo que en vez de colocar una serie de objetos es probable que necesites modificarlos, es decir en vez de darles object.destroy al momento de ser impactados por la bala, serie un object.transform=new vector 3(x,y,z) y una nueva posicion fuera de la pantalla que se esta viendo para que vuelva a aparecer más adelante.
DE 10, MUY BUENOS VIDEOS VAMOS A ESPERAR!
🙂
jaja.. gracias! algo para la proxima semana?
Hoy estoy haciendo el video de lo que te enseñe por correo 😉 luego viene raycasting y un pequeño IA llamado line of sight, el jueves lo publico ^_^
Buenisimo, el VampiroScript podrias subir?
:O fue un lapsus brutus :p ya está el código en la página