Předpokládejme, že děláte videohru na hraní rolí a potřebujete jednodušší způsob přiřazení statistik, vlastností a mnohem více různým položkám. Zatímco můžete použít Jednoty, paneláky na to a pak změnit hodnoty každé jednotlivé kopii panelák, to je nepohodlné způsob, jak jít o úkolu. Pro začátečníky tato metoda využívá více paměti, něco, co budete muset šetřit, pokud máte v plánu na výrobu velké hry. Kromě toho, pokud musíte provést nějaké změny v objektech ve hře, prostě to není tak efektivní, když je kolem několik kopií prefabů. To se stává problémem zejména v případě, že máte větší tým pro práci s, takže budete chtít, aby se věci jednodušší změnit pro ostatní členy týmu. I když nejste v týmu, tato metoda by pro vás byla při práci těžší.
Chcete-li věci usnadnit v takové situaci, máte k dispozici skriptovatelné objekty. A co jsou skriptovatelné objekty? Jednoduše řečeno, jsou to datové kontejnery. Vývojář Unity vytvoří pro tyto kontejnery základní šablonu, definující, jaké informace by měl každý objekt obsahovat. Poté jsou z této šablony vytvořeny skriptovatelné objekty,které pak používají herní objekty Unity. Ve výše uvedeném příkladu lze k definování různých vlastností položky použít jeden skriptovatelný objekt. Pak je tento skriptovatelný objekt odkazován všemi kopiemi položky. Předtím, pokud jste chtěli změnit statistiky položky, budete muset změnit hodnoty každé jednotlivé kopie položky. Nyní s Skriptovatelné Objekty, stačí pouze změnit jeden objekt (Scriptable Object) a všechny objekty získávání dat z Scriptable Object změnit ve stejnou dobu.
vždy je užitečné vidět tyto věci v akci, vytvořit nový projekt. Tento projekt ukazuje skriptovatelné objekty a jak vám mohou pomoci. Projekt se skládá ze tří herních objektů, které mají představovat tři postavy. Každá postava zdědí některé hodnoty z Skriptovatelného objektu. Tyto hodnoty jsou maximální zdraví, útok, obrana, rychlost, a jméno a barva postavy. Jednoduché uživatelské rozhraní zobrazuje tyto hodnoty, takže můžete snadno vidět výsledky použití Skriptovatelných objektů. Nyní, když máte konečný cíl, je čas začít vytvářet.
Nastavení Projektu
za Předpokladu, že bude zavádění těchto nápadů do nového projektu, otevření Jednoty Hub aplikace a vytvořit nový projekt, jak je znázorněno na Obrázku 1.
Obrázek 1: Vytvoření nového projektu
V dalším okně, dát projektu libovolný název vašeho výběru a rozhodnout o cestu k souboru. I když můžete tento projekt provést v libovolné šabloně, tento příklad používá šablonu projektu 3D, jak je znázorněno na obrázku 2. Doporučuje se použít tuto šablonu, pokud chcete následovat.
Obrázek 2: nastavení názvu, typu a umístění projektu
jakmile je projekt vytvořen, budete se chtít uspořádat. V Majetku okno, musíte vytvořit tři složky klepnutím pravým tlačítkem myši na okno a navigaci Vytvořit -> Složky, jak je znázorněno na Obrázku 3 Název složky Materiálů, Scriptable Objekty a Skripty.
obrázek 3: Vytvoření nové složky
když jste tady, je dobré pokračovat a získat tři materiály. Tyto materiály se používají ke změně barev různých objektů po jakémkoli materiálu, který skriptovatelný objekt specifikuje. Chcete-li vytvořit tyto materiály, přejděte do složky materiály a znovu klepněte pravým tlačítkem myši, tentokrát výběrem vytvořit -> materiál. Při pojmenování materiálu se doporučuje dát mu název, který koreluje s jeho barvou. Například tento první materiál lze pojmenovat Red. Chcete-li nastavit tuto barvu, musíte vybrat nově vytvořený materiál a přejít do okna Inspektor. V poli Albedo je na obrázku zobrazen výběr barvy 4 kliknutím otevřete výběr barvy.
obrázek 4: otevření výběru barvy
barva se změní buď přesunutím malého kruhu ve výběru barvy, nebo přímým zadáním hodnot RGB do spodní poloviny okna výběru barvy. Ve výše uvedeném příkladu by hodnoty RGB byly 255, 0, 0. Poté byste měli vytvořit další dva materiály a přiřadit jejich barvy. Tento příklad používá zelenou a modrou barvu, ale mohou to být libovolné barvy podle vašeho výběru.
nyní přichází čas vytvořit skutečnou scénu, kde se tato hra odehrává. Skládá se ze dvou hlavních částí – je uživatelské rozhraní, které zobrazuje statistiky vzhledem k různé skriptovací objekty a tři kapsle představující znaky. „Znaky“ jsou nejjednodušší částí, takže můžete začít tam. Jediné, co musíte udělat, je jít do okna hierarchie, klepněte na tlačítko Vytvořit a zvolte 3D objekt – > kapsle znázorněné na obrázku 5. Udělejte to třikrát nebo zkopírujte první objekt a můžete jim také dát jména, pokud si přejete. Tento příklad dává tobolkám názvy Char1, Char2, Char3.
obrázek 5: vytvoření objektu kapsle
budete muset změnit své pozice, takže se navzájem nepřekrývají. Chcete-li změnit polohu objektu, vyberte jednu v hierarchii a přejděte na komponentu transformace v inspektoru. Poté změňte polohovací pole x, y A z a přesuňte objekty tam, kde je chcete.
obrázek 6: Úprava polohy objektu
Tabulka 1 ukazuje přesné polohy všech tří kapslí v tomto příkladu.
Tabulka 1: Všechny objekty a jejich pozice ve světě
Objekt |
Pozice X |
Pozice Y |
Z Pozice |
Char1 |
|||
Char2 |
|||
Char3 |
Samozřejmě, neváhejte upravit každé z těchto čísel, pokud si budete přát. Další na řadě je uživatelské rozhraní, které zobrazuje hodnoty dané Skriptovatelným objektům. Chcete-li začít, musíte kliknout na tlačítko vytvořit hierarchii, ale tentokrát zvolte UI – > plátno. Poté s vybraným novým objektem plátna znovu klikněte na tlačítko Vytvořit a tentokrát vyberte vytvořit prázdné dítě. Nakonec ještě jednou kliknete na tlačítko Vytvořit a tentokrát zvolíte UI – > Text. Přetáhněte nově vytvořený Textový objekt na prázdnou herní objekt a duplicitní Text čtyřikrát pomocí Ctrl + D tak, že tam je celkem pět Textových objektů pod GameObject. Po dokončení by vaše hierarchie měla vypadat jako hierarchie na obrázku 7.
Obrázek 7: současná Hierarchie
Každý Textový objekt odpovídá název a statistiky, které jsou uvedeny prostřednictvím Scriptable Object, ty statistiky, že maximální zdraví, útok, obrana, a speed. Je užitečné změnit názvy textových objektů na hodnotu, kterou představuje. Takže první textový objekt lze nazvat name_text a druhý lze nazvat attack_text atd. Kromě toho, budete muset změnit výchozí text k pomoci poskytnout vizuální uživatelské rozhraní vypadá. To se provádí navigací na textovou komponentu v inspektoru a změnou textové hodnoty. A nakonec upravte své pozice tak,aby nebyly všechny naskládány na sebe. Aby to bylo snadné, Tabulka 2 ukazuje všechny různé názvy objektů a jaké by měly být jejich příslušné hodnoty.
Tabulka 2: Všechny Textové objekty a jejich výchozí text a umístění hodnoty
Přejmenovat GameObject (pod Plátnem) pro něco trochu více popisný, jako Char1Description, pak duplicitní nadřazeného objektu. Přejmenujte dva duplikáty na Char2Description a Char3Description a umístěte tři objekty tak, aby byly nad objekty kapsle. Tento příklad umísťuje Char1Description na pozici X -300, Char2description na 0 a Char3Position na 250. Všechny hodnoty polohy Y A Z jsou ponechány na 0.
byla to trochu dlouhá cesta, ale nastavení projektu je dokončeno! Nyní přichází čas kódovat a vidět, jak jsou vytvářeny skriptovatelné objekty, pokud jde o programování. V okně aktiva přejděte do složky skripty a vytvořte dva nové skripty kliknutím pravým tlačítkem myši a navigací k vytvoření – > C# Script. Tyto skripty by se měly nazývat CharStats a LoadStats. Jakmile jsou vytvořeny, začnete ve skriptu CharStats, takže poklepejte na tento skript a otevřete Visual Studio a začněte s procesem kódování.
CharStats Script
Chcete-li vytvořit skriptovatelný objekt, musíte nejprve přidat do nabídky Create
, kterou jste použili k vytváření materiálů a skriptů. Chcete-li to provést, použijte atribut CreateAssetMenu
a zadejte výchozí název souboru a umístění v nabídce. Také budete muset změnit, z jaké třídy CharStats
zdědí. Ve výchozím nastavení každá třída C# v projektu Unity dědí z MonoBehaviour
, ale tento skript musí místo toho dědit z ScriptableObject
.
při nastavení menuName
si všimněte, že se používá lomítko, které označuje použití podnabídky. Pokud byste chtěli, mohli byste odstranit lomítko a Hráč volba Jednotek dárek, aniž byste museli navigovat dále pomocí nabídky „Vytvořit“. V tomto případě byla podnabídka přidána především proto, aby ukázala, že můžete uspořádat skriptovatelné objekty podle toho, co si přejete. V tomto případě je nabídka Create – > Character Creation – > Player Units. Pokud jste chtěli, v jiném Skriptovatelném objektu můžete nechat objekt vytvořit ze stejné cesty, ale s jinou možností vytvořit, například položka.
jako skriptovatelný objekt není potřeba výchozí Start
a metody aktualizace, takže je můžete odstranit. Primárním účelem tohoto objektu je uchovávat data, která jsou dána jinému objektu, ale jsou také vytvořeny dvě vlastní metody, které demonstrují, jak skriptovatelné objekty mohou dělat víc než jen držet data. Když už mluvíme o údaje, kód pro určení, jaká data tento objekt má takhle:
1
2
3
4
5
6
|
public string charName;
public int útok;
public int obrany;
public int rychlost;
public int maxHealth;
veřejná Materiál newColor;
|
Jak již bylo zmíněno dříve, každý scriptable object obsahuje název a některé hodnoty pro čtyři různé statistiky. Obsahuje také informace o tom, jaká je nová barva postavy, jakmile je použit skriptovatelný objekt. Hodnoty pro každou z nich jsou definovány v editoru Unity a samozřejmě se budou lišit pro každý vytvořený objekt.
tyto dvě metody jsou jednoduché. Jeden jednoduše vytiskne zprávu do debug konzole, že znak byl načten. Tato zpráva je vytištěna metodou Start
skriptu LoadStats
.
1
2
3
4
|
public void PrintMessage()
{
Debug.Log („znak“ + znaku + “ byl načten.“);
}
|
RandomizeStats
, druhá metoda, dělá přesně to, co název napovídá. Změní hodnoty Skriptovatelného objektu na náhodné číslo mezi 1 a 20. Později Projekt naprogramujete tak, aby automaticky aktualizoval uživatelské rozhraní novými hodnotami. Ale to není ani ta nejzajímavější část! Data v Skriptovatelném objektu jsou trvalá, což znamená, že zůstanou stejná pro relaci až do ukončení hry. To je zvláště užitečné, pokud děláte hru, která se skládá z více scén, protože obvykle staré objekty jsou odstraněny, a nové jsou reloaded jako nové scény je otevřeno. Data Skriptovatelných objektů jsou však při přechodu mezi scénami nedotčena. Kromě toho zůstávají data při práci v editoru Unity stejná, dokud není samotný editor uzavřen. To znamená, že změny provedené v datech v Skriptovatelných objektech při spuštění hry z editoru jsou přítomny, jakmile znovu hrajete hru z editoru, za předpokladu, že nedojde ke změnám samotných dat.
to je vše, co je k charstats skriptu. Může se to zdát poměrně jednoduché, ale projekt není úplný. Naprogramovali jste schopnost vytvářet skriptovatelné objekty pomocí vlastních metod a dat, ale vaše postavy z kapslí o těchto objektech nic nevědí. Pokud jde o ně, skriptovatelné objekty neexistují. Chcete-li opravit, budete muset otevřít LoadStats skript a kód je tak objekty, které lze použít ve Skriptech Objektu data aktualizovat uživatelské rozhraní a změnit jejich barvu. Kód by měl vypadat podobně jako obrázek 8.
Obrázek 8: Úplné CharStats skript
LoadStats Skript
nebojte se o změně, kde je třída tento skript dědí. Výchozí MonoBehaviour
je přesně to, co je potřeba. Místo toho zahrňte nový příkaz using v horní části.
1
|
použití UnityEngine.UI;
|
Včetně to vám umožní získat text z uživatelského rozhraní a aktualizovat je pro zobrazení hodnoty našel ve Skriptech Objekty. Nyní na samotnou třídu, počínaje proměnnými.
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;
|
jak je uvedeno v komentáři, proměnná charStat
je skriptovatelný objekt, který se používá. Zde můžete vidět, že získání těchto Skriptovatelných objektů se neliší od deklarace jakékoli jiné proměnné. Později ve skriptu získáte proměnné a metody v objektu a použijete je v tomto skriptu. Ve skutečnosti je metoda PrintMessage
nalezená v CharStats
použita v LoadStats
Start
právě teď.
1
2
3
4
5
|
void Start()
{
DisplayStats();
charStat.PrintMessage();
}
|
Jako s jakýmkoli jiným mimo scénář, vše, co musíte udělat, je zavolat charStat
následuje PrintMessage
na ten způsob našel ve Skriptech Objektu. To se může ukázat jako zvláště užitečné, pokud máte objekty, které mají podobné nebo identické chování. V tomto případě může být také užitečné pro vývojáře, stejně jako v tomto příkladu, tisknout zprávy do debug konzole. Pokud se něco pokazí a máte podezření, že skriptovatelný objekt je na vině, můžete problém najít pomocí zpráv konzoly ladění.
právě teď je chyba, že DisplayStats
neexistuje. Chcete-li to opravit, přejděte pod metodu Update
a přidejte tento kód.
zde jsou hodnoty uložené v Skriptovatelném objektu, které se hrají. Všechny ty textové proměnné deklarované dříve? Budou mít data k zobrazení, takže ty otazníky, které jste nastavili v editoru, nyní zobrazují nějakou hodnotu. Také, i když to není opravdu stat, per se, barva znaku se změní tu zavoláním currentColor.material
a nastavení na materiál nachází v Scriptable Object.
druhá metoda charStats
, RandomizeStats
, dosud neviděla použití, takže byste pro ni měli najít místo. V metodě Update
program zkontroluje, zda byl stisknut mezerník. Pokud ano, pak volá RandomizeStats
a dává Skriptovatelnému objektu nějaké nové hodnoty. Poté se znovu zavolá DisplayStat
a zobrazí se nové hodnoty.
1
2
3
4
5
6
7
8
|
void Update()
{
if (Vstup.GetKeyDown (Klíčový Kód.Prostor))
{
charštát.RandomizeStats();
DisplayStats();
}
}
|
Tento závěr LoadStats
scénář, tedy ukončení kódování část tohoto projektu. Kód by měl vypadat podobně jako obrázek 9. Vše, co teď zbývá udělat, je vytvořit několik Skriptovatelných objektů, aplikovat je na objekt kapsle pomocí LoadStats
a vyzkoušet tuto novou funkci. Před návratem do editoru Unity si samozřejmě Uložte svou práci.
Obrázek 9: Kompletní LoadStats skript
Dokončení Projektu
použít Skriptovací Objekty, musíte nejprve vytvořit. V okně aktiva ve složce Scriptable Objects klepněte pravým tlačítkem myši a přejděte na Create – > Character Creation – > Player Units, jak je znázorněno na obrázku 10.
obrázek 10: Vytvoření nové jednotky přehrávače, skriptovatelný objekt
objekt můžete pojmenovat, co si přejete. Příklad zakládá tyto objekty na tradičních třídách Hraní rolí, takže bude mít válečníka, lovce a mága. Vyberte nový objekt, poté přejděte do okna inspektor a zadejte hodnoty různým polím. Chcete-li vyplnit pole Nová barva, přejděte do složky materiály a klikněte a přetáhněte požadovaný materiál do pole, jak je znázorněno na obrázku 11.
obrázek 11: Nastavení nového barevného materiálu objektu
vytvořte další dva skriptovatelné objekty a udělejte to samé jako dříve, což jim dává různé hodnoty pro různá pole. Po dokončení přejděte do okna hierarchie a vyberte jeden z objektů char. Pak jim LoadStats skript jako součást navigace do složky Scripts v Majetku okně, najít LoadStats, a přetažením do Inspektor okno, jak je znázorněno na Obrázku 12.
Obrázek 12: připojení skriptu LoadStats k objektu
Dále budete muset vyplnit pole LoadStats. Chcete-li začít, najděte skriptovatelný objekt, který chcete použít na svém prvním „znaku“, a aplikujte jej na pole Char Stat, jak je znázorněno na obrázku 13. Nezapomeňte, že skriptovatelné objekty se nacházejí v okně aktiva v části skriptovatelné objekty.
obrázek 13: nastavení, kde skriptovatelný objekt Char1 má získat data
nyní vyplňte textová pole. V Hierarchii, budete rozšířit Plátno následuje rozšiřující popis charakteru objektu, který koreluje s jedním jste právě upravujete. Například úprava Char1 znamená, že budete chtít rozšířit Char1Description. Poté vezměte textové objekty nalezené pod nadřazeným objektem a aplikujte je na odpovídající pole, jak je znázorněno na obrázku 14.
Obrázek 14: Nastavení všech textových polí
Jakmile je textové pole naplněné, stačí, aby ten objekt je Ok Renderer, takže budete mít přístup k materiálu, což umožní změnu barvy. Vše, co musíte udělat, je kliknout a přetáhnout komponentu Mesh Renderer v okně inspektor a přetáhnout ji do aktuálního barevného pole, jak je znázorněno na obrázku 15.
obrázek 15: Nastavení aktuálního barevného pole
opakujte několik předchozích kroků pro další dva znakové objekty a projekt dokončíte. Až budete připraveni, klikněte na tlačítko Přehrát v horní části editoru a sledujte, jak tři téměř identické objekty mají k nim velmi odlišné hodnoty. Pokud z nějakého důvodu něco, co nevypadá dobře, první místo by bylo vaše Skriptovatelné Objekty a ujistit sám sebe, že hodnoty a barvy jsou zobrazeny ty, které jste chtěli. Nezapomeňte také znovu zkontrolovat nové barevné pole.
všechna tato čísla a jejich barvy pocházejí ze Skriptovatelných objektů, které samy o sobě pocházejí z jedné šablony. Dalo by se vytvořit ještě více Skriptovatelných objektů a zapojit je do pole Char Stat v komponentě Load Stats objektu a mít velmi odlišný charakter. Při spuštění hry (Obrázek 16), měli byste vidět zprávu v konzole ladění v levém dolním rohu oznamující znak byl načten. Tam jsou dvě jiné zprávy, ale můžete vidět pouze jednu zprávu bez otevření full debug konzole, našel u Okna -> Obecné -> Console. Můžete také stisknout mezerník, abyste získali zcela nové statistiky pro své postavy. Pokud hru zastavíte, znovu ji spustíte, všimnete si, že hodnoty, které jste náhodně vygenerovali, přetrvávají, což dokazuje vytrvalost Skriptovatelných objektů. Vrátí se ke svým původním hodnotám buď ručním zadáním hodnot do objektů sami, nebo zavřením a opětovným otevřením editoru.
Obrázek 16: Skriptovatelné Objekty v akci
Závěr
Samozřejmě, můžete vytvořit více typů Skriptovatelné Objekty pro mnoho typů objektů. Tento příklad demonstroval jejich použití pomocí tříd znaků, ale je zde také výše uvedený příklad položek. Může být dokonce použit pro mnohem menší objekty, jako jsou power-ups připomínající ty, které se nacházejí v arkádových hrách. Při používání Skriptovatelných objektů vytvoříte čistý a snadný systém, kde můžete měnit a načítat data pomocí několika stisků kláves a vidět výsledky téměř okamžitě. Použití Skriptovatelných objektů také znamená méně skriptů k vytvoření, protože můžete použít jednu šablonu pro více objektů. Bez ohledu na to, zda je váš projekt velký nebo malý, nebo zda má váš tým mnoho členů nebo jen vy, skriptovatelné objekty mohou vývoj každého trochu usnadnit.