Jump to content
Sign in to follow this  
musaranya

Modificar prefabs desde código

Recommended Posts

Buenas, a ver si alguien me puede orientar con un problema que tengo.

Resulta que tengo una serie de prefabs y los quiero remapear todos para que utilicen la textura atlas que utilizo en mi proyecto. O sea, ellos vienen con su propia textura, yo he cogido esa textura, la he incorporado a mi textura genérica y ahora tengo que cambiar las coordenadas UV de todas las meshes de los prefabs para que se adapten a la nueva textura.

A mi entender tengo dos opciones:

  1. importar cada modelo en Blender, unwrap, remap y volver a importar a Unity. 
  2. modificar las meshes per código dentro de Unity

La primera opción la descarto por tediosa, no es que no sepa hacerlo pero es una paliza, estamos hablando de unos 50 prefabs cada uno con sus LODs. 

En cuanto a la segunda opción, ya he hecho el código C# que recorre todas las meshes y modifica los UVs de los vértices para que se adapten a la nueva textura. Funciona perfecto, el problema es el siguiente: NO SE GUARDAN LOS CAMBIOS. O sea, he hecho un script con un botón. En modo Edición (no en runtime) lo añado al prefab. Le doy al botón y me remapea correctamente las meshes. Arrastro el prefab a escena y todo bien. Le doy al Play y todo bien. Pero cierro Unity, vuelvo a entrar y se pierden los cambios que hice en los UVs :(  

También he intentado attachar mi script a una instancia del prefab, ejecutar el remapeo y luego darle manualmente a Apply para que actualice el prefab. Pero nada, parece que todo va bien pero al cerrar y volver a entrar se pierden los cambios. 

Sospecho que actualizar prefabs desde código no es tan sencillo, lo he hecho todo un poco a saco y sin leer demasiado la documentación. Así tal cual ¿hay alguien que tenga una idea de por dónde puede venir el problema?

 

Gracias!

 

Share this post


Link to post
Share on other sites

Buenas,

hace bastante que no toco eso, pero de lo que comentas no actualizas en ningún momento la info en los meshes(Assets). 

Prueba a mirarte esto:

https://docs.unity3d.com/ScriptReference/AssetDatabase.html

https://github.com/pharan/Unity-MeshSaver/blob/master/MeshSaver/Editor/MeshSaverEditor.cs

Edited by Sateyr

Share this post


Link to post
Share on other sites

Gracias lo miraré

...

No me funciona, sigue con el mismo comportamiento :(

He leído esto: https://docs.unity3d.com/Manual/ModifyingSourceAssetsThroughScripting.html pero es lo que ya hacía y sigue sin funcionar.

Mi código es este:

 MeshFilter[] meshes = objecte.transform.GetComponentsInChildren<MeshFilter>();
 

        foreach (var m in meshes)
        {
          //  var mesh = m.sharedMesh;
            List<Vector2> uvs = new List<Vector2>();
            List<Vector2> newUvs = new List<Vector2>();
            m.sharedMesh.GetUVs(, uvs);

            for (int i = ; i < uvs.Count; i++)
            {                
                var v2 = new Vector2((uvs[i].x * factorEscalatX) + offsetX, (uvs[i].y * factorEscalatY) + offsetY);
                newUvs.Add(v2);
            }

            m.sharedMesh.SetUVs(, newUvs);
        }
        

 

Al ejecutar este código todo va bien y se remapean los UVs según lo previsto, pero al cerrar Unity y volver a entrar nada, se pierden los cambios.

Le he metido AssetDatabase.SaveAssets(); al final del código pero nada. 

No sé, seguiré investigando...

 

Edited by musaranya

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...