[Unity] Duda:Inicialización de objetos y WheelColliders

Fadolf

¡Buenas!

Llevo bastante tiempo leyendo este subforo, y hasta ahora no me había atrevido a participar en él. Quizás venga bien un poco de presentación: estoy en cuarto de Grado de Ing. Informática y como trabajo de fin de grado, TFG, he decidido hacer un simulador de conducción, que aún está por ver si lo oriento hacia el mundo de las carreras, o bien hacia algo similar al EuroTruck Simulator.

Para este proyecto, decidí usar Unity, y la verdad es que sabiendo un poco de POO como es mi caso, se hacen pruebas de concepto rápidamente, con los materiales ya proporcionados por el editor. Pero me han surgido dos problemas que relato a continuación:

Situación 1:

Sin embargo, me he encontrado con un problema al que todavía no he encontrado solución, y es la instaciación de scripts, sobre todo aquellos que derivan de MonoBehaviour, y el paso de argumentos. Por lo que he visto, no hay constructores en Unity, y este tipo de comportamientos deben ser creados de la forma:

gameObject.AddComponent<NombreClase>();

Esto no solo añade el comportamiento al gameObject, sino que lanza todo el flujo, pasando por Awake(), Start() y finalmente alguno de los tipos de Update().

El problema, es que si cogemos la referencia anterior, y accedemos a sus atributos públicos con la notación . , los modificaremos, pero no a tiempo, no antes de llegar a Update().

Buscando algún método de sincronización, y creo que no he encontrado algo similar a Wait(event), solucioné el problema con un flag, mientras el cual esté desactivado, no hace nada en update. Mientras, voy inicializando los atributos y una vez estén todos, activo el flag.

Entonces, mi primera duda es: ¿Hay alguna forma en Unity de pasar argumentos en la inicialización de una clase? (en particular de MonoBehaviour o derivadas).


Situación 2:

El otro problema, viene con los WheelColliders. La estructura para un coche vendría a ser algo así:

Coche (conteniendo un RigidBody, y los scripts de conducción).
-Chasis
-GrupoRuedas
--4 Mallas de rueda (representación visible).
-WheelColliders
--4 WheelColliders (cálculo de físicas).

Una vez puestos en situación, decidí crear un script que me facilitara la tarea de adición de coches al juego. El script en cuestión hace lo siguiente al añadirse a un GameObject:

(1)Añade un RigidBody al coche.
(2)Por cada malla que encuentre que represente una rueda, obtiene su posición y añade un WheelCollider.

He aquí el problema, al hacer

wheelColliders.AddComponent<WheelCollider>();

Se queja diciendo que un WheelCollider, necesita un Rigidbody para funcionar, pero, eso ya lo hice en el paso 1.

Error: "WheelCollider requieres an attached Rigidbody to function"

Esto ocurre durante 2 frames, pero luego parece ser que funciona perfectamente, y el coche en cuestión, tiene todos los componentes necesarios para funcionar.

No obstante, buscando el error, parece ser que el fallo viene de que el componente superior, no estando activado al añadir el WC.

Llamar a gameObject.setActive(true), no parece funcionar, así que por eso acudo a vosotros, a ver si alguno ha tenido un problema similar.


Ante todo, perdón por el tocho post, y muchas gracias por la ayuda.

1
MrPacoPorras

Para los dos casos la solución es la misma : Prefabs.

Unity espera que tu crees esos prefabs en una escena, los guardes y luego los instancies, Por ejemplo: Instantiate(myCoche, posicionCoche, RotacionCoche).

Monobehavior como tal, tiene la inicialización en el Awake, Start y OnEnable, OnBecameVisible (basado en render). Puedes usar cualquiera, teniendo en cuenta que van en ese orden.

Si quieres que se configure en base a algo, siempre puedes hacer que lo busque desde su propio Start.

Otra opcion es crear una funcion de inicializacion dentro del monobehavior y llamar a esa funcion.

Por ejemplo:

MyScript coche = Instantiate(CochePrefab, cochePosition, CocheRotacion) as MyScript.

Eso a veces no funciona bien, si no funciona puedes instanciarlo como GameObject, y luego llamar al GetComponent<MyScript>() as MyScript

1

Usuarios habituales

  • MrPacoPorras
  • Fadolf