Noticias

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

Problemas al emparentar objetos

Iniciado por Rankern, Agosto 02, 2015, 07:43:24 PM

Tema anterior - Siguiente tema
Agosto 02, 2015, 07:43:24 PM Ultima modificación: Junio 01, 2016, 01:38:37 AM por pioj
Muy buenas a todos:
 
Soy nuevo tanto en el foro como en Unity y de programación tengo nociones muy básicas.
 
Estaba intentando instanciar un prefab dentro de un objeto padre pero a la hora de la verdad, Unity me da un error que dice
 



   
      "Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption. UnityEngine.Transform:set_parent(Transform)".
   

[/quote]
 
Aquí os dejo el código en cuestión: 
 



   
       if(detonador == true){
              Instantiate (efecto);
              efecto.transform.parent = poscaja.transform;
          Destroy (objetoExp);
            }
   

[/quote]
 
 
 
Aprovecho la ocasión, para intentar en solventar otra duda que fue la causante de llegar a intentar lo mencionado antes. La cosa es que quiero hacer explotar un objeto desde el detonador (que por supuesto, no esta en la misma posición) y todo estaba perfecto excepto a la hora aparecer la explosión (que sale una cierta distancia del objeto a destruir) . Tras varias horas de darle vueltas y de pruebas y de buscar por internet y etc me he percatado de que la posición del obj es distinta a la del global (creo que tanto como la misma distancia de donde aparece el efecto de explosión). ¿Hay alguna forma de poder colocar las coordenadas partiendo desde el mismo punto desde donde empiezan objeto que quiero explotar? 
 
Saludos y gracias de antemano 

Buenas,Claro, el error te sale porque estas intentando emparentar el prefab, no la instancia del prefab.Para guardar la referencia de la instancia que has creado, tienes que poner algo asi:
GameObject efecto_instancia = Instantiate(efecto) as GameObject;
Entonces, usas la variable "efecto_instancia" en lugar del prefab("efecto").Si quieres posicionar un objeto en la posición de otro, no es necesario emparentar el objeto.Puedes asignarle la posición de esta forma:
efecto_instancia.transform.position = poscaja.transform.position;
Emparentando el objeto, lo que consigues es que le afecte la transformacion que le hagas al padre.Si quieres emparentar y posicionar un objeto en el padre, lo mejor es:
 efecto_instancia.transform.parent = poscaja.transform;
 efecto_instancia.transform.localPosition = Vector3.zero;
Suerte!

Muchas gracias, ha sido de gran ayuda para conocer mejor los conceptos ^^.  pero ahora me surge otro problema :/El caso es que me da otro error tanto a la hora de coger la posición de la caja como de emparentarla (los he probado por separado y me da el mismo error), NullReferenceException: Object reference not set to an instance of an objectte dejo todo el Script por si hubiese algo que me estuviese dejando
public var efecto : Transform; 
public var detonador : boolean = false;
private var objetoExp : GameObject;
private var poscaja:GameObject;
   objetoExp = gameObject.Find ("Box");
private var efecto_instancia :GameObject;   
function OnTriggerEnter (hit:Collider){
if (hit.tag == "Player"){
   detonador = true;
}
if(detonador == true){
efecto_instancia = Instantiate (efecto) as GameObject;
efecto_instancia.transform.parent = poscaja.transform;
efecto_instancia.transform.position = objetoExp.transform.position;
Destroy (objetoExp);

}
}
Gracias de nuevo pd.: es la única caja en el escenario, así que no tiene mucha dificultad para encontrarla.

Yo no manejo javascript..Pero prueba a poner la linea del GameObject.Find en la funcion Start.No te da error de compilacion?Eso si, si puedes poner la linea en la que te está dando el error, pues mejor.Saludos.

no, no error de compilacion.El error se produce en las lineas que pone 
efecto_instancia.transform.parent = poscaja.transform;
efecto_instancia.transform.position = objetoExp.transform.position;
he probado también, por si acaso, poniendo GameObject.Find en lugar de gameObject.Find y dentro de una funcion Start pero el resultado es el mismo... mañana intentare crear el script en C# a ver si resulta mas sencilla la solucion.

Asegúrate de tener la declaración de las variables antes de las funciones Start (), Update (), etc. Si intentas llamar una variable que has declarado en una función te dará error p.e:
var objeto1 : GameObject;

function Start() {
    var objeto2 = GameObject.Find("dos");
    objeto1 = GameObject.Find("uno");
}

function OnTriggerEnter () {
    objeto1.parent = objeto2; //Te va a dar error.
}
Y cuando te pase eso, pon un Debug.Log() antes de la línea que te da error con los objetos que te den error.Lo dicho:
var posCaja : GameObject;
var exp : GameObject;

function Start () {
    //Inicializas las variables.
}

function OnTriggerEnter () {
    //Utilizas las variables.
}
Prueba así  a ver que tal

Eso lo entiendo, y así lo tenia puesto.Acabo de hacer, tal como sugerías, los Debug.Log, y al parecer, efecto_instancia, me daba "null" así que he declarado la var efecto (la que asigno la prefab de la explosion) como GameObject (la tenía como transform) y el error se ha ido, aunque sigue posicionandolo mal... Me he dado cuenta de que la variable de GameObject a la cual quería emparentar no la había inicializado (le había dado tantas vueltas a todo el Script que al final se me olvidó y con el cansancio encima ni me di cuenta ^^').Ahora mismo, para ir tirando un poco, lo que he echo ha sido crear un cubo invisible sobre el existente y hacer ahí la explosión, va de fábula, pero claro, lo pienso y como solución no está mal, pero contra menos GameObject tenga creados supongo que a la larga, en un juego de verdad, siempre irá mejor ¿no?.He creado otro GameObject exactamente igual que el prefab que tenía (ya que el escenario no lo he echo yo, es un ejemplo descargado)  y me aparece el BoxCollider desplazado (lo que estoy viendo son 3 cubos, 1, donde esta el BoxCollider con la textura, otro que es la herramienta para desplazar el objeto por el escenario  y otro más que es donde debería de estar el BoxCollider y donde crea el efecto). Y me estaba preguntando yo... Esa desviación entre el Transform y el BoxCollider, ¿es un muerto con el que hay que cargar algunas veces, se puede modificar para que el centrado del collider sea 0 (en mi caso, para tenerlo centrado es de 0, 1.3, 6.84 y el efecto se sigue creando en donde se quedaba el centrado 0,0,0) o se puede hacer que aparezca el efecto en el Collider de forma automática (sin tener que recurrir a otro objeto o a colocar las cordenadas a mano a la hora de instanciar)?Iba a empezar a buscar como coger el centrado del collider para darselo al efecto, pero el efecto no tiene collider, así que supongo que tampoco es una solución ^^'¿Alguna sugerencia?Gracias a todos 

Agosto 03, 2015, 09:39:56 PM #7 Ultima modificación: Agosto 03, 2015, 09:40:13 PM por juanma_teso
Sinceramente, no he entendido muy bien, pero quizá lo que quieras es la posición del Collider, que puedes saberla haciendo una referencia a él y tener la variable center, luego pasarla a las coordenadas globales;
var coliderCaja : BoxCollider;
var PosicionGlobalCentroCaja : Vector3;

function Start () {
    coliderCaja = GetComponent<BoxCollider>();
    PosicionGlobalCentroCaja = transform.TransformPoint(coliderCaja.center);
}
Ahora bien, el tema de los objetos y rendimiento es complejo, si usas muchos objetos necesitarás más memoria, pero a no ser que uses una gameboy para jugar no creo que llenemos la capacidad jaja aunque en los móviles si hay que tener cuidado...Si la explosión siempre va a estar a X distancia del detonador puedes hacerlo en un solo GameObject vacío, no tienen por qué ser cajas, si los dos objetos son totalmente independientes, también puedes hacerlo en un solo objeto pero teniendo muy en cuenta el tema de que hay posiciones locales y globales. Lo más fácil es poner tags y que sean dos objetos diferentes, así te olvidas de posiciones y parents

Pues si que has entendido bien lo que te quería decir  Gracias a ambos de nuevo por vuestra ayuda, un saludo!

Etiquetas: