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 La oss nå lage et skript inni den I vår første funksjonen vi skal jobbe med prefabs, la oss kalle det en PrefabRoutine For å easly utføre denne funksjonen fra redaktøren, la oss legge det til som et MENUITEM Bortsett fra å la enheten vet at vi ønsker denne funksjonen skal være kjørbar fra Examples- >. Prefab rutine " Hvis du går tilbake til redaktøren nå (og oppdatere menyen), vil du se at det er en ny menyen som heter Eksempler Hvis du velger Prefab Rutine 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" 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 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. 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. 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å 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 (). 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 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 Nå har vi to ting å velge mellom i < . em> Eksempler La oss lage en Texture2D og sette størrelsen til (256, 256) for dette eksempelet 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. 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 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 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 for å redde vår tekstur som en PNG nå som vi har fått vår pngData vi kan skrive det i en fil og opprette en PNG 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 Også må vi la Unity oppdatere prosjektet utsikt og filreferanser; å gjøre at vi må ringe AssetDatabase.Refresh () La oss teste om teksturen blir opprettet når vi utfører vår rutine 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 Det skapte materialet vil bruke en Diffus 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 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 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 For å se resultatene, kjører du Material Rutine 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!
. Siden det ikke eksisterer i vårt prosjekt ennå, må vi skape det
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 {}
offentlig klasse Eksempler: Editor. {void PrefabRoutine () {}}
offentlige klasse Eksempler:. redaktør {[MENUITEM ( «Eksempler /Prefab Rutine")] void PrefabRoutine ( ) {}}
, trenger vi også å gjøre denne funksjonen statisk
offentlig klasse Eksempler: editor {[menyvalget ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {}}
det
ingenting vil skje siden vår funksjon er tom
Trinn 3..: Lag en mappe
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.
fra redaktøren, en ny mappe skal opprettes og være synlig i prosjektet visningen.
Trinn 4: Lag en Prefab
[MENUITEM ( «Eksempler /Prefab Rutine")] static void PrefabRoutine () {AssetDatabase.CreateFolder ( "Assets", "Prefab mappe"); Objekt prefab = EditorUtility.CreateEmptyPrefab ( "Assets /Prefab Folder /obj.prefab"); AssetDatabase.Refresh ();}
[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 ();.}
Trinn 5: Sett Prefab
[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),.}
Trinn 6:. Legg til en menypunkt
.
[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 () {}
menyen
Trinn 7:. Lag en Texture
[MENUITEM ( «Eksempler /Material Rutine")] static void MaterialRoutine () {Texture2D tex = new Texture2D (256, 256);}
[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 ()); }}
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)));}
Trinn 8:. Lag et bilde
hjelp UnityEngine;. Bruker System.Collections, ved hjelp UnityEditor, bruker System. IO; public class Eksempler: Editor
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 ();
bilde på denne måten
byte [] pngData = tex.EncodeToPNG ();. if (pngData = null!) File.WriteAllBytes ( "Assets /texture.png ", pngData);
byte [] pngData = tex.EncodeToPNG ();. If (pngData = null!) File.WriteAllBytes ( "Assets /texture.png", pngData); DestroyImmediate (tex);
byte [] pngData = tex.EncodeToPNG ();. if (pngData = null!) File.WriteAllBytes ( "Assets /texture.png", pngData); DestroyImmediate (tex), AssetDatabase.Refresh ();
Trinn 9: Lag en Material
AssetDatabase.Refresh ();. Ny Material (Shader.Find ( "diffuse"));
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 ");.
shader, men det er ingen tekstur tildelt
Trinn 10:. Tilordne Texture
AssetDatabase.CreateAsset (ny Material (Shader.Find ( "diffuse")), «Eiendeler /New Material.mat."); Materiale materialet = (Material) (AssetDatabase.LoadAssetAtPath ( "Assets /New Material.mat", typeof (Material)));
Material materiale = (Material) (AssetDatabase.LoadAssetAtPath ( "Assets /New Material.mat", typeof (Material))); material.mainTexture = (Texture2D) (AssetDatabase.LoadAssetAtPath ( "Assets /texture.png", typeof (Texture2D)));
<. p> Som du kan se, har materialet tekstur tildelt nå.
Konklusjon