Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Necesito ayuda sobre Main Camera

Iniciado por Makiru, Febrero 25, 2017, 03:04:59 AM

Tema anterior - Siguiente tema
Hola a todos, creo que algunos de vosotros y conoce el juego de Sky force, me pregunta es sobre como hacer la camara siga la nave? pero sin salir del mapa del juego, seguir la nave a la izquierda o derecha, asi aparece la parte izuierda o derecha del mapa, como la de sky force. completar el mapa restante cuando te vas a la izquierda o derecha.
 
si quereis saber de lo que hablo solo ver el video y me vais a entender, agradeceria mucho si me ayudais como hacerlo Gracias. 
 


   
eature=oembed" width="480">

 
 

Febrero 25, 2017, 04:27:42 AM #1 Ultima modificación: Febrero 25, 2017, 04:49:29 AM por ytinU
Pues creo que es así..
 

//script de la camara
public Transform nave;//pones la nave desde el inspector
private void Update()
    {
        transform.position = new Vector2(nave.transform.position.x,nave.transform.position.y);//esto hace que siga a la nave
        float a = Mathf.Clamp(transform.position.x, -2, 2); // pones una variable para los limites del eje X
        transform.position = new Vector2(a,transform.position.y);// actualizas el transform con los limites
    }

 
lo que quieres hacer lo hace el Math.Clamp(); recibe 3 parametros el primer es el valor al que quieres acceder y los 2 sgts son el minimo y maximo de ese valor.Lo que hago ahí es que el transform.position.x este en el rango de (-2,2), si transform.position.x es un valor superior a 2(por ejem. 35) este te devolvera 2 y lo mismo pasa con los negativos, claro los parametros los pones de acuerdo al tamaño de tu mapa.

@ytinU Ya te lo soluciono, para sumar dos puntitos podes agregar el efecto smooth mediante interpolacion que siempre queda bien ;) en x y en y si quisieras:
 

float factorLerp = 0.2f;   //0.85 fuerte , 0.01f super suave
float limite = 2;
Transform m_transform;
Transform m_naveTransform;
void Start()
{
m_transform = transform;
m_naveTransform = nave.transform;
}
void Update()
{
  m_transform.position = new Vector2(   
     Mathf.Lerp(m_transform.position.x , m_naveTransform.position.x ,factorLerp),
     Mathf.Lerp(m_transform.position.y , m_naveTransform.position.y ,0.8f)   //bien duro el factor para que lo siga casi instantaneamente
  );   
  m_transform.position = new Vector2(   Mathf.Clamp(m_transform.position.x, -limite, limite) ,   transform.position.y);
}

 
Si lo queres exactamente como el video deberias ir incrementando la "pos y" de la camara, esta afecta (o no, no estoy seguro) a la pos y de la nave cosa que jamas nave quede fuera de la camara (con una "pos y" menor)

waw que rapidos, voy a probarlo, soy algo malo con los scripts ya que uso mas el playmaker algo para bagos pero me gusta mas. lo pruebo y eso cuento 
 
 
 
gracias

Cita de: ytinU date=1487993262Pues creo que es así..
   
   

//script de la camara
public Transform nave;//pones la nave desde el inspector
private void Update()
    {
        transform.position = new Vector2(nave.transform.position.x,nave.transform.position.y);//esto hace que siga a la nave
        float a = Mathf.Clamp(transform.position.x, -2, 2); // pones una variable para los limites del eje X
        transform.position = new Vector2(a,transform.position.y);// actualizas el transform con los limites
    }

   
      lo que quieres hacer lo hace el Math.Clamp(); recibe 3 parametros el primer es el valor al que quieres acceder y los 2 sgts son el minimo y maximo de ese valor.Lo que hago ahí es que el transform.position.x este en el rango de (-2,2), si transform.position.x es un valor superior a 2(por ejem. 35) este te devolvera 2 y lo mismo pasa con los negativos, claro los parametros los pones de acuerdo al tamaño de tu mapa.
   


Me ha funcionado pero hay un problema, tengo creado un gameobject vacio, donde tengo la vave y la main camera, ese gameobjet su funcion es ir hacia arriba tipico de avioneta arcad, al ponerle el script este la main camera se aueda quieta ya no va hacia arriba como debe ser, pero si funciona lo de izquiera y derecha, es lo unico que falta. estoy trabajando bajo Andoid.
 
Cita de: lightbug date=1488022652@ytinU Ya te lo soluciono, para sumar dos puntitos podes agregar el efecto smooth mediante interpolacion que siempre queda bien ;) en x y en y si quisieras:
   
   

float factorLerp = 0.2f;   //0.85 fuerte , 0.01f super suave
float limite = 2;
Transform m_transform;
Transform m_naveTransform;
void Start()
{
m_transform = transform;
m_naveTransform = nave.transform;
}
void Update()
{
  m_transform.position = new Vector2(   
     Mathf.Lerp(m_transform.position.x , m_naveTransform.position.x ,factorLerp),
     Mathf.Lerp(m_transform.position.y , m_naveTransform.position.y ,0.8f)   //bien duro el factor para que lo siga casi instantaneamente
  );   
  m_transform.position = new Vector2(   Mathf.Clamp(m_transform.position.x, -limite, limite) ,   transform.position.y);
}

   
      Si lo queres exactamente como el video deberias ir incrementando la "pos y" de la camara, esta afecta (o no, no estoy seguro) a la pos y de la nave cosa que jamas nave quede fuera de la camara (con una "pos y" menor)
   


muchas gracias pero no e ha funcionado, Assets/movecamera.cs(6,7): error CS0116: A namespace can only contain types and namespace declarations
 
Mismo error en muchas lineas

Cita de: Makiru date=1488052772Me ha funcionado pero hay un problema, tengo creado un gameobject vacio, donde tengo la vave y la main camera, ese gameobjet su funcion es ir hacia arriba tipico de avioneta arcad, al ponerle el script este la main camera se aueda quieta ya no va hacia arriba como debe ser, pero si funciona lo de izquiera y derecha, es lo unico que falta. estoy trabajando bajo Andoid.
   
   
      muchas gracias pero no e ha funcionado, Assets/movecamera.cs(6,7): error CS0116: A namespace can only contain types and namespace declarations
   
   
      Mismo error en muchas lineas
   


Nunca penses que alguien te va a dar "EL" script que va a hacer justo lo que quieras (ojo quizas si) y que das ctrl C ctrl V, trata de entender que es lo que hace cada linea del codigo que te pasan, crear la idea o el plan, eso que subi desde el punto de vista de la sintaxis tiene errores (nave no esta definida ni declarada en ningun lugar),el paso logico que debes hacer es:
 
1- abrir google
 
2 - sabes que hace clamp? si no es asi "unity + clamp".
 
3 - sabes que es un transform? si no es asi "unity + transform"
 
y asi...
 
Saludos

gracias, pero lo que busco es algo sencillo, ya he dicho que trabajo con playmaker, lo dije antes pero gracias por la leccion de google, si deverdad no te molesta no hay de malo en ayudarme si quieres claro.
 
Gracias de todas formas
 
Cita de: lightbug date=1488053893Nunca penses que alguien te va a dar "EL" script que va a hacer justo lo que quieras (ojo quizas si) y que das ctrl C ctrl V, trata de entender que es lo que hace cada linea del codigo que te pasan, crear la idea o el plan, eso que subi desde el punto de vista de la sintaxis tiene errores (nave no esta definida ni declarada en ningun lugar),el paso logico que debes hacer es:
   
   
      1- abrir google
   
   
      2 - sabes que hace clamp? si no es asi "unity + clamp".
   
   
      3 - sabes que es un transform? si no es asi "unity + transform"
   
   
      y asi...
   
   
      Saludos
   


tengo mi proyecto casi terminado, solo era una opcion OPCIONAL que queria añadir al juego, no es algo que importante, si aguien me ayuda con ello, aparecera su nombre en los creditos si quiere claro

Cita de: Makiru date=1488054237gracias, pero lo que busco es algo sencillo, ya he dicho que trabajo con playmaker, lo dije antes pero gracias por la leccion de google, si deverdad no te molesta no hay de malo en ayudarme si quieres claro.
   
   
      Gracias de todas formas
   
   
      tengo mi proyecto casi terminado, solo era una opcion OPCIONAL que queria añadir al juego, no es algo que importante, si aguien me ayuda con ello, aparecera su nombre en los creditos si quiere claro
   


Jaj no lo que te puse no es para regañarte ni nada por el estilo, es porque es muy comun ver que a alguien le falta algo, y pide un script, despues le pasas un pseudocodigo de script y te dice "che, pero tiene errores" y claro que tiene errores, es mas cuando recien me registre en el foro pasaba scripts con errores a proposito o si estaban en javascript los pasaba en c#, para que jamas jamas jamas copien y peguen scripts, al final no sirve de nada porque alguien hace el trabajo por ti y si queres personalizarlo o modifcarlo no sabes como, lo que vale es la idea que tuvo quien te paso el script, yo cuando lei tu topic no sabia como hacer el efecto o me lo imaginaba de otro lado, cuando vi el post de ytinU dije "ah claro con clamp se logra facil".
 
Si ya tenes el proyecto casi terminado te conviene seguirlo por tu cuenta. mucha suerte!
 
 

Cita de: lightbug date=1488055252Jaj no lo que te puse no es para regañarte ni nada por el estilo, es porque es muy comun ver que a alguien le falta algo, y pide un script, despues le pasas un pseudocodigo de script y te dice "che, pero tiene errores" y claro que tiene errores, es mas cuando recien me registre en el foro pasaba scripts con errores a proposito o si estaban en javascript los pasaba en c#, para que jamas jamas jamas copien y peguen scripts, al final no sirve de nada porque alguien hace el trabajo por ti y si queres personalizarlo o modifcarlo no sabes como, lo que vale es la idea que tuvo quien te paso el script, yo cuando lei tu topic no sabia como hacer el efecto o me lo imaginaba de otro lado, cuando vi el post de ytinU dije "ah claro con clamp se logra facil".
   
   
      Si ya tenes el proyecto casi terminado te conviene seguirlo por tu cuenta. mucha suerte!
   
   
       
   


A mi me gustaria saber como has construido el algoritmo, sin necesidad de programacion, si me puedes decir como lo has pensado te lo agradeceria.
 
otra cosa, entiendo que hay gente copiar y pegar es lo que hice yo, trabajo mas con construt 2, al ver e playmaker de unity me gusto probarlo y es lo que uso, hacer una combinacion de FSM. 
 
yo soy sincero, he probado unity con playmaker y me gusto, solo que no he podido hacer lo que he pedido
 
Gracias 

Febrero 25, 2017, 10:11:15 PM #9 Ultima modificación: Febrero 25, 2017, 10:12:41 PM por lightbug
Cita de: Makiru date=1488056196A mi me gustaria saber como has construido el algoritmo, sin necesidad de programacion, si me puedes decir como lo has pensado te lo agradeceria.
   
   
      otra cosa, entiendo que hay gente copiar y pegar es lo que hice yo, trabajo mas con construt 2, al ver e playmaker de unity me gusto probarlo y es lo que uso, hacer una combinacion de FSM. 
   
   
      yo soy sincero, he probado unity con playmaker y me gusto, solo que no he podido hacer lo que he pedido
   
   
      Gracias 
   


Mira el de la idea es @ytinU, pero si queres te explico el script es relativamente sencillo.
 
- Mathf.Lerp devuelve un float hace interpolacion es decir si el limite te da un numero entre dos limites, determinado por el factor, si el factor es 0.5 te da siempre la mitad. Es decir (limite sup + limite inf) * factor, (con factor menor a 1). El truco es poner como limite inferior un valor variable, en este caso la posX, entonces con el paso del tiempo te da ese efecto suavizado. con [0 , 1] y factor 0.5 te daria : 0.5 , 0.75 , 0.875 , 0.9375 .... ves como va acercandose a 1 de forma suavizada. Eso lo dije para que la camara siga a la nave horizontalmente no de golpe.
 
- Mathf.Clamp devuelve un float que siempre esta entre dos limites sup e inf, si lo que le pasaste de argumento (variable claro sino no tiene sentido) esta dentro del rango vale lo mismo. Si se pasa del rango por encima vale el limite superior, caso contrario para abajo valdra el limite inferior. En el ejemplo si la posX es menor a -2 la posX vale -2 sin importar que, (igual para >2). Podes usar rangos respecto a la pos Inicial lo cual es mejor ya que independizas la posicion inicial.
 
La logica del porque usas cada uno es para obtener movimiento suave y limitado en un rango, esta seria la explicacion de porque se usan las funciones de arriba.
 
En resumen aca tenes todo bien explicado
 
https://docs.unity3d.com/ScriptReference/Mathf.html
 
saludos
 
 

Cita de: lightbug date=1488057075Mathf.Lerp devuelve un float hace interpolacion es decir si el limite te da un numero entre dos limites, determinado por el factor, si el factor es 0.5 te da siempre la mitad. Es decir (limite sup + limite inf) * factor, (con factor menor a 1). El truco es poner como limite inferior un valor variable, en este caso la posX, entonces con el paso del tiempo te da ese efecto suavizado. con [0 , 1] y factor 0.5 te daria : 0.5 , 0.75 , 0.875 , 0.9375 .... ves como va acercandose a 1 de forma suavizada. Eso lo dije para que la camara siga a la nave horizontalmente no de golpe.
   
   
       
   


Ahora sí entendi que con las doc. de unity me enredaba más.. supongo que Slerp hace lo mismo? NO.. tendrá algo diferente pero no sé que.

Cita de: ytinU date=1488058040Ahora sí entendi que con las doc. de unity me enredaba más.. supongo que Slerp hace lo mismo? NO.. tendrá algo diferente pero no sé que.
   


Lerp usa interpolacion lineal, SLerp utiliza interpolacion esferica solo para vectores por obvias razones:
 
" Interpolates between a and b by amount t. The difference between this and linear interpolation (aka, "lerp") is that the vectors are treated as directions rather than points in space. The direction of the returned vector is interpolated by the angle and its magnitude is interpolated between the magnitudes of from and to. "
 
Es decir que hace lo mismo que la lineal pero entre dos direcciones(formadas por vectores) tomando sus angulos. por eso se usa para vector3.

Cita de: lightbug date=1488058318Es decir que hace lo mismo que la lineal pero entre dos direcciones(formadas por vectores) tomando sus angulos. por eso se usa para vector3.
   


Ohh..Entendido, usaré Quaternions.Slerp para darle más realismo a mis juegos, ya que antes apuntaban de inmediato y tenia que retrasar el disparo.

Cita de: ytinU date=1488058737Ohh..Entendido, usaré Quaternions.Slerp para darle más realismo a mis juegos, ya que antes apuntaban de inmediato y tenia que retrasar el disparo.
   


Yo para no usar los quaternions que al principio estaba aterrado de usar hacia Lerp sobre los eulerAngles jajaj, pero el Slerp es mas adecuado supongo.

Llevo unos 4 o 5 años aterrado de ellos ,sigo usando los eulerAngles mas que nada por que ya me acostumbre a ellos ^^ @lightbug

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Etiquetas: