Noticias

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

¿Como cargar materiales legacy en tiempo de ejecucion? ¡SOLUCIONADO!

Iniciado por ftejada, Noviembre 27, 2015, 04:33:38 AM

Tema anterior - Siguiente tema
Noviembre 27, 2015, 04:33:38 AM Ultima modificación: Diciembre 02, 2015, 06:05:13 PM por ftejada
Hola a todos, necesito consejo para ver cual podría ser la mejor manera de abordar este asunto.Tengo todos los objetos de mis escenas (hay varias), con los materiales de Unity 5 (creo que son los basados en fisicas). Y necesito poder cambiar dichos materiales de todos los objetos en escena por los antiguos que tenia Unity (los Legacy). Lo que quiero conseguir es que cuando se vaya al menu de opciones del juego, (ya sea en la pausa en mitad de la partida del juego o antes de empezar la partida), poder cargar los materiales Legacy si pulso el boton correspondiente para ello o cargar los materiales de Unity5 si pulso en otro boton. ¿¿Como podría hacer esto?? He estado pensando pero no encuentro la manera de hacerlo Espero vuestra respuesta. Un saludo y gracias por adelantado. 

puedes cambiar los materiales con esto: http://docs.unity3d.com/ScriptReference/Renderer-materials.htmlEntonces haces una lista de los objetos por rutas y los materiales que les corresponden, luego los cambias.

Cita de: Braltor date=1448630520" data-ipsquote="" data-cite="Braltor" class="ipsQuote">puedes cambiar los materiales con esto:

O sea la escena tiene una jerarquía entonces para encontrarlos necesitas guardar las rutas, vamos como lo haces con las carpetas del disco duro. Cuando creas el objeto con los materiales lo asocias con la ruta del objeto que le corresponde. Así defines a cual le toca cuales materiales.

[quote author=Braltor date=1448660380" data-ipsquote="" data-cite="Braltor" class="ipsQuote">O sea la escena tiene una jerarquía entonces para encontrarlos necesitas guardar las rutas, vamos como lo haces con las carpetas del disco duro. Cuando creas el objeto con los materiales lo asocias con la ruta del objeto que le corresponde. Así defines a cual le toca cuales materiales.[/quote]Perdona mi torpeza pero es que no termino de entender como hacer lo que me indicas, ¿podrías explicarmelo con algun ejemplo? ¿Como se haría para asociar el objeto y su material con la ruta del objeto que le corresponde? Tampoco se si cuando dices "en la escena (que no se como se haría) o si te refieres a las rutas que ocupan esos objetos en las carpetas del proyecto? y tampoco se como debería guardar sus rutas ¿en un archivo de texto aparte por ejemplo? no se... ayudame por favor! De nuevo muchas gracias por contestar

los assets se guardan en carpetas, pero los objetos de la escena no (los que ves en Hierarchy)... no se como es que quieres hacerlo solo te doy una idea para comezar entonces no sabría como crearte un ejemplo. si quieres guardar las rutas en archivo bien, aunque lo veo mas complicado que hacerlo en código con un Dictionary o algo.

¿Como cargo/asigno un material que ya está previamente creado en una carpeta de mi proyecto a un objeto? la ruta de ese material seria algo asi "Assets/Material/Legacy"He intentado varias formas como por ejemplo  
gameObject.GetComponent<MeshRenderer>().material = new Material("Assets/Material/Legacy");
  pero no carga nada.

pones una variable pública para el material, lo asignas desde el editor, y en código lo asignas a la lista de materiales, creo que usabas shader materials para ahorrar recursos.

Diciembre 02, 2015, 06:03:40 PM #8 Ultima modificación: Diciembre 02, 2015, 06:04:43 PM por ftejada
[quote author=Braltor date=1448834122" data-ipsquote="" data-cite="Braltor" class="ipsQuote">pones una variable pública para el material, lo asignas desde el editor, y en código lo asignas a la lista de materiales, creo que usabas shader materials para ahorrar recursos.[/quote]El problema de eso es que si quiero cambiar todos los materiales de una gran escena, al tener que crear tantas variables publicas, una por cada material ¿No sobrecargaria la Ram demasiado? De todos modos investigando he averiguado lo que creo que es la mejor manera de hacerlo.Es bastante simple y sencillo,
gameobject.GetComponent<MeshRenderer>().material.shader = Shader.Find("Legacy/y el nombre del shader que queramos cargar");
Si queremos volver al shader standar o al que tuviesemos, la configuración queda almacenada y solo hay que volver a cargar el shader para que quede todo como estaba antes...
gameobject.GetComponent<MeshRenderer>().material.shader = Shader.Find("Standard");
 Por otro lado si lo que quereis es cambiar muchos objetos de la escena, primero debeis detectar cuales son los que tienen materiales asignados... o que sean camaras, luces y cosas asi....Se puede utilizar un array para almacenar todos los GameObjects de la escena y despues distinguir cuales son los que tienen materiales y almacenarlos en una List por ejemplo:
            if (listGameObjectsInScene.layer == layerGameObjectWithMaterials || listGameObjectsInScene.layer == layerPlayer)
                listGameObjectWithMaterials.Add(listGameObjectsInScene);
        }
Y con esto otro vamos cambiando los Shaders a cada gameobject almacenado en la List:
//Ahora
        for (int i = 0; i < listGameObjectWithMaterials.Count; i++)
        {
            listGameObjectWithMaterials.GetComponent<MeshRenderer>().material.shader = Shader.Find("Legacy Shaders/Bumped Diffuse");
        }
       
        //Ahora que los hemos cambiado vaciamos la List de gameobjects
        for(int i = 0; i < listGameObjectWithMaterials.Count; i++)
        {
            listGameObjectWithMaterials.Clear();
        }
 Hay que tener una cosa en cuenta ya que es un error que puede ser muy puñetero de encontrar o darse cuenta... Unity 5 para las compilaciones de nuestros proyectos solo carga unos cuantos Shaders predeterminados y en mi caso el "Legacy Shaders/Bumped Diffuse" no lo carga.
 Con lo que si ejecutamos la aplicación desde el editor de Unity5 nos cargará el Shader "Legacy Shaders/Bumped Diffuse", pero en cuanto compilemos la aplicación y la ejecutemos el Shader "Legacy Shaders/Bumped Diffuse" no lo encontrará ya que no lo incluye Unity en la compilación a menos que lo agreguemos nosotros manualmente... Tendríamos que ir a Edit/Preference/Graphics y alli, en la opcion "Always Included Shaders", viene en Size "6". Pues en Size debemos poner la cantidad de Shader que queremos compilar y agregarlos. En mi caso como solo queria compilar uno mas, pues marco "7".Y en ese elemento "7" clickeamos y buscamos el nombre del que queramos agregar. Dejo la foto. Saludos

Etiquetas: