Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda con un script en Unity 4.6

Iniciado por Ítizhor, 05 de Abril de 2015, 02:26:16 PM

« anterior - próximo »

Ítizhor

DUDA RESUELTA

¡Buenas!

Veréis, estoy envuelto en un proyecto de Unity desde hace algo más de un mes (el primero) y me he atascado con un script en concreto. Es un 2D runner, y estoy programando código para que una baldosa aparezca cada "x" espacio en la coordenada X para que genere un suelo continuo en el borde inferior de la pantalla.

Lo tengo así:

using UnityEngine;
using System.Collections;

public class BaseGenerator : MonoBehaviour
{
   public GameObject terrain;

   public Transform mainCamera;

   float i = 0;

   // Use this for initialization
   void Start ()
   {

   }
   
   // FixedUpdate is called once per time unit
   void FixedUpdate ()
   {
      Generate ();
   }

   // Generate the base terrain
   void Generate()
   {
      if (mainCamera.position.x == i)
      {
         Instantiate (terrain, new Vector2 (mainCamera.position.x + 13.35f, mainCamera.position.y - 4.56f), Quaternion.identity);
         i += 4.95f;
         Debug.Log (i);
      }
   }
}

Básicamente, hay tres objetos que es necesario indicar: la cámara, el terrain (ambos aparecen al principio del script) y el GameObject vacío que sirve de instanciador.

Como el generador está anidado en la cámara (parentado en la jerarquía), se mueve con respecto a esta y toma como referencia de coordenadas también la misma, de modo que en el Transform del GameObject las variables de posición no cambian. Así, y dado que lo que hace el script es generar las baldosas a medida que el instanciador avanza, he de indicar en el if las coordenadas de la cámara puesto que las del GO están estáticas (sé que se podría aplicar un script a la cámara diciéndole que crease en ese punto los terrains directamente, pero ya habrá tiempo para los arreglos cuando esto esté resuelto).
Además, he añadido al final un Debug.Log para recibir las notificaciones pertinentes por consola (lo eliminaré cuando por fin funcione).

El problema es que perfecto, genera la primera baldosa, la consola reporta el incremento de i (lo que significa también que el script reconoce la condición del if como correcta)... y ya está. No crea más terrains. Es como si el Generate solo se quisiera activar una vez.

Las dos posibles soluciones que soy capaz de intuir (que no de aplicar completamente, como este post evidencia jajaja) son:
-o que hay algo mal indicado en, probablemente, la función Generate,
-o que no he incluido la función correctamente en Start, Update o donde sea (tampoco acabo de comprender del todo las aplicaciones prácticas de cada una, conozco la teoría y lo que hacen a nivel de concepto pero luego me cuesta aplicarlo sin ayuda en algunos casos). Supongo que será en FixedUpdate (así es como está escrito, de hecho), pero no estoy del todo seguro.

Agradecería muchísimo ayuda de cualquier tipo, porque llevo ya varios días dándole vueltas, probando, buscando información y preguntando por ahí y nada. Todo iba rodado (más o menos jeje) hasta aquí, y veo que lo que tengo que hacer a continuación también es más sencillo, así que este bache me tiene "jodío".

¡Saludos!

Darago_malaga

#1
Yo creo que el problema va a estar cuando compruebas el valor de la posicion X de la camara con el valor i. Y es posible que solo sean iguales cuando el valor es 0. Cuando mueves la camara, supongo que por medio del teclado, es posible que el valor de la camara nunca sea exactamente 4.95f.

Has intentado hacer la comparacion con un rango???

If(mainCamera.position.x>(i-0.5) && mainCamera.position.x<(i+0.5))

o simplemente cuando sobrepase el valor de i

if (mainCamera.position.x >= i)

Ítizhor

¡Oh, gracias! De verdad, no sabes cuánto te lo agradezco. Mira que lo pensé, pero me pareció algo tan "de cuenta de la vieja" que no pensé que realmente el programa podría estar saltándose valores.

Finalmente quedó así, aplicado a la misma cámara para ahorrarme el GameObject:

using UnityEngine;
using System.Collections;

public class BaseGenerator : MonoBehaviour
{
   public GameObject terrain;

   float c = 0;

   // FixedUpdate is called once per time unit
   void FixedUpdate ()
   {
      Generate ();
   }

   // Generate the base terrain
   void Generate ()
   {
      if ((transform.position.x > c - 1) && (transform.position.x < c + 1))
      {
         Instantiate (terrain, new Vector2 (c + 13.35f, -4.56f), transform.rotation);
         c += 4.95f;
      }
   }
}

Y otra vez, ¡gracias!

Darago_malaga







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.