Prosedyre Asset Management i Unity

Procedural Asset Management i Unity
en
Del
4
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. . Ikke gå glipp av

Vi har sett tidligere på å legge våre egne verktøy for å Unity redaktør; nå, i denne korte opplæringen, vil jeg introdusere deg til håndtering av eiendeler av skript i Unity. Vi klarer stier, skape ferdighus filer, generere en tekstur og lagre den på et bilde. Til slutt vil vi også lage et materiale fil som bruker den genererte bildet, og alt dette vil bli gjort av kode.



Endelig resultat Forhåndsvisning

La oss ta en titt på det endelige resultatet vi skal jobbe mot:



Trinn 1: Sett opp prosjektet

Opprett en tom prosjekt; vi vil ikke være å bruke noe fancy her, slik at vi ikke skal bry å importere noe som helst. Når det er gjort, opprette en redaktør script. Unity vil la oss bruke sin redaktør klasser bare hvis vi setter vår script i en mappe som heter Editor
. Siden det ikke eksisterer i vårt prosjekt ennå, må vi skape det

La oss nå lage et skript inni den



Trinn 2:.. Legg en MENUITEM
< p> La oss rydde opp skriptet. Bortsett fra den grunnleggende funksjonalitet, ønsker vi også å kunne bruke redaktøren klasser. Vi må være å bruke UnityEditor og vår script klassen bør forlenge redaktør klasse i stedet for MonoBehaviour som normale spillobjektene gjør.
bruker UnityEngine, ved hjelp System.Collections, ved hjelp UnityEditor; public class Eksempler: Redaktør {}

I vår første funksjonen vi skal jobbe med prefabs, la oss kalle det en PrefabRoutine
offentlig klasse Eksempler: Editor. {void PrefabRoutine () {}}

For å easly utføre denne funksjonen fra redaktøren, la oss legge det til som et MENUITEM
offentlige klasse Eksempler:. redaktør {[MENUITEM ( «Eksempler /Prefab Rutine")] void PrefabRoutine ( ) {}}

Bortsett fra å la enheten vet at vi ønsker denne funksjonen skal være kjørbar fra Examples- >. Prefab rutine "
, trenger vi også å gjøre denne funksjonen statisk
offentlig klasse Eksempler: editor {[menyvalget ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {}}

Hvis du går tilbake til redaktøren nå (og oppdatere menyen), vil du se at det er en ny menyen som heter Eksempler
det

Hvis du velger Prefab Rutine
ingenting vil skje siden vår funksjon er tom



Trinn 3..: Lag en mappe

for å forme prosjektet vårt slik vi ønsker vi trenger å vite hvordan du oppretter mapper, slik at vi kan flytte ting rundt. Opprette en mappe fra manuset er veldig grei, er alt vi trenger å gjøre for å la enhet vite hvor mappen skal plasseres. For å opprette en mappe vi må bruke AssetDatabase klasse product: [MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {AssetDatabase.CreateFolder ( "Assets", "Prefab mappe");}.

< em> "Assets"
er navnet på den overordnede mappen av katalogen vi ønsker å skape. I vårt tilfelle er det hovedprosjektet mappen der alle våre eiendeler er importert /laget.

Merk at du også kan bruke .NET Directory klassen. Dette vil også la deg slette, flytte eller få tilgang til kataloger 'filer. For å bruke denne klassen du må bruke System.IO.

Hver gang du velger Prefab Rutine
fra redaktøren, en ny mappe skal opprettes og være synlig i prosjektet visningen.



Trinn 4: Lag en Prefab

for å lage et ferdighus vi må ringe EditorUtility.CreateEmptyPrefab (). Funksjonen tar prefab bane som et argument product: [MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {AssetDatabase.CreateFolder ( "Assets", "Prefab Folder."); Objekt prefab = EditorUtility.CreateEmptyPrefab ( "Assets /Prefab Folder /obj.prefab");}

Ikke glem om utvidelsen! Også etter at vi opprette filen må vi kalle AssetDatabase.Refresh (), slik enhet er i stand til å se det.
[MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {AssetDatabase.CreateFolder ( "Assets", "Prefab mappe"); Objekt prefab = EditorUtility.CreateEmptyPrefab ( "Assets /Prefab Folder /obj.prefab"); AssetDatabase.Refresh ();}

Hvis vi lar en konstant bane som et argument, hver gang vi velge vår rutine en ny tomt ferdighus vil erstatte den gamle. La oss tilordne hver ferdighus å skille mappe for å motvirke det. For å gjøre dette må vi spare mest nylig opprettet mappe til en streng, slik at vi kan bruke den som en bane argument senere. Den CreateFolder funksjonen returnerer en GUID, som i utgangspunktet er filen (eller katalogens) ID. Det er en funksjon som henter banen hvis vi sender denne ID. Det kalles GUIDToAssetPath; La oss bruke den til å få vår mappe bane.
[MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ( "Assets", "Prefab mappe")); Objekt prefab = EditorUtility.CreateEmptyPrefab ( "Assets /Prefab Folder /obj.prefab"); AssetDatabase.Refresh ();.}

La oss nå bruke banen for å lede prefabs vi skal lage til den sist opprettede mappen product: [MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ( "Assets", "Prefab mappe")); Objekt ferdighus = EditorUtility.CreateEmptyPrefab (bane + "/obj.prefab"); AssetDatabase.Refresh ();}

Du kan teste om de opprettede tomme prefabs er pakket i mapper nå



Trinn 5: Sett Prefab

Hvis du lager et ferdighus. så har du sannsynligvis ikke ønsker å forlate det tomt fordi i så fall det er ganske mye unyttig. La oss sette vår ferdighus hvis det er noen spill objekt valgt mens vår rutine utfører. Vi vil at ferdighus til det valgte objektet. For å få det markerte objektet vi kan bruke Selection klassen som har en referanse til den. Slik stiller ferdighus vi må ringe ReplacePrefab ().
[MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {string path = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ( "Assets", "Prefab Folder ")); Objekt ferdighus = EditorUtility.CreateEmptyPrefab (bane + "/obj.prefab"); AssetDatabase.Refresh (); if (Selection.activeObject) EditorUtility.ReplacePrefab (Selection.activeGameObject, ferdighus),.}

Hvis du kjører rutinen med noen spill objekt valgt nå så vil du se at det opprettes prefab settes automatisk

det er det, har vi opprettet en egendefinert rutine for prefab skaperverket, det er ikke veldig nyttig, men du bør være i stand til å vite hvordan du gjør det nå om det vil være behov for noe slikt i prosjektet.

på slutten vil jeg også nevne at AssetDatabase kan du også flytte eiendeler rundt, flytte dem til papirkurven eller slette dem ved å ringe AssetDatabase.MoveAsset (), AssetDatabase.MoveAssetToTrash () og AssetDatabase.DeleteAsset () hhv. Resten av funksjonaliteten kan bli funnet på AssetDatabase manuset referansen side



Trinn 6:. Legg til en menypunkt

La oss gå til et annet eksempel, denne gangen vil vi skape en tekstur og et materiale programmatisk. La oss kalle dette menyvalget Material Rutine
.
[MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {string bane = AssetDatabase.GUIDToAssetPath (AssetDatabase.CreateFolder ( "eiendeler", " Prefab mappe ")); Objekt ferdighus = EditorUtility.CreateEmptyPrefab (bane + "/obj.prefab"); AssetDatabase.Refresh (); if (Selection.activeObject) EditorUtility.ReplacePrefab (Selection.activeGameObject, ferdighus);} [MENUITEM ( «Eksempler /Material Rutine")] static void MaterialRoutine () {}

Nå har vi to ting å velge mellom i < . em> Eksempler
menyen



Trinn 7:. Lag en Texture

La oss lage en Texture2D og sette størrelsen til (256, 256) for dette eksempelet
[MENUITEM ( «Eksempler /Material Rutine")] static void MaterialRoutine () {Texture2D tex = new Texture2D (256, 256);}

nå bør vi ikke la alle disse pikslene gå til spille, så la oss sette tekstur s piksler i henhold til noen form for tanke opp formel. For at vi trenger to for looper å gå gjennom hver piksel. Slik stiller hver piksel farge vi må ringe SetPixel () som tar stilling til piksel på en tekstur og farge som argumenter.
[MENUITEM ( «Eksempler /Material Rutine")] static void MaterialRoutine () { Texture2D tex = ny Texture2D (256, 256); for (int y = 0; y < 256; ++ y) {for (int x = 0; x < 256; ++ x) tex.SetPixel (x, y, ny farge ()); }}

Hvis du vil tilordne fargen vi vil bruke Mathf.Sin () -funksjonen. Farge klasse kan bli initialisert med tre flottører, som svarer til de røde, grønne og blå fargekomponenter, hhv. Maks tillatt verdi er 1 og min er 0, så Sin () -funksjonen passer våre behov perfekt
for. (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)));}

Det spiller ingen rolle hva vi sender til den () -funksjonen sin, men for å få noe mer interessant vi bør gi en verdi som endrer for hver piksel



Trinn 8:. Lag et bilde

la oss nå skape et bilde fra teksturen vi nettopp opprettet. Siden vi skal skrive til en fil i binær modus, må vi bruke System.IO, så la oss legge den til toppen av skriptet
hjelp UnityEngine;. Bruker System.Collections, ved hjelp UnityEditor, bruker System. IO; public class Eksempler: Editor

for å redde vår tekstur som en PNG
bildet vi må først ringe EncodeToPNG () som returnerer en rekke bytes at PNG
fil består . av
for (int y = 0; y < 256; ++ y) {for (int x = 0; x < 256; ++ x) tex.SetPixel (x, y, ny farge (Mathf .Sin (x * y), Mathf.Sin (x * y), Mathf.Sin (x * y)));} byte [] pngData = tex.EncodeToPNG ();

nå som vi har fått vår pngData vi kan skrive det i en fil og opprette en PNG
bilde på denne måten
byte [] pngData = tex.EncodeToPNG ();. if (pngData = null!) File.WriteAllBytes ( "Assets /texture.png ", pngData);

siden vi opprette filen på en konstant bane, hver gang vi skal kjøre MaterialRoutine (), vil strukturen bli overskrevet

Og siden vi har. vårt bilde, trenger vi ikke det genererte tekstur lenger som det ikke vil være å registrere et bilde uansett. La oss ødelegge det
byte [] pngData = tex.EncodeToPNG ();. If (pngData = null!) File.WriteAllBytes ( "Assets /texture.png", pngData); DestroyImmediate (tex);

Også må vi la Unity oppdatere prosjektet utsikt og filreferanser; å gjøre at vi må ringe AssetDatabase.Refresh ()
byte [] pngData = tex.EncodeToPNG ();. if (pngData = null!) File.WriteAllBytes ( "Assets /texture.png", pngData); DestroyImmediate (tex), AssetDatabase.Refresh ();

La oss teste om teksturen blir opprettet når vi utfører vår rutine



Trinn 9: Lag en Material

Vi er. har fått et bilde, og nå kan vi skape et materiale som bruker det som en tekstur. La oss lage en ny Material
AssetDatabase.Refresh ();. Ny Material (Shader.Find ( "diffuse"));

Det skapte materialet vil bruke en Diffus
shader. For å lagre dette materialet til filen, kan vi kalle AssetDatabase.CreateAsset (). Denne funksjonen tar en eiendel som første argument, og banen som den andre en
AssetDatabase.Refresh ();. AssetDatabase.CreateAsset (ny Material (Shader.Find ( "diffuse")), «Eiendeler /nytt materiale. matte ");.

Hvis du kjører vår rutine nå, vil du se at materialet er skapt

som du kan se alt er riktig, er navnet New Material Hotell og den bruker Diffuse
shader, men det er ingen tekstur tildelt



Trinn 10:. Tilordne Texture

Først må vi få en referanse til materialet vi nettopp opprettet. Vi kan få det ved å ringe AssetDatabase.LoadAssetAtPath () som laster eiendelen og returnerer referanse
AssetDatabase.CreateAsset (ny Material (Shader.Find ( "diffuse")), «Eiendeler /New Material.mat."); Materiale materialet = (Material) (AssetDatabase.LoadAssetAtPath ( "Assets /New Material.mat", typeof (Material)));

Nå skal tildele vår generert tekstur som hoved tekstur av materialet. . Vi kan få tekstur henvisning til den genererte teksturen på samme måte som vi fikk materialet referansen
Material materiale = (Material) (AssetDatabase.LoadAssetAtPath ( "Assets /New Material.mat", typeof (Material))); material.mainTexture = (Texture2D) (AssetDatabase.LoadAssetAtPath ( "Assets /texture.png", typeof (Texture2D)));

For å se resultatene, kjører du Material Rutine
<. p> Som du kan se, har materialet tekstur tildelt nå.

Konklusjon

det er slutten av innledningen til å administrere dine eiendeler ved hjelp av skript. Hvis du ønsker å utvide din knowladge om emnet kan du besøke de Unity Editor Classes referere side, spesielt AssetDatabase manuset referansen er verdt å se nærmere på. Hvis du trenger å jobbe på et lavt nivå, bør du også lese dokumenter på System.IO å få mer informasjon om sine klasser, og hvordan du kan bruke dem. Takk for tiden din!