Jump to content
Crosfex

!Renderer.IsVisible en el primer frame.

Recommended Posts

Hola chicos,

Presento el siguiente caso:

image.png

Como ven a continuación, estoy realizando un I wanna be y quiero imitar el movimiento de la cámara, que al tocar el borde derecho se traslada de posición hacia la derecha y el borde izquierdo hacia la izquierda.

Se me había ocurrido utilizar (para practicar mas comandos y explorar unity) Renderer.isVisible, donde en el script del personaje, hay un método llamado "cameraMov" que detecta de que lado de la cámara sale y es invocado en el método Update.

La cuestión es que en el primer frame no detecta al personaje (Renderer.isVisible = false), por lo que si dejo el objeto (antes de ejecutar el juego) a la izquierda de la cámara, la cámara se traslada a la izquierda, y lo mismo si lo dejo a la derecha.

image.png

Intente mil formas pero no se me ocurre ya como solucionarlo

Si se les ocurre alguna idea, una solución, u otra forma de resolverlo, estaría muy agradecido con ustedes.

Muchas gracias por leer

Share this post


Link to post
Share on other sites

Puedes obtener los límites de la cámara y luego comprar si el personaje está fuera del límite minx o maxx

using UnityEngine;
 
 public static class Extensions
 {
     public static Bounds OrthographicBounds (this Camera camera)
     {
         if (!camera.orthographic)
         {
             Debug.Log(string.Format("The camera {0} is not Orthographic!", camera.name), camera);
             return new Bounds();
         }
 
         var t = camera.transform;
         var x = t.position.x;
         var y = t.position.y;
         var size = camera.orthographicSize * 2;
         var width = size * (float)Screen.width / Screen.height;
         var height = size;
 
         return new Bounds(new Vector3(x, y, 0), new Vector3(width, height, 0));
     }
 }

ver https://answers.unity.com/questions/501893/calculating-2d-camera-bounds.html

Share this post


Link to post
Share on other sites

Agradezco la respuesta, y es una muy buena idea, pero pude resolverlo de otra manera, igual antes:

Otra cosa curiosa que note en mi código, es que en el numero 19.5f que le asigno, si lo cambio, cambio la distancia que se necesita entre la camara y el personaje para que la camara cambie de posicion (en vez de cambiar cuando el personaje esta a 19.5f, si lo cambio a 100, el personaje tiene que distanciarse 100 unidades para que aplique el cambio) a sabiendas de que ese numero no se encuentra dentro de la condición.

mi camara es ortografica y tiene 4 de tamaño. Calcule las coordenadas a mano y tiene un rango de 20 puntos de coordenada en el eje de las X de izquierda a derecha.

La solucion que encontre fue la siguiente:

En vez de preguntarle si el personaje esta adelante o atras de la camara en el eje de las X, cuando el personaje no es visible, fui mas concreto.

Si el personaje se encuentra a 10 puntos X (el largo de la camara dividido 2) mas que la camara, entonces que desplace la camara 20 puntos X (dejaria al personaje en el extremo izquierdo de la camara) y viceversa

        if(!sprite.isVisible && transform.position.x > cam.transform.position.x + 10f)
        {
            cam.transform.position = new Vector3(cam.transform.position.x + 20f, cam.transform.position.y, cam.transform.position.z);
        }
        if (!sprite.isVisible && transform.position.x < cam.transform.position.x - 10f)
        {
            cam.transform.position = new Vector3(cam.transform.position.x - 20f, cam.transform.position.y, cam.transform.position.z);
        }

 

Agradezco de corazón tu respuesta Francoe1, espero en un futuro poder utilizarla

Share this post


Link to post
Share on other sites

yo igual lo habria hecho con unos box collider (trigger) que ocupen toda la escena (cada "rectangulo" de escena)

y al entrar en cada collider (onTriggerEnter) mover la camara a la nueva posicion (quizas con un Vector3.Lerp) que esa posicion seria seguramente el centro de cada collider

ademas podrias aprobechar esos trigger para activar/desactivar cosas de cada "rectangulo" o de sus vecinos... sonidos, animaciones, o recolocar plataformas de las que se mueven... volver a poner en su sitio pinchos (o manzanas) de los que se caen... ese tipo de cosas de los "i wanna be"

porcierto yo siempre he tenido en mente hacer un "i wanna be", me parecen divertidos y no son dificiles de hacer, es muy posible que completes el proyecto, que lo termines, es una buena eleccion de proyecto.

  • Thanks 1

Share this post


Link to post
Share on other sites

Me gusto mucho tu idea, es una herramienta bastante útil utilizar box colliders, voy  a probarla y ver como puedo implementarla

A mi siempre me gustaron los I wanna be's, y nunca pude realizar un juego completo (solo juegos como pong, tetris entre otros, que son "ejercicios" mas bien) y necesito desarrollar mucho mas mis skills en codigo.

Lo unico que me frena de todo esto es que no tengo diseñadores, quienes hacian los diseños eran mis amigos, pero tuve encontronazos con ellos y me separe amistosamente de ellos, y murio el proyecto.

Ahora, solo, quiero realizar este I wanna be, pero aprendiendo todo, tanto diseño, como mejorando en programacion.

Es un reto que me va a llevar un tiempo, pero es un reto que vale la pena.

Muchas gracias chicos n.n

Share this post


Link to post
Share on other sites

@francoe1

si, tienes razon.

es muy sencillo, ademas en los "i wanna be" los "rectangulos" son siempre del mismo tamaño asi que no haria falta tampoco usar los "bounds" de la camara...

bastaria con saber cuanto mide el rectangulo y hacer unos sencillos calculos (usando la posicion del player) para saber en que rectangulo estas y colocar la camara en la posicion correspondiente.

lo del box collider que dije antes fue lo primero que se me ocurrio. pero es mejor igual hacerlo "matematicamente"

Edited by Igor
  • Thanks 2

Share this post


Link to post
Share on other sites

Sea cual sea la idea, siempre es bienvenida a la hora de resolver un problema de codigo.

Gaste mas o menos recursos, mas o menos practico.

Las ideas son importantes y gracias a ello se llega a la conclusion.

Soy nuevo en este sitio, pero acudi aqui porque veo que son una buena comunidad que se ayuda.

Sin mas preambulos, muchas gracias y disfruten del dia (o la noche, lo que sea que sea en su lugar)

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...