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!
amigo pusiste una parte del codigo que no reconocia y tuve que borrar y me quito el error, era esto: EfectosDeSonido.Instancia.ReproducirSonidoRayo();
Gracias por la aclaración 🙂
ya te lo mande por facebook amigo
Te respondí 🙂
TAMBIEN YA LO CAMBIE POR RENDERER.ISVISIBLE Y ME SIGUE SALIENDO ERROR AMIGO
Colocá aquí el error que te sale en Console para poder entenderlo
________________________________
ok
entonces ???
Donde está la imagen? mandame un correo https://singletechgames.com/contacto/
YA TE MANDE LA IMAGEN AMIGO
ok
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
Hola, si lo que pasa es que no encontre ninguna imagen, mandame un correo o pasame el link de la imagen para poder verlo, no me ha llegado nada
este es, lo puedes ver???
________________________________
Solo veo una línea
Te lo mandare por facebook ok????
🙂
buenas tardes amigo, disculpa, me sale error en la linea 98 , nose que pase, podrias ayudarme porfavor?
¿Cúal es el error?
hi sl2
sl2 😉
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
Si ha cambiado un poco el codigo desde el 2013 que publique este vídeo, ahora es http://docs.unity3d.com/ScriptReference/Renderer-isVisible.html
sería renderer.isVisible
Como solucionaron el tema del desplazamiento en paralelo de forma vertical?
Buenos tutos
Bueno yo no lo vi, pero no creo que sea tan dificil, es solo rotar y utilizar el eje Y en vez del eje X
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
Fijate en el ultimo video de Flappy Bird, Los tubos los hago reaparecer de forma aleatoria de forma simple, para que el pajaro siga teniendo obstaculos http://singletechgames.com/2014/06/06/un-flappy-bird-con-c-en-unity-2d-parte-3/
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 🙂
Genial, yo hasta ahora no he tenido ningun proyecto que me pida acelerometro, pero imagino que debe ser facil en unity
Muchisimas gracias!! perfecto ya funciona 🙂
🙂
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!
Borra RendererExtensions y vuelve a crearlo desde Unity, cuentame como te va 🙂
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 =)
Mi expliación: Cosas del orinoco XD
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í!
:O
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!
OMG! XD
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.
Ok 🙂
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.
^_^
Muchas gracias me estan ayudando mucho esta tutoriales
de nada 🙂