Noticias

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

Borrado de componentes antes de instanciarlos

Iniciado por ecko, Noviembre 23, 2017, 12:10:14 PM

Tema anterior - Siguiente tema
Noviembre 23, 2017, 12:10:14 PM Ultima modificación: Noviembre 24, 2017, 01:01:39 PM por pioj
Buenas chic@s, mi duda es si puedo borrar componentes antes de hacer un instantiate del objeto, es decir:
 



   
       
   
   
      function Start () {
          var cargarObjeto=Resources.Load("Objeto",GameObject);
          Destroy(cargarObjeto.GetComponent(NetworkIdentity),false);    
          GameObject.Instantiate(cargarObjeto,Vector3.zero, Quaternion.Euler(0,4.88,3.1416));
      }
   
   
   
   
       
   

[/quote]
 

Al hacer esto me da este error:  
 



   
       Destroying assets is not permitted to avoid data loss.
      If you really want to remove an asset use DestroyImmediate (theObject, true);
      UnityEngine.Object:Destroy(Object)
      prueba:Start() (at Assets/Scripts/prueba.js:6)
   

[/quote]
 
pero si hago DestroyImmediate(cargarObjeto.GetComponent(NetworkIdentity),true;  me borra el componente del objeto original (el de la carpeta Resources) y esto no me interesa, así que lo único que me resuelve un poco el tema es esto:
 



   
      function Start () {
          var cargarObjeto=Resources.Load("Objeto",GameObject);
          cargarObjeto.GetComponent(NetworkIdentity).enabled=false;
          cargarObjeto.GetComponent(prueba2).enabled=false;
          var objetoEquipado=GameObject.Instantiate(cargarObjeto,Vector3.zero, Quaternion.Euler(0,4.88,3.1416));
          Destroy(objetoEquipado.GetComponent(MeshRenderer));    
          Destroy(objetoEquipado.GetComponent("prueba2"));    
          cargarObjeto.GetComponent(prueba2).enabled=true;
      }
   

[/quote]
 
pero no me gustaría hacer esto ya que no es muy fiable... a alguien se le ocurre algo?

No entiendo por que tendrias que usar un Prefabs con y sin NetworkIdentity, si tu problema se debe a que el juego requiere una copia local te recomiendo que hagas un nuevo prefab y elimines los componentes que no requieren.

Noviembre 23, 2017, 02:59:17 PM #2 Ultima modificación: Noviembre 24, 2017, 01:02:05 PM por pioj
En tal caso como dices tendría que crear los componentes en base al original para tener los mismos parametros que el original pero creo que no deja hacer esto unity y debes crear el componente y luego ir pasandole valores...
 



   
      function Start () {
          var cargarObjeto=Resources.Load("Objeto",GameObject);
          var objetoCopia : GameObject;
          objetoCopia.addComponent(cargarObjeto.GetComponent(MeshRenderer) as MeshRenderer);
          objetoCopia.addComponent(cargarObjeto.GetComponent(MeshFilter));
          for (var child : Transform in cargarObjeto.transform) {
                  var objeto=child.gameObject;
                  objeto.transform.parent=objetoCopia.transform;
          }
          GameObject.Instantiate(objetoCopia,Vector3.zero, Quaternion.Euler(0,4.88,3.1416));
      }
   

[/quote]
 
 

si se pueden instaciar tal cual(con valores identicos) un objeto que este en escena... o un prebab... pero cargandolo con Load estas tirando de los valores originales del objeto, si los modificas, modificas los del "original"... deverias instanciarlo, y entonces podras "borrar" componentes de la Instancia, sin que afecte al original...
 

function Start () {
   var objetoOriginal = Resources.Load("Objeto",GameObject);
   var objetoCopia = Instantiate(objetoOriginal) : GameObject;
   Destroy(objetoCopia.GetComponent(tal));//destruir el componente que quieras...
   Destroy(objetoOriginal.gameObject);//destruir el objeto de referencia
}

 
...no tengo muchos conocimientos de java, y los que tengo los tengo un poco oxidados...
 
...pero creo que asi deveria funcionar...

Etiquetas: