Hrátky s Unreal Engine VII: Klid před bouří
i Zdroj: PCTuning.cz
Hry Článek Hrátky s Unreal Engine VII: Klid před bouří

Hrátky s Unreal Engine VII: Klid před bouří | Kapitola 6

Aleš Ulm

Aleš Ulm

17. 9. 2010 03:00 34

Seznam kapitol

1. Když začít, tak v novém 2. Skriptovat či neskriptovat… 3. Skriptovat či neskriptovat podruhé 4. Je to plné souborů! 5. Třída jako ve škole 6. Kdo že tu dědí?

Na konci minulého dílu jsme vás navnadili na pokračování, ve kterém budeme vyrábět vlastní hru. Ještě než s tím začneme, je třeba si ale vysvětlit několik posledních detailů a naučit se pár drobností. Dneska si tedy povíme o dalších zákonitostech týkajících se skriptování a hlavně potom něco o dědičnosti skriptů.

Reklama

S těmi, které vysvětlení třídy zcela neodradilo, se podíváme ještě na druhý základní aspekt skriptování v UDK, kterým je dědičnost.

Představte si, že máte třídu Car, která definuje auto. Říká se v ní třeba to, že auto je něco, co se může pohybovat, má volant a kola. Do naší hry se rozhodneme dát dodávku a využívat jí k převážení nákladu. Problém je, že v naší třídě Car není o převážení nákladu vůbec nic řečeno (jak přesně by takový zápis vypadal teď není důležité – teď nám jde o obecný princip). Nikde tam nestojí, kolik nákladu lze převážet atp. Jednou z možností jak to pořešit by bylo, všechno potřebné do třídy Car prostě dopsat. To by sice fungovalo, jenže vzápětí by přišel moment, kdy bychom si řekli například „Ha, dodávka je fajn, ale dáme tam ještě autojeřáb, ne? Tříáčková hra bez autojeřábu? To by se nám vysmáli!“. A hned na to bychom si uvědomili, že v naší třídě Car nijak neřešíme funkci připevněného jeřábu. Co teď? Opět to dopsat? Asi chápete, kde bychom tímhle postupem skončili. U obrovského nepřehledného souboru. Existují i další důvody, proč tohle není dobré praktikovat, ale s našimi současnými znalostmi nám postačí ten uvedený. Druhou možností je pro každý zmíněný druh auta udělat samostatnou třídu, která bude vždy obsahovat všechno, co je teď ve třídě Car a navíc to speciální pro to které auto. To také lze, ale vyústí to v enormní množství zbytečného a duplicitního kódu. Navíc změnu v základním skriptu třídy Car bychom pak museli dodělávat do všech tříd, které by ji obsahovaly…

Dobře, ale co s tím? Přece jsme jasně řekli, že mít ve hře autojeřáb je prostě absolutní nutnost… V tuhle chvíli využijeme dědičnost. Věc, na které stojí celé skriptování v UDK.

Vraťme se k momentu, kdy jsme se rozhodli naši třídu Car upravit tak, aby se do ní „vešla“ i dodávka. Teď to uděláme jinak. Řekneme si, že třídu Car rozšíříme. Vytvoříme pro dodávku třídu novou, pojmenovanou třeba CarDeliveryTruck a v ní řekneme „Tahle třída definuje objekt, který může vozit náklad… jo vlastně má taky všechno, co má třída Car“. Vytvořili jsme třídu CarDeliveryTruck rozšířením třídy Car. Podobným způsobem můžeme vytvořit třídu pro autojeřáb, tedy třeba CarCraneTruck rozšířením třídy Car.

Uff… co se to vlastně stalo? Řekněme si to jinak. Víme, že naše dodávka je třeba z 90% identická s objektem třídy Car. Takže pro ní vytvoříme novou třídu, kterou uvedeme tím, že třídu Car rozšiřuje. Skriptový soubor, který třídu reprezentuje, by pak začínal řádkem

CarDeliveryTruck extends Car

a dál obsahoval jen těch deset procent, ve kterých se dodávka odlišuje od obecnější definice auta, nebo které má navíc. To samé bychom udělali s autojeřábem.

Hrátky s Unreal Engine VII: Klid před bouří
i Zdroj: PCTuning.cz

Výsledkem jsou dva nové miniaturní, maximálně přehledné soubory se skriptem – dvě nové třídy. A další výhoda? Představte si, že si řekneme, že žádné auto, nemůže jet rychleji než 50 km/h. Když toto zapíšeme do definice třídy Car, automaticky to bude platit i na náš autojeřáb a dodávku, aniž bychom na ně jakkoliv sáhli, protože jsou to také auta – vychází ze třídy Car. Pokud takové omezení uděláme a později si řekneme „No jo, ale ten jeřáb, ten by na rozdíl od všech ostatních aut měl jet maximálně třicítkou“, uděláme to snadno. Zapíšeme to přímo do jeho třídy. Bude to fungovat proto, že cokoliv uvedeného přímo v té které konkrétní třídě má vždy vyšší prioritu, než cokoliv, co přichází „zdola“ (či „shora“ – podle toho, jak na to nahlížíte), tedy ze třídy, kterou rozšiřuje.

Aby to bylo ještě jasnější, použijeme příklad přímo z UDK.

Při troše hledání bychom mezi skripty našli Light.uc – třídu Light. Ta definuje světlo ve scéně. Definuje ho však abstraktně, z této třídy nebo, chcete-li „formy“, nemůžete udělat přímo objekt v editoru, protože nenese žádné informace třeba o tom, jestli světlo svítí do všech stran nebo je směrové atp.

Do scény však můžete umístit PointLight, tedy všesměrové světlo. To rozšiřuje základní třídu Light a už v sobě nese dodatečné informace, které výchozí třída Light nemá. Takže máme světlo v editoru a ze skriptu bychom s ním třeba chtěli zahýbat. Jenže engine nás taktně upozorní, že tenhle objekt je statický a že to nelze. Zapátráme tedy proč (a tohle je ono pátrání ve skriptu, které budete dělat často). Protože orientovat se v jednotlivých elementech skriptu se teprve naučíme, pomůžu vám. Kdybyste otevřeli třídu Light, nalezli byste tam řádky

bMovable=FALSE a bStatic=TRUE

Ty říkají „Engine, s tímhle objektem se nedá hýbat. Kdyby to někdo zkusil, tak mu taktně řekni, že to prostě nejde. Dík. Pán z Epicu“. A protože náš objekt typu PointLight rozšiřuje třídu Light, a tedy z ní dědí všechna tato nastavení, nedá se hýbat ani s ním.

Kdybychom se do tříd podívali pořádně, najdeme jednu, která nám tohle pomůže vyřešit. Jmenuje se „překvapivě“ PointLightMovable a rozšiřuje naší třídu PointLight (z těch názvů jste asi už vypozorovali, že existuje určité pravidlo při pojmenovávání odvozených tříd).

Obsahem je skoro identická, ale obsahuje tyto dva změněné řádky

bMovable=TRUE a bStatic=FALSE

A tady vidíte, že dědění funguje přes libovolný počet stupňů. PointLight zdědila z třídy Light základní popis světla a přidala vlastní informace. PointLightMovable zdědila vše z PointLight a protože ta dědí z Light, tak tedy i z ní. A navíc nic nepřidala, ale upravila – povolila něco, co bylo zakázané.

Tímhle způsobem v příštím díle v části věnované skriptování upravíme některou z dostupných tříd. Rozšíříme jí třídou vlastní a v té něco změníme a něco přidáme.

No, jak se máte, po tomhle všem? Pokud jste ještě neprokleli mě i s celým UDK, tak mám radost a za odměnu mám pro vás hned dvě dobré zprávy. Předně slibuju, že tolik teorie najednou už v UDK neuvidíte. A za druhé – jestli jste pochopili tohle, tak máte vyhráno. Samozřejmě, že máte určitě spoustu otázek a celá řada věcí vám vrtá hlavou – bylo by divné, kdyby tomu tak nebylo. Ale to se všechno postupně poddá, když od příštího dílu začneme na tomhle obecném základu stavět konkrétní věci.

Takže nezapomeňte – příště začíná tvorba našeho slavného RPGčka...

Předchozí
Další
Reklama
Reklama

Komentáře

Nejsi přihlášený(á)

Pro psaní a hodnocení komentářů se prosím přihlas ke svému účtu nebo si jej vytvoř.

Rychlé přihlášení přes:

Google Seznam
Reklama
Reklama