Single Tech Games

single tutorial unity 2d

Tutorial en español de Unity 2D #5 (Versión 4.3)

Hola gente! este es un nuevo tutorial sobre unity 3d, esta vez aprenderemos lo que nos ofrece la nuevas herramientas 2D para algo  interesante que es el desplazamiento paralelo (parallax scrolling), este efecto es usado en casi todos los juegos de plataforma 2D del mercado, lo voy a hacer por código, últimamente he descubierto una forma distinta de hacerla, pero eso lo dejaré para futuros tutoriales más avanzados de Unity.

Gracias por los correos comunicándose conmigo pero por favor tengan en cuenta que les puedo ayudar a resolver sus dudas pero no hago docencia online, quisiera tener el tiempo para hacerlo pero no lo tengo, pero si les surge alguna duda intentaré ayudarles en lo que pueda.
Les dejo el código de esta semana:
Este es el código de DesplazamientoScript

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// Script de desplazamiento paralelo
/// </summary>
public class DesplazamientoScript : MonoBehaviour
{
	/// <summary>
	/// velocidad de desplazamiento
	/// </summary>
	public Vector2 velocidad = new Vector2(2, 2);
	/// <summary>
	/// direccion de mvomiento
	/// </summary>
	public Vector2 direccion = new Vector2(-1, 0);
	/// <summary>
	/// Si el movimiento deberia ser aplicado a la camara
	/// </summary>
	public bool estaUnidoaLaCamara = false;
	/// <summary>
	/// la imagen sera infinita? para el fondo
	/// </summary>
	public bool esCiclico = false;
	/// <summary>
	/// Lista de objetos renderizados
	/// </summary>
	private List<Transform> objetoCiclico;
	// Traemos a todos los objetos renderizados
	void Start()
	{
		// Si es ciclico / fondo infinito
		if (esCiclico)
		{
			// Traemos todos los objetos hijos del objeto ciclico
			objetoCiclico = new List<Transform>();
			for (int i = 0; i < transform.childCount; i++)
			{
				Transform hijo = transform.GetChild(i);
				// Add only the visible children
				if (hijo.renderer != null)
				{
					objetoCiclico.Add(hijo);
				}
			}
			// Ordenamos por posicion
			// Ordenamos de izquierda a derecha
			objetoCiclico = objetoCiclico.OrderBy(
				t => t.position.x
				).ToList();
		}
	}
	void Update()
	{
		// movimiento
		Vector3 movimiento = new Vector3(
			velocidad.x * direccion.x,
			velocidad.y * direccion.y,
			0);
		movimiento *= Time.deltaTime;
		transform.Translate(movimiento);
		// Mover la camara
		if (estaUnidoaLaCamara)
		{
			Camera.main.transform.Translate(movimiento);
		}
		// Ciclico
		if (esCiclico)
		{
			// Traemos el primer objeto desde la izquierda
			Transform primerObjeto = objetoCiclico.FirstOrDefault();
			if (primerObjeto != null)
			{
				// Vemos si el objeto ya salio de la camara
				// Ojo que la funcion IsVisibleFrom es pesada
				if (primerObjeto.position.x < Camera.main.transform.position.x)
				{
					// Si el objeto salio del enfoque de la camara
					if (primerObjeto.renderer.IsVisibleFrom(Camera.main) == false)
					{
						// Obtenemos la posicion del ultimo objeto.
						Transform ultimoObjeto = objetoCiclico.LastOrDefault();
						Vector3 ultimaPosicion = ultimoObjeto.transform.position;
						Vector3 ultimoTamano = (ultimoObjeto.renderer.bounds.max - ultimoObjeto.renderer.bounds.min);
						// Lo colocamos en la posicion despues del ultimo
						// Nota: Esto solo funciona con el desplazamiento horizontal.
						primerObjeto.position = new Vector3(ultimaPosicion.x + ultimoTamano.x, primerObjeto.position.y, primerObjeto.position.z);
						// Removemos el primer objeto
						// y lo volvemos agregar con la nueva posicion
						objetoCiclico.Remove(primerObjeto);
						objetoCiclico.Add(primerObjeto);
					}
				}
			}
		}
	}
}

Este es el código de RendererExtensions

using UnityEngine;
public static class RendererExtensions
{
	public static bool IsVisibleFrom(this Renderer renderer, Camera camera)
	{
		Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
		return GeometryUtility.TestPlanesAABB(planes, renderer.bounds);
	}
}

Este es el código de NubeScript

using UnityEngine;
using System.Collections;
/// <summary>
/// Comportamiento de la nube
/// </summary>
public class NubeScript : MonoBehaviour {
	private bool aparecio;
	private MovimientoScript movimientoScript;
	private ArmaScript[] armas;
	void Awake()
	{
		// Instanciamos el objeto arma
		armas = GetComponentsInChildren<ArmaScript>();
		// Obtenemos el script para deshabilitarlo mientras no aparezca
		movimientoScript = GetComponent<MovimientoScript>();
	}
	// Disolvemos todo inicialmente
	void Start()
	{
		CambiarEstado(false);
	}
	void Update()
	{
		// Comprobamos si ya aprecio en la camara
		if (aparecio == false)
		{
			if (renderer.IsVisibleFrom(Camera.main))
			{
				CambiarEstado(true);
			}
		}
		else
		{
			foreach (ArmaScript arma in armas) {
				// Auto disparamos
				if (arma != null && arma.PuedeAtacar) {
						arma.Ataque (true);
						EfectosDeSonido.Instancia.ReproducirSonidoRayo();
				}
			}
			// No esta mas en la camara
			if (renderer.IsVisibleFrom(Camera.main) == false)
			{
				Destroy(gameObject);
			}
		}
	}
	// Activar
	private void CambiarEstado(bool estado)
	{
		aparecio = estado;
		//Colisionador
		collider2D.enabled = estado;
		//Movimiento
		movimientoScript.enabled = estado;
		//armas
		foreach (ArmaScript arma in armas)
		{
			arma.enabled = estado;
		}
	}
}

Este es el código de CoheteScript

void Update()
	{
		// Verificar que no estamos fuera de la camara
		var distancia = (transform.position - Camera.main.transform.position).z;
		var bordeIzquierdo = Camera.main.ViewportToWorldPoint(
			new Vector3(0, 0, distancia)
			).x;
		var bordeDerecho = Camera.main.ViewportToWorldPoint(
			new Vector3(1, 0, distancia)
			).x;
		var bordeArriba = Camera.main.ViewportToWorldPoint(
			new Vector3(0, 0, distancia)
			).y;
		var bordeAbajo = Camera.main.ViewportToWorldPoint(
			new Vector3(0, 1, distancia)
			).y;
		transform.position = new Vector3(
			Mathf.Clamp(transform.position.x, bordeIzquierdo, bordeDerecho),
			Mathf.Clamp(transform.position.y, bordeArriba, bordeAbajo),
			transform.position.z
			);
	}


Suerte!

0 0 votes
Article Rating
Subscribe
Notify of
guest
46 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Ignacio Cano

amigo pusiste una parte del codigo que no reconocia y tuve que borrar y me quito el error, era esto: EfectosDeSonido.Instancia.ReproducirSonidoRayo();

Ignacio Cano

ya te lo mande por facebook amigo

Ignacio Cano

TAMBIEN YA LO CAMBIE POR RENDERER.ISVISIBLE Y ME SIGUE SALIENDO ERROR AMIGO

Ignacio cano

________________________________

Ignacio Cano

entonces ???

Ignacio Cano

YA TE MANDE LA IMAGEN AMIGO

Ignacio Cano

Disculpa Julio, no me vaz a poder ayudar?, no e podido continuar el tutorial porque me quede aqui estancado con ese problema, ayuda porfavor amigo

Ignacio cano

este es, lo puedes ver???
________________________________

Ignacio Cano

Te lo mandare por facebook ok????

Ignacio Cano

buenas tardes amigo, disculpa, me sale error en la linea 98 , nose que pase, podrias ayudarme porfavor?

juan andres

hi sl2

juan andres

hi intento realizar este paso o seguir este video pero me aprecen con unity 5.3.3
en nubescript CS0117 ‘Renderer’ does not contain a definition for ‘IsVisibleFrom’
CS0113 The name ‘EfectosDeSonido’ does not exist in the current context
CS0117 ‘Renderer’ does not contain a definition for ‘IsVisibleFrom’
CS0649 Field ‘cohetescript.movimiento’ is never assigned to, and will always have its default value cohete1.CSharp
Erores en line 32 45 90 y 9 sucesivamente
alguna idea, muchas gracias , saludos

jano

Como solucionaron el tema del desplazamiento en paralelo de forma vertical?
Buenos tutos

christian

tus turoriales estan geniales :), me gustaria hacerte una pregunta, que tendria que modificalarle y a que script para crear un loop ciclico para que aparecieran los enemigos y en posicion aleatoria?
intente agregar el scrip de desplazamiento a cada enemigo pero digamos que no funciono muy bien xD

Christian

Perfecto julio entonces adaptare el script a este proyecto, ando jugando un poco con el unity y estoy tratando de darle a cohete control por medio del acelerometeo de los dispositivos moviles a ver como me va 🙂 (soy principiante en unity asi como para la programacion de scripts) pero he aprendido bastante esta ultima semana aqui en tu pagina muchas gracias por compartir tu conocimiento 🙂

albertosualis

Muchisimas gracias!! perfecto ya funciona 🙂

albertosualis

Hay alguna solución para esto? A mí no me deja agregar el script de Desplazamiento me dice lo de isvisiblefrom. Lo solucioné viendo el video y poniendo static en el RendererScript. Peeeero el Renderer Script me saltan 2 errores:
1-Assets/Scripts/RendererExtensions.cs(14,47): error CS0246: The type or namespace name `Renderer’ could not be found. Are you missing a using directive or an assembly reference?
2-Assets/Scripts/RendererExtensions.cs(14,66): error CS0246: The type or namespace name `Camera’ could not be found. Are you missing a using directive or an assembly reference?
Espero quehaya alguna solución, no se me ocurre nada. Muchas gracias de ante mano. El blog es buenisimo y los tutoriales ayudan bastante. Un saludo!

Al3

Se soluciono el problema! omití ese paso, seguí viendo el vídeo y agregue el script (RendererExtensions) y da la casualidad que agrego el anterior script (desplazamiento) el que me daba este problema y se agrega al “Plano Fondo” sin ningún problema, con su (Velocidad) (Dirección)..etc
Seguro tienes una explicación para ello! igual Gracias por los Vídeos =)

Al3

Buenas! Amigo tengo el problema del “IsVisibleFrom” de la manera como tu agregas el script en ese vídeo! también intente agregarlo de la otra manera que es en “add component” este se agrega sin problemas pero no me salen los comandos de (Velocidad) ni (Direccion) y menos (Es Ciclico) ademas cuando inicio el juego marca error si esta agregado este script de desplazamiento! he seguido tus pasos al pie de la letra pero no se que sucede aquí, lo único distinto que vi es que en tu Vídeo el Script se ve algo diferente al que publicas aquí!

Juan

My spouse and i have been now estiatcc Edward could complete his researching through your precious recommendations he got from your very own weblog. It’s not at all simplistic to simply be giving freely secrets the others might have been trying to sell. And we all know we have the blog owner to thank for that. All of the explanations you made, the simple web site menu, the relationships you can give support to promote it’s mostly astounding, and it’s really letting our son in addition to our family consider that that theme is enjoyable, and that’s very vital. Thank you for the whole lot!

vanesaindica

Julio, me habia subestimado nada he arreglao algunas coordenadas por aquí y por allá del código y se me van repitiendo al fin. 🙂 gracias de todos modos.

Vanesa

Hola Julio, haces muy bien en explicar Unity para la gente de habla española, he mirado videos en inglés y la verdad que es más comódo entender los detalles con tus videos. Muy útiles, gracias. Tengo una pregunta sobre el código del Script de Desplazamiento, resulta de que estoy siguiendo los videos pero con el juego en vértical, o sea que todo lo que aplicas para las variables X yo lo hayo para las Y, pasándolo por el inspector .Por ahora no tengo problemas funciona perfectamente menos el desplazamiento paralalelo del fondo claramente no se me repite. He visto esta nota:
// Nota: Esto solo funciona con el desplazamiento horizontal.
Me gustaria saber si podría cambiar algo en este Script para que me funcionase yendo el juego para arriba y no hacia la derecha.
Un saludo y espero que sigas explicando cositas.

superzuman

Muchas gracias me estan ayudando mucho esta tutoriales