Noticias

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

Mi prefab no adquiere por código un Rigidbody

Iniciado por lozdanmultimedial, Mayo 08, 2017, 02:25:05 PM

Tema anterior - Siguiente tema
Mayo 08, 2017, 02:25:05 PM Ultima modificación: Mayo 08, 2017, 10:42:40 PM por pioj
HOla a todos
 
El problema es el sigueinte:
 
deseo que en determinada escena los prefabs que se instancian en el codigo adjunto, adquieran por código un Rigibody.
 
Esto está programado en lineas 56 a la 65
 
cuando hago correr la aplicación, los prefabs se instancian pero sin Rigidbody. En la versión anterior las lineas 56 a la 65 estban colocados en el "Start" pero tampoco funcionaba y creo que es lógico por que el prefab se instancia en la linea 54.
 
Alguien podría ayudarme?
 
 
 
Muchas gracias a todos.
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=10484" data-fileid="10484" rel="">NACER.cs

No entiendo muy bien donde está el problema. Creas el prefab en la escena (con rigidbody), luego lo guardas como prefab. Me imagino que tendrás un public gameobject para poder asignar el prefab para instanciarlo durante el transcurso de la partida.
 
Cuidado porque no necesariamente todas las lineas de un código se leen. Si, por ejemplo, tienes in invoke o llamas un void() la línea que le sigue a ese invoke o llamada de void no se leerá y el monodevelop no te avisará de ello en la consola de errores (cosa que sí avisa, por ejemplo, con el return).
 
Si quieres que realmente te podamos ayudar tendrás que postear el script para poder detectar el error y, en su caso, testearlo para comprobar nosotros mismos el error. En el caso de que no quieras publicarlo (ya sabemos que la gente suele sobrevalorar sus códigos y son recelosos a compartirlos) siempre te queda usar el debug.log() para confirmar que efectivamente se está leyendo dicha línea de código.

Ami me parece que es un problema de referencia; es decir, no esta referenciado el GameObject instanciado, al que le vas agregar el Rigidbody, me explico utilizas robot[elegido] que debe ser el prefab que se va instanciar, y luego utilizas este mismo para agregarle el componente Rigidbody, pero no es a este que le quieres agregar el componente, sino al GameObject que ahora esta en la escena. Debes poner algo como esto "GameObject prefab = (GameObject) Instantiate(robot[elejido],new Vector3(x,y,z),Quaternion.identity);", entonces a esta referencia ya puedes agregarle los componentes.

GRacias Antonio y CAesar por responderme.
 
Antonio el código lo adjunté, está como archivo adjunto para que pueda ser leido y testeado.
 
Caesar voy a probar lo que me decis, si creo que esa es la cuestión robot[elejido] es el prefab que construi ( son 5 en realidad por eso armé un array ) y el que se instancia en escena es un digamos un "clon".
 
Muchas gracias.

Esa puede ser una solucion. Pero sigue creyendo que no es necesario acceder a los components desde el script cuando si el prefab tiene rb aparecera con rb. Porque entiendo que el rigidbody lo quieres activo desde que se instancia. 
 
 
 
Otra cosa que he visto leyendo tu codigo es que solo usas el void update. No es algo erroneo pero personalmente prefiero usar void() propias que activo desde el update cuando unicamente lo necesito. Es decir, si quieres calcular un random number no lo calcules en el update xque te calculara el numero cada frame (que vale que siempre da el mismo hasta el fin de la escena). Pero creo que si se puede calcular una vez y no correrlo cada frame hara que tu juego fluya mejor. Y eso que te ahorras en limpiar codigo al final del desarrollo. 
 
 
 
Otra cosa, es recomendable que instancies los clones como hijos del objeto que contiene el script (digamos el gamemanagment que es un gameobject sin componentes). Asi lo tendras mas ordenado y podras modificarlos mas facilmente desde el propio gameobject. 
 
Son consejos personales. Cada uno tiene su estilo y se ordena como mejor le va. Pero yo que soy muy desordenado codificando me tengo que dar con la vara para evitar crear un caos que ni yo pueda entender. 

Mayo 08, 2017, 07:14:02 PM #5 Ultima modificación: Mayo 09, 2017, 02:20:48 AM por pioj
Jajajajja, si es coerto tienes toda la razón Antonio, debería hacer como tu dices y así tb mejorar la perfomance de la app.
 
Una pequeña y mala escusa es que esto es si o si para mañana. Ahora los robots se instancian bien pero tengo un problema del tipo "efectos colaterales" jjaja y es que los robots me rebotan conra el terreno, estoy viendo como solucionarlo y aun no encuentro la forma.
 
por el momento esa parte del codigo está así:
 

 GameObject robot_escenico = (GameObject) Instantiate(robot[elejido],new Vector3(x,y,z),Quaternion.identity);
 Rigidbody rg = robot_escenico.AddComponent<Rigidbody> () as Rigidbody;
                    BoxCollider cc = robot_escenico.AddComponent<BoxCollider> () as BoxCollider;
                    //cc.isTrigger = true;
                    rg = robot_escenico.GetComponent<Rigidbody> ();
                    rg.useGravity = true;
                    rg.mass = 10;
                    rg.angularDrag = 0.8f;
                    rg.trasform.Rotation.x = false;

 
pero la ultima linea creo que esta mal.
 
Necesito que el robot no rebote contra el terreno pero que se mueva al ras de el y aun no lo logro.
 
Gracias por tu respuesta
 
Obvio que esa ultima linea estaba mal, ya que "rg" es un Ridigbody y no tiene un transform.
 
Ahora la cambie por :
 



   
      robot_escenico.trasform.Rotation.x = 0f;
   

[/quote]
 
 

Ten en cuenta que cuando le pones un nuevo componente a un GameObject desde script, no es como cuando pones el componente de forma manual, las propiedades de la clase no se inician de la misma forma por eso debes darles los valores también desde script, aunque no sean las que quieres modificar.

Hola, no se si todavia tenes el problema pero me parece que el instanciamiento esta bien (para la proxima subi el codigo o las partes que importan usando los <>). Me parece que el error lo tenes aca, no estoy seguro:
 

Scene escena;  //<--- Scene vacio
 
//En Update
//....
if (escena.name == "planeta5") //escena no tiene referencia a ninguna escena y le estas preguntando el nombre

 
proba con el getActiveScene
 
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.GetActiveScene.html
 
o con getscenebyname
 
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.GetSceneByName.html
 
saludos

Etiquetas: