Antag, at du laver et rollespil, og du har brug for en nemmere måde at tildele statistik, egenskaber og meget mere til forskellige elementer. Mens du kunne bruge Unity prefabs til at gøre dette og derefter ændre værdierne for hver enkelt kopi af prefab, er dette en ubelejlig måde at udføre opgaven på. Til at begynde med bruger denne metode mere af din hukommelse, noget du muligvis skal spare, hvis du planlægger at lave et stort spil. Derudover, hvis du skal foretage ændringer i objekterne i spillet, er det simpelthen ikke så effektivt at gøre det, når der er flere kopier af præfabrikker, der ligger rundt. Dette bliver især et problem, hvis du har et større team at arbejde med, så du vil gøre tingene lettere at ændre for andre teammedlemmer. Selvom du ikke er i et team, ville denne metode bare være sværere for dig, mens du arbejder.
for at gøre tingene lettere i en situation som denne, har du Scriptable objekter til din rådighed. Hvad er Scriptable Objects? Kort sagt, de er databeholdere. Unity-udvikleren opretter en grundlæggende skabelon til disse containere, der definerer, hvilke oplysninger hvert objekt skal indeholde. Derefter oprettes de Scriptable objekter fra den skabelon, som derefter bruges af Unity game objects. I ovenstående eksempel kan et enkelt scriptbart objekt bruges til at definere, hvad de forskellige egenskaber for et element er. Derefter refereres det Scriptable objekt af alle kopier af elementet. Før hvis du ønskede at ændre en vares statistik, skal du ændre værdierne for hver enkelt kopi af varen. Nu med Scriptable objekter behøver du kun at ændre et objekt (det Scriptable objekt) og alle objekter, der får data fra det Scriptable objekt, ændres på samme tid.
det er altid nyttigt at se disse ting i aktion, oprette et nyt projekt. Dette projekt viser Scriptable objekter, og hvordan de kan hjælpe dig. Projektet består af tre spilobjekter beregnet til at repræsentere tre tegn. Hvert tegn arver nogle værdier fra et scriptbart objekt. Disse værdier er maksimal sundhed, angreb, forsvar, hastighed og et navn og farve for karakteren. En simpel brugergrænseflade viser disse værdier, så du nemt kan se resultaterne af at anvende Scriptable objekter. Nu hvor du har et slutmål, er det tid til at skabe.
Projektopsætning
hvis du antager, at du implementerer disse ideer i et nyt projekt, skal du åbne Unity Hub-applikationen og oprette et nyt projekt som vist i Figur 1.
Figur 1: Oprettelse af et nyt projekt
i det næste vindue skal du give projektet ethvert navn, du vælger, og beslutte filstien. Mens du kan udføre dette projekt i en hvilken som helst skabelon, bruger dette eksempel 3D-projektskabelonen som vist i figur 2. Det anbefales, at du bruger denne skabelon, hvis du ønsker at følge med.
figur 2: Indstilling af projektnavn, type og placering
når projektet er oprettet, vil du blive organiseret. I vinduet Aktiver skal du oprette tre mapper ved at højreklikke på vinduet og navigere til mappen Create-> som vist i figur 3 navngiv mapperne materialer, Scriptable objekter og Scripts.
figur 3: Oprettelse af en ny mappe
mens du er her, er det en god ide at gå videre og få lavet tre materialer. Disse materialer bruges til at ændre farverne på forskellige objekter efter uanset materiale Scriptable objekt specificerer. For at oprette disse materialer skal du navigere til mappen materialer og højreklikke igen, denne gang vælge Opret-> materiale. Ved navngivning af materialet anbefales det at give det et navn, der korrelerer med dets farve. For eksempel kan dette første materiale navngives rødt. For at indstille denne farve skal du vælge det nyoprettede materiale og navigere til Inspektørvinduet. I Albedo-feltet er der en farvevælger vist i figur 4, Du kan klikke på for at åbne farvevælgeren.
figur 4: åbning af farvevælgeren
farven ændres enten ved at flytte den lille cirkel i farvevælgeren eller ved direkte at indtaste RGB-værdierne i den nederste halvdel af farvevælgervinduet. I ovenstående eksempel ville RGB-værdierne være 255, 0, 0. Herefter skal du oprette to materialer og tildele deres farver. Dette eksempel bruger grøn og blå, men de kan være enhver farve efter eget valg.
nu kommer tid til at skabe den faktiske scene dette hvor dette spil finder sted. Den består af to hoveddele – der er brugergrænsefladen, der viser statistikken givet til forskellige scriptable objekter og de tre kapsler, der repræsenterer tegn. “Tegnene” er den nemmeste del, så du kan starte der. Alt hvad du skal gøre er at gå til Hierarkivinduet, klikke på knappen Opret og vælge 3D Object -> kapsel vist i figur 5. Gør dette tre gange eller kopier det første objekt, og du kan også give dem Navne, hvis du ønsker det. Dette eksempel giver kapslerne navnene Char1, Char2, Char3.
figur 5: Oprettelse af et kapselobjekt
du skal ændre deres positioner, så de ikke overlapper hinanden. Hvis du vil ændre objektets position, skal du vælge en i hierarkiet og navigere til Transform-komponenten i Inspektøren. Skift derefter positioneringsfelterne for at flytte objekterne, hvor du vil have dem.
figur 6: Redigering af objektets position
tabel 1 viser de nøjagtige positioner for alle tre kapsler i dette eksempel.
tabel 1: Alle objekter og deres positioner i verden
objekt |
position |
Y Position |
position |
Char1 |
|||
Char2 |
|||
Char3 |
selvfølgelig er du velkommen til at justere et af disse tal, hvis du ønsker det. Næste op er brugergrænsefladen, som viser de værdier, der gives til Scriptable objekter. For at starte skal du klikke på hierarkiets Opret-knap, men denne gang skal du vælge UI – > Canvas. Klik derefter på knappen Opret igen med det nye Canvas-objekt valgt, og vælg denne gang opret tomt barn. Endelig klikker du endnu en gang på knappen Opret, og denne gang vælger du UI -> tekst. Træk det nyoprettede tekstobjekt til det tomme spilobjekt, og Dupliker tekst fire gange ved hjælp af Ctrl + D, så der er i alt fem tekstobjekter under GameObject. Når du er færdig, skal dit hierarki se ud som det i Figur 7.
Figur 7: det nuværende hierarki
hvert tekstobjekt korrelerer med navnet og statistikken, der gives via Scriptable Object, idet disse statistikker er maksimal sundhed, angreb, forsvar og hastighed. Det er nyttigt at ændre Tekstobjektnavne til den værdi, den repræsenterer. Så det første tekstobjekt kan kaldes navn_tekst, og det andet kan kaldes angreb_tekst osv. Derudover skal du ændre standardteksten for at hjælpe med at give et visuelt billede af, hvordan brugergrænsefladen ser ud. Dette gøres ved at navigere til Tekstkomponenten i inspektøren og ændre Tekstværdien. Og til sidst skal du justere deres positioner, så de ikke alle er stablet oven på hinanden. For at holde dette let viser tabel 2 alle de forskellige objektnavne, og hvad deres respektive værdier skal være.
tabel 2: alle tekstobjekter og deres standardtekst-og positioneringsværdier
Omdøb GameObject (Under Canvas) til noget lidt mere beskrivende, såsom Char1Description, og Dupliker derefter det overordnede objekt. Omdøb de to dubletter til Char2Description og Char3Description og placer de tre objekter, så de er over kapselobjekterne. Dette eksempel placerer Char1Description i en position på -300, Char2Descrption ved 0 og Char3Position ved 250. Alle y-OG Å-positionsværdier er tilbage på 0.
det var lidt af en lang vej, men projektopsætningen er færdig! Nu er det tid til at kode og se, hvordan Scriptable objekter oprettes, så vidt programmeringen går. I vinduet Aktiver skal du navigere til mappen Scripts og oprette to nye scripts ved at højreklikke og navigere for at oprette-> C# Script. Disse scripts skal kaldes CharStats og LoadStats. Når de er oprettet, starter du i CharStats-scriptet, så dobbeltklik på dette script for at åbne Visual Studio og komme i gang med kodningsprocessen.
CharStats Script
for at oprette et scriptbart objekt skal du først føje til menuen Create
, du har brugt til at oprette materialer og scripts. For at gøre dette skal du bruge attributten CreateAssetMenu
og angive standardfilnavnet og placeringen i menuen. Du skal også ændre, hvilken klasse CharStats
der arver fra. Som standard arver hver c# – klasse i et Unity-projekt fra MonoBehaviour
, men dette script skal arve fra ScriptableObject
i stedet.
Bemærk, Når du indstiller menuName
, at der bruges et skråstreg, der angiver brugen af undermenuer. Hvis du ville, du kunne fjerne skråstreg og bare have Player Units mulighed til stede uden at skulle navigere videre gennem menuen Opret. I dette tilfælde blev undermenuen tilføjet primært for at vise, at du kan organisere dine Scriptable objekter efter hvad du ønsker. I dette tilfælde er menuen Opret -> oprettelse af tegn -> Afspillerenheder. Hvis du vil, kan du i et andet scriptbart objekt få objektet til at blive oprettet fra den samme sti, men med en anden oprettelsesindstilling, f.eks.
at være et scriptbart objekt er der ikke behov for standard Start
og Opdateringsmetoder, så du kan slette dem. Dette objekts primære formål er at holde data, der gives til et andet objekt, men der oprettes også to brugerdefinerede metoder for at demonstrere, hvordan Scriptable objekter kan gøre mere end bare at holde data. Når vi taler om data, går koden til at definere, hvilke data dette objekt har, sådan:
1
2
3
4
5
6
|
offentlig streng charName;
offentlig int angreb;
offentlig int forsvar;
offentlig int hastighed;
offentlig int maksimal sundhed;
offentligt materiale nyfarve;
|
som nævnt før indeholder hvert scriptbart objekt et navn og nogle værdier for fire forskellige statistikker. Det indeholder også oplysninger om, hvad karakterens nye farve, når det Scriptable objekt er anvendt. Værdierne for hver er defineret i Unity editor, og selvfølgelig vil de være forskellige for hvert objekt, der oprettes.
de to metoder holdes enkle. Man udskriver blot en besked til debug-konsollen, der siger, at karakteren blev indlæst. Denne meddelelse er trykt i Start
– metoden i LoadStats
scriptet.
1
2
3
4
|
offentlig void PrintMessage()
{
Debug.Log (“tegnet” + charName + ” er indlæst.”);
}
|
RandomizeStats
, den anden metode gør præcis som navnet antyder. Det ændrer værdierne for det Scriptable objekt til et tilfældigt tal mellem 1 og 20. Senere programmerer du projektet til automatisk at opdatere brugergrænsefladen med de nye værdier. Men det er ikke engang den mest interessante del! Data i et scriptbart objekt er vedholdende, hvilket betyder, at de forbliver de samme for sessionen, indtil spillet er lukket. Dette er især nyttigt, hvis du laver et spil, der består af flere scener, da normalt gamle objekter slettes, og nye genindlæses, når en ny scene åbnes. Imidlertid er Scriptable objektdata uberørt i overgangen mellem scener. Derudover forbliver dataene de samme, mens du arbejder i Unity editor, indtil editoren selv er lukket. Dette betyder, at ændringer, der er foretaget i dataene i Scriptable objekter, mens du kører spillet fra editoren, er til stede, når du spiller spillet fra editoren igen, forudsat at der ikke foretages ændringer i selve dataene.
dette er alt, hvad der er til CharStats script. Det kan virke ret simpelt, men projektet er ikke færdigt. Du har programmeret evnen til at lave Scriptable objekter med sine egne metoder og data, men dine kapselkarakterer ved ikke noget om disse objekter. Så vidt de er bekymrede, eksisterer de Scriptable objekter ikke. For at løse dette skal du åbne loadstats-scriptet og kode det, så objekterne kan bruge et scriptbart objekts data til at opdatere brugergrænsefladen og ændre deres farve. Koden skal ligne figur 8.
figur 8: Komplet CharStats script
LoadStats Script
må ikke bekymre dig om at ændre, hvor klassen dette script arver. Standard MonoBehaviour
er netop det, der er nødvendigt. I stedet skal du medtage en ny brug af sætning øverst.
1
|
brug af UnityEngine.UI;
|
inklusive dette giver dig mulighed for at hente teksten fra brugergrænsefladen og opdatere dem for at vise de værdier, der findes i de Scriptable objekter. Nu, på selve klassen, startende med variabler.
1
2
3
4
5
6
7
8
|
// scriptable object
public CharStats charStat;
public Text nameText;
public Text attackText;
public Text defenseText;
public Text speedText;
public Text maxHealthText;
public MeshRenderer currentColor;
|
som bemærket i kommentaren er variablen charStat
det Scriptable objekt, der bruges. Du kan se her, at få disse Scriptable objekter er ikke anderledes end at erklære nogen anden variabel. Senere i scriptet får du variablerne og metoderne i objektet og bruger dem i dette script. Faktisk er PrintMessage
metoden fundet i CharStats
brugt i LoadStats
Start
metoden lige nu.
1
2
3
4
5
|
void Start()
{
DisplayStats ();
charStat.PrintMessage();
}
|
som med ethvert andet eksternt script er alt hvad du skal gøre at ringe charStat
efterfulgt af PrintMessage
for at få metoden fundet i det Scriptable objekt. Dette kan vise sig særligt nyttigt, hvis du har objekter, der alle har lignende eller identiske adfærd. I dette tilfælde kan det også være nyttigt for udvikleren at, som i dette eksempel, udskrive meddelelser til debug-konsollen. Hvis noget skulle gå galt, og du havde mistanke om, at det Scriptable objekt var skyld, kunne du bruge debug-konsolmeddelelserne til at finde problemet.
lige nu er der en fejl, der siger DisplayStats
eksisterer ikke. For at løse dette skal du navigere under Update
– metoden og tilføje denne kode.
her er hvor de værdier, der er gemt i det Scriptable objekt, kommer ud for at spille. Alle de tekstvariabler, der er erklæret tidligere? De får data, der skal vises, så de spørgsmålstegn, du angiver i editoren, viser nu en vis værdi. Selvom det ikke rigtig er en stat i sig selv, ændres farven på karakteren her ved at ringe currentColor.material
og indstille den til materialet i det Scriptable objekt.
den anden charStats
metode, RandomizeStats
, har endnu ikke set brug, så du skal finde et sted til det. I Update
– metoden kontrollerer programmet, om der er trykket på mellemrumstasten. Hvis det har, så kalder det RandomizeStats
og giver det Scriptable objekt nogle nye værdier. Derefter kaldes DisplayStat
igen, og de nye værdier vises.
1
2
3
4
5
6
7
8
|
ugyldig opdatering()
{
hvis (Input.Hent Nedlukning (Nøglekode.Plads))
{
charStat.Randomiseringsmidler ();
DisplayStats();
}
}
|
dette afslutter LoadStats
scriptet og afslutter således kodningsdelen af dette projekt. Koden skal ligne figur 9. Alt, hvad der er tilbage at gøre nu, er at oprette et par Scriptable objekter, anvende dem på kapselobjektet ved hjælp af LoadStats
, og prøv denne nye funktionalitet ud. Sørg selvfølgelig for at gemme dit arbejde, før du vender tilbage til Unity editor.
figur 9: komplet loadstats script
afslutning af projektet
for at bruge Scriptable objekter skal du først oprette dem. I vinduet Aktiver under mappen Scriptable Objects skal du højreklikke og navigere for at oprette-> oprettelse af tegn- > Afspillerenheder som vist i Figur 10.
Figur 10: Oprettelse af en ny spiller enhed, en Scriptable objekt
du kan navngive objektet, hvad du ønsker. Eksemplet baserer disse objekter fra traditionelle rollespil klasser, så det vil have en kriger, jæger og mage. Vælg det nye objekt, naviger derefter til Inspektørvinduet og angiv værdier til de forskellige felter. For at udfylde det nye farvefelt skal du bare navigere til din Materialemappe og klikke og trække det ønskede materiale til feltet som vist i Figur 11.
Figur 11: Indstilling af objektets nye farvemateriale
Opret yderligere to Scriptable objekter, og gør det samme som før, hvilket giver dem forskellige værdier for de forskellige felter. Når det er gjort, skal du flytte til Hierarkivinduet og vælge et af char-objekterne. Giv dem derefter LoadStats-scriptet som en komponent ved at navigere til mappen Scripts i vinduet Aktiver, finde LoadStats og trække det ind i Inspektørvinduet som vist i Figur 12.
Figur 12: vedhæftning af loadstats script til et objekt
Dernæst skal du udfylde felterne LoadStats. For at begynde skal du finde et scriptbart objekt, du vil bruge på dit første “tegn”, og anvende det på Char Stat-feltet som vist i Figur 13. Husk, at Scriptable objekter findes i vinduet Aktiver under Scriptable objekter.
figur 13: indstilling, hvor det Scriptable objekt Char1 er at hente data
udfyld nu tekstfelterne. I hierarkiet udvider du Canvas efterfulgt af udvidelse af tegnbeskrivelsesobjektet, der korrelerer med det, du redigerer i øjeblikket. For eksempel betyder redigering af Char1, at du vil udvide Char1Description. Tag derefter de tekstobjekter, der findes under det overordnede objekt, og anvend dem på de tilsvarende felter som vist i figur 14.
figur 14: Indstilling af alle tekstfelter
når tekstfelterne er udfyldt, skal du bare hente objektets Maskegengiver, så du har adgang til materialet, hvilket tillader farveændringen. Alt du skal gøre er at klikke og trække maskegengivelseskomponenten i Inspektørvinduet og trække den ind i det aktuelle farvefelt som vist, hvis figur 15.
Figur 15: Indstilling af det aktuelle farvefelt
gentag de foregående få trin for de to andre tegnobjekter, og du er færdig med projektet. Når du er klar, skal du klikke på afspilningsknappen øverst i editoren og observere, da tre næsten identiske objekter har meget forskellige værdier knyttet til dem. Hvis noget af en eller anden grund ikke ser rigtigt ud, ville det første sted at kontrollere være dine Scriptable objekter og forsikre dig selv om, at de viste værdier og farver er dem, du ønskede. Husk også at dobbelttjekke det nye farvefelt.
alle disse tal og deres farver kommer fra Scriptable objekter, som selv kommer fra en enkelt skabelon. Du kan også lave endnu mere Scriptable objekter og sætte dem i Char Stat-feltet i et objekts Belastningsstatistikkomponent og have en meget anden karakter. Mens du kører spillet (Figur 16), skal du se en meddelelse i debug-konsollen i nederste venstre hjørne om, at et tegn er indlæst. Der er to andre meddelelser, men du kan kun se den ene besked uden at åbne den fulde debug-konsol, der findes i vinduet- > generelt – > konsol. Du kan også trykke på mellemrumstasten for at få nogle helt nye statistikker for dine tegn. Hvis du stopper spillet og derefter kører det igen, vil du bemærke, at de værdier, du tilfældigt genererede, vedvarer, hvilket viser vedholdenheden af Scriptable objekter. De vender tilbage til deres oprindelige værdier enten ved manuelt at indtaste værdierne i objekterne selv eller ved at lukke og genåbne editoren.
Figur 16: Scriptable Objects in action
konklusion
naturligvis kan du oprette flere typer Scriptable objekter til mange typer objekter. Dette eksempel demonstrerede deres anvendelse via karakterklasser, men der er også det førnævnte elementeksempel. Det kan endda bruges til meget mindre genstande, såsom opstart, der minder om dem, der findes i arkadespil. Ved at bruge Scriptable objekter opretter du et rent, nemt system, hvor du kan ændre og indlæse data med et par tastetryk og se resultaterne næsten øjeblikkeligt. Brug af Scriptable objekter betyder også færre scripts at oprette, da du kan bruge en skabelon til flere objekter. Uanset om dit projekt er stort eller lille, eller om dit team har mange medlemmer eller bare dig selv, kan Scriptable objekter gøre alles udvikling lidt lettere.