Procedimientos de gestión de activos en la unidad

Anteriormente hemos visto cómo agregar nuestras propias herramientas al editor de Unity; Ahora, en este breve tutorial, le presentaré el manejo de los activos mediante un script en Unity. Gestionaremos las rutas, crearemos archivos prefabricados, generaremos una textura y la guardaremos en una imagen. Finalmente, también crearemos un archivo de material que utiliza la imagen generada, y todo esto se hará por código.


Vista previa del resultado final

Echemos un vistazo al resultado final en el que trabajaremos:


Paso 1: Configura el proyecto

Crear un proyecto vacío; No usaremos nada sofisticado aquí, así que no debemos molestarnos en importar nada en absoluto. Una vez hecho esto, crea un script de editor. Unity nos permitirá usar sus clases de editor solo si colocamos nuestro script en una carpeta llamada Editor. Ya que eso no existe en nuestro proyecto todavía, necesitamos crearlo.

Ahora vamos a crear un script en su interior..


Paso 2: Añadir un elemento de menú

Vamos a limpiar nuestro guión. Aparte de la funcionalidad básica, también queremos poder utilizar las clases del editor. Necesitamos ser utilizando UnityEditor y la clase de nuestro guión debería extender el Editor clase en lugar de MonoBehaviour como hacen los objetos normales del juego.

 utilizando UnityEngine; utilizando System.Collections; utilizando UnityEditor; Ejemplos de clase pública: Editor 

En nuestra primera función trabajaremos con prefabs, llamémoslo un PrefabRoutine.

 Ejemplos de clase pública: Editor void PrefabRoutine () 

Para ejecutar fácilmente esta función desde el editor, agreguémosla como Opción del menú.

 Ejemplos de clase pública: Editor [MenuItem ("Ejemplos / Prefab rutina")] void PrefabRoutine () 

Aparte de dejarle saber a la unidad que queremos que esta función sea ejecutable desde el Ejemplos-> Rutina prefabricada ", También necesitamos hacer esta función estática..

 ejemplos de clase pública: Editor [MenuItem ("Ejemplos / Prefab rutina")] static void PrefabRoutine () 

Si regresa al editor ahora (y actualiza el menú), notará que hay un nuevo menú llamado Ejemplos ahí.

Si selecciona la Rutina prefabricada Nada pasará ya que nuestra función está vacía..


Paso 3: Crear una carpeta

Para dar forma a nuestro proyecto de la manera que queremos, necesitamos saber cómo crear carpetas para poder mover las cosas. Crear una carpeta desde el script es muy sencillo, todo lo que tenemos que hacer es dejar que la unidad sepa dónde se debe colocar la carpeta. Para crear una carpeta necesitamos usar AssetDatabase clase.

 [MenuItem ("Ejemplos / Prefab Rutina")] static void PrefabRoutine () AssetDatabase.CreateFolder ("Assets", "Prefab Folder"); 

"Bienes" es el nombre de la carpeta principal del directorio que queremos crear. En nuestro caso, es la carpeta principal del proyecto donde se importan / crean todos nuestros activos..

Tenga en cuenta que también puede utilizar .NET Directorio clase. Esto también le permitirá eliminar, mover o acceder a los archivos de los directorios. Para usar esta clase necesitas estar utilizando System.IO.

Cada vez que seleccione la Rutina prefabricada desde el editor, se debe crear una nueva carpeta y debe estar visible en la vista del proyecto.


Paso 4: Crea un Prefab

Para crear una casa prefabricada tenemos que llamar EditorUtility.CreateEmptyPrefab (). La función toma la ruta de la prefabulación como un argumento..

 [MenuItem ("Ejemplos / Prefab Rutina")] static void PrefabRoutine () AssetDatabase.CreateFolder ("Assets", "Prefab Folder"); Object prefab = EditorUtility.CreateEmptyPrefab ("Assets / Prefab Folder / obj.prefab"); 

¡No te olvides de la extensión! Además, después de crear el archivo necesitamos llamar. AssetDatabase.Refresh (), entonces la unidad es capaz de verlo.

 [MenuItem ("Ejemplos / Prefab Rutina")] static void PrefabRoutine () AssetDatabase.CreateFolder ("Assets", "Prefab Folder"); Object prefab = EditorUtility.CreateEmptyPrefab ("Assets / Prefab Folder / obj.prefab"); AssetDatabase.Refresh (); 

Si dejamos una ruta constante como argumento, cada vez que seleccionamos nuestra rutina, una nueva prefab vacía vacía reemplazará a la anterior. Asignemos cada prefab a una carpeta separada para contrarrestar eso. Para hacer esto, necesitamos guardar la carpeta creada más recientemente en una cadena para poder usarla más adelante como un argumento de ruta. los Crear carpeta la función devuelve un GUID, que básicamente es el ID del archivo (o directorio). Hay una función que recupera la ruta si enviamos este ID. Se llama GUIDToAssetPath; Vamos a usarlo para obtener la ruta de nuestra carpeta.

 [MenuItem ("Ejemplos / Prefab rutina")] static void PrefabRoutine () string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ("Assets", "Prefab Folder")); Object prefab = EditorUtility.CreateEmptyPrefab ("Assets / Prefab Folder / obj.prefab"); AssetDatabase.Refresh (); 

Ahora vamos a usar el camino para dirigir los prefabs que vamos a crear a la carpeta creada más recientemente.

 [MenuItem ("Ejemplos / Prefab rutina")] static void PrefabRoutine () string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ("Assets", "Prefab Folder")); Object prefab = EditorUtility.CreateEmptyPrefab (ruta + "/obj.prefab"); AssetDatabase.Refresh (); 

Puede probar si los prefabs vacíos creados están empaquetados en carpetas ahora.


Paso 5: Establecer el Prefab

Si creas un prefab, entonces probablemente no quieras dejarlo vacío porque en ese caso es bastante inútil. Vamos a establecer nuestra prefab si hay algún objeto de juego seleccionado mientras nuestra rutina se está ejecutando. Vamos al prefab al objeto seleccionado. Para obtener el objeto seleccionado actualmente podemos usar el Selección clase que tiene una referencia a ella. Para establecer el prefab, tenemos que llamar ReplacePrefab ().

 [MenuItem ("Ejemplos / Prefab rutina")] static void PrefabRoutine () string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ("Assets", "Prefab Folder")); Object prefab = EditorUtility.CreateEmptyPrefab (ruta + "/obj.prefab"); AssetDatabase.Refresh (); if (Selection.activeObject) EditorUtility.ReplacePrefab (Selection.activeGameObject, prefab); 

Si ejecuta la rutina con cualquier objeto de juego seleccionado ahora, notará que el prefab creado se configura automáticamente.

Eso es todo, hemos creado una rutina personalizada para la creación de prefabricados, no es muy útil, pero debería poder saber cómo hacerlo ahora si habrá una necesidad de tal cosa en su proyecto..

Al final también quiero mencionar que AssetDatabase También le permite mover activos, moverlos a la papelera o eliminarlos llamando AssetDatabase.MoveAsset (), AssetDatabase.MoveAssetToTrash () y AssetDatabase.DeleteAsset () respectivamente. El resto de la funcionalidad se puede encontrar en la AssetDatabase página de referencia del script.


Paso 6: Añadir otro elemento del menú

Vayamos a otro ejemplo, esta vez crearemos una textura y un material mediante programación. Llamemos a este elemento del menú. Rutina material.

 [MenuItem ("Example / Prefab Routine")] static void PrefabRoutine () string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ("Assets", "Prefab Folder")); Object prefab = EditorUtility.CreateEmptyPrefab (ruta + "/obj.prefab"); AssetDatabase.Refresh (); if (Selection.activeObject) EditorUtility.ReplacePrefab (Selection.activeGameObject, prefab);  [Elemento de menú ("Ejemplos / Rutina de material")] static void MaterialRoutine () 

Ahora tenemos dos elementos para elegir en el Ejemplos menú.


Paso 7: Crear una textura

Vamos a crear un Textura2d y establecer su tamaño en (256, 256) para este ejemplo.

 [Elemento de menú ("Ejemplos / Rutina de material")] estático vacío MaterialRoutine () Texture2D tex = new Texture2D (256, 256); 

Ahora no deberíamos dejar que todos esos píxeles se desperdicien, así que configuremos los píxeles de la textura de acuerdo con algún tipo de fórmula pensada. Para eso necesitaremos dos. para Bucles para pasar por cada píxel. Para establecer el color de cada píxel debemos llamar SetPixel () que toma la posición del píxel en una textura y su color como los argumentos.

 [Elemento de menú ("Ejemplos / Rutina de material")] estático vacío MaterialRoutine () Texture2D tex = new Texture2D (256, 256); para (int y = 0; y < 256; ++y)  for (int x = 0; x < 256; ++x) tex.SetPixel(x, y, new Color());  

Para asignar el color usaremos el Mathf.Sin () función. los Color La clase se puede inicializar con tres flotadores, correspondientes a los componentes de color rojo, verde y azul, respectivamente. El valor máximo permitido es 1 y min es 0, entonces el Pecado() La función se adapta perfectamente a nuestras necesidades..

 para (int y = 0; y < 256; ++y)  for (int x = 0; x < 256; ++x) tex.SetPixel(Mathf.Sin(x*y), Mathf.Sin(x*y), Mathf.Sin(x*y))); 

No importa lo que sometamos a la Pecado() función, pero para obtener algo más interesante debemos dar un valor que cambie para cada píxel.


Paso 8: Crea una imagen

Ahora vamos a crear una imagen de la textura que acabamos de crear. Ya que estaremos escribiendo en un archivo en modo binario, necesitamos estar utilizando System.IO, Así que vamos a agregarlo a la parte superior de nuestro script.

 utilizando UnityEngine; utilizando System.Collections; utilizando UnityEditor; utilizando System.IO; clase pública ejemplos: editor

Para guardar nuestra textura como Png imagen que primero necesitamos llamar EncodeToPNG () que devolverá una matriz de bytes que el Png archivo consta de.

 para (int y = 0; y < 256; ++y)  for (int x = 0; x < 256; ++x) tex.SetPixel(x, y, new Color(Mathf.Sin(x*y), Mathf.Sin(x*y), Mathf.Sin(x*y)));  byte[] pngData = tex.EncodeToPNG();

Ahora que tenemos nuestro pngData Podemos escribirlo en un archivo y crear una Png imagen de esta manera.

 byte [] pngData = tex.EncodeToPNG (); if (pngData! = null) File.WriteAllBytes ("Assets / texture.png", pngData);

Ya que creamos el archivo en una ruta constante, cada vez que ejecutamos MaterialRoutine (), la textura se sobrescribirá.

Y como tenemos nuestra imagen, ya no necesitamos la textura generada, ya que de todos modos no hará referencia a una imagen. Vamos a destruirlo.

 byte [] pngData = tex.EncodeToPNG (); if (pngData! = null) File.WriteAllBytes ("Assets / texture.png", pngData); DestroyImmediate (tex);

Además, debemos permitir que Unity actualice la vista del proyecto y las referencias de archivos; para hacer eso necesitamos llamar AssetDatabase.Refresh ().

 byte [] pngData = tex.EncodeToPNG (); if (pngData! = null) File.WriteAllBytes ("Assets / texture.png", pngData); DestroyImmediate (tex); AssetDatabase.Refresh ();

Probemos si la textura se crea cuando ejecutamos nuestra rutina..


Paso 9: Crear un material

Tenemos una imagen y ahora podemos crear un material que la use como textura. Vamos a crear un nuevo material.

 AssetDatabase.Refresh (); nuevo material (Shader.Find ("Diffuse"));

El material creado utilizará un Difuso sombreado Para guardar este material en el archivo, podemos llamar AssetDatabase.CreateAsset (). Esta función toma un activo como primer argumento y la ruta como segundo..

 AssetDatabase.Refresh (); AssetDatabase.CreateAsset (nuevo Material (Shader.Find ("Diffuse")), "Assets / New Material.mat");

Si ejecuta nuestra rutina ahora, verá que se crea el material..

Como puedes ver todo es correcto, su nombre es Nuevo material y usa Difuso Shader, pero no hay textura asignada..


Paso 10: Asignar la textura

Primero necesitamos obtener una referencia al material que acabamos de crear. Podemos conseguir eso llamando AssetDatabase.LoadAssetAtPath () que carga el activo y devuelve su referencia.

 AssetDatabase.CreateAsset (nuevo Material (Shader.Find ("Diffuse")), "Assets / New Material.mat"); Material Material = (Material) (AssetDatabase.LoadAssetAtPath ("Assets / New Material.mat", typeof (Material)));

Ahora asignemos nuestra textura generada como la textura principal del material. Podemos obtener la referencia de textura de la textura generada de la misma manera que obtuvimos la referencia de material..

 Material Material = (Material) (AssetDatabase.LoadAssetAtPath ("Assets / New Material.mat", typeof (Material))); material.mainTexture = (Texture2D) (AssetDatabase.LoadAssetAtPath ("Assets / texture.png", typeof (Texture2D)));

Para ver los resultados, ejecute el Rutina material.

Como puedes ver, el material tiene la textura asignada ahora..

Conclusión

Ese es el final de la introducción para administrar sus activos usando scripts. Si desea ampliar su conocimiento sobre el tema, puede visitar la página de referencia de Unity Editor Classes, en particular vale la pena consultar la referencia del script AssetDatabase. Si necesita trabajar en un nivel bajo, también debe leer los documentos en System.IO para obtener más información sobre sus clases y cómo puede usarlas. Gracias por tu tiempo!