sobota 28. května 2016

Planet Finder: 1

Je to vždy fantastický pocit, když se chystáte vlítnout do nového projektu. Ještě fantastičtější, mnohem fantastičtější, je, když jde o projekt, kterému hodně věříte, a o kterém víte, že vás bude opravdu bavit. Takový je můj nový Unity herní projekt, kterému jsem zatím dal název Planet Finder. Bude těžit ze zkušeností, které jsem získal na třech tutorial projektech pro Casual Core. A že jsem se toho naučil docela slušně a myslím, že PF nevyužije zdaleko všechno. Spíše se obávám toho, že největší zátěž nebude v MonoDevelop, protože na kódování hra myslím nebude vůbec obtížná, zátěž tak bude hlavně v grafickém editoru - a kdoví, možná zaměstnám i tablet, jelikož má elektronická propiska už na svém hrotu zachytává až podezřele nezdravě velké chuchvalce pavučiny.

Na právě probíhající tutorial na blogu tak částečně hážu symbolickou pauzu z důvodu nízkého zájmu - tolik času zase tak nemám - ale na zbytek návodu se rozhodně vykašlat nechci. Bude - jen nevím kdy. Těší mě, že se budu moci soustředit na něco mnohem zábavnějšího, než opisování kódu na blog. Planet Finder bude částečně mým vysněným projektem, a to je možná trochu nadnesené, trefí se ale každopádně žánrem, který ke mně vždy promlouval: chodička. Ta nebude, doufám, jen tak ledajaká. O mix žánrů ale nepůjde. Chtěl bych vytvořit víceméně čistou žánrovku - chtěl bych ji ale posunout někam dál, což zase zní až moc ambiciózně, než by se tomu dalo věřit. Ale uvidíme. Co z toho vyleze.

A hlavní bude, že se u tvorby musím bavit - jako tomu bylo podobně u mého dřívějšího většího projektu: Shape Strike (který mimochodem je v docela pokročilé fázi na mém disku od Western Digital - můj velký projekt předtím, na harddisku od Samsungu, bohužel shořel). Pokud shledám něco, cokoli, kus grafiky, co bude nezáživné, vyhodím to a nahradím něčím, u čeho jen při pohledu na to dám palec nahoru.

Bude to, pokud se to bude dařit, moje taková náhrada za hopsačku Kirks, na které jsem pracoval ještě v době, kdy jsem kódu v Unity zase tak nerozuměl. Dokážu si představit, že by PF mohl vyjít na tablet, i na Google Play nebo co zrovna bude nejlepší destinace, ale to je myslím teď naprosto nepodstatné - navíc, teď když vím, jak parádní je spojení gamepadu X360 a PC, myslím, že budu maximálně spokojený, když to pojede jen na PC v této parádní spolupráci s gamepadem. Bude úžasné PF hrát. A kdo ví, možná se o něm bude psát i v Levelu. Ale jen pokud se hry prodá velké množství kopií, jinak o něm nenapíšou ani řádku. A pokud ještě bude vůbec vycházet.

Žánr hry byste mohli odhadnout už z názvu. Příběh zatím žádný napsaný není. Postupuju přesně podle návodu, jak profesionálně designovat hru. Nejdřív si vyberete žánr. Vytvoříte grafiku, spoustu grafiky, více než budete potřebovat. Až potom, vlastně až úplně nakonec vymýšlíte příběh a tvoříte level design. Údajně proto, abyste u toho samého projektu vůbec vydrželi - nejméně stabilní je totiž scénář (zřejmě výjimka existuje u adventurního žánru), který se mění tak rychle, jak přicházíte s novými nápady. Konkrétní nápady ale pro PF existují, a právě kvůli nim jsem se do projektu odvážil pustit.

Jednička v podnázvu slibuje, že by na příště mohla být v podnázvu dvojka. U ní se ale neskončí. Vlastně bych byl nejradši, kdyby těchto čísel v podnázvu Planet Finder bylo co nejvíce. Snad bude o čem psát. Pokud ne, alespoň napíšu konečně svůj názor na Battlefront Star Wars, který hraji, už to bude půl roku od Vánoc!, ještě teď. Vyhlížím ale i Uncharted 4, prý už poslední dobrodružství, kromě toho filmového. Pokaždé mě svědí prst, kterým chci poklikat na myš, zrovna když se kurzor objeví nad Exe souborem XCOM 2, simulátorem xenofobní společnosti snažící se vypudit všechno nepochopitelné, co nemá dvě nohy, dvě ruce a obličej, který je podobný členů XCOM. Zřejmě již nikdy nenapíši článek mimo CC, ale neříkejme nikdy nikdy, pro jistotu.

A když už jsem nakousnul, jak mi krásně vyhovuje hrát s gamepadem na PC, musím se tu zmínit o skvělé věci: hrát retro hry s gamepadem je ještě úžasnější, než jsem si v minulosti představoval. Dnes jsem si pořádně zahrál Batmana a kdo by to byl řekl - dal jsem celou první disketu ze dvou. Věřím tomu, že moje dosové já by na mé winsedmičkové já bylo pyšné. Tak dobře jsem si zahrál, možná to mělo menší podíl na mém rozhodnutí vlítnout do projektu s tajemným názvem Planet Finder.

A teď... do grafického editoru.

zeal

pátek 27. května 2016

Teach Vision: První hra v Unity část II.

SOUBORY KE STAŽENÍ

Stáhněte si soubory s grafikou a kartičku: ZDE. Obsah rozbalte a soubory nahrajte do Unity tak, že v menu Assets zmáčknete na položku Import New Asset... Všechny naráz nepůjdou, tak se nelekněte a importujte je jeden po druhém. Při importu se v Inspektoru vždy objeví údaje, které ovlivňují chování našeho assetu. U grafiky vyberte: Texture type: Texture, Wrap mode: Repeat, Filter mode: Point, Format: Crunched.

NÁŠ DESIGN DOKUMENT

Jako první hru budeme tvořit Pexeso, které je myslím velmi jednoduché na začátek.

1. Sestrojíme kartičky s osmi odlišnými obrázky, a to znamená, že na obrazovce bude celkově šestnáct karet (viz pravidla hry Pexeso), otočených obrázkem dolů.

2. Ovládání bude skrze myš, levým tlačidlem se vyberou/otočí karty, jedna po druhé. Pokud se neshodují, otočí se zpět, v opačném případě zmizí a hráči přibude skóre.

3. Budeme mít dva herní módy: proti CPU a lokální multiplayer.

UPOZORNĚNÍ

Kratičké upozornění: Jde o můj vůbec první návod, který navíc dělám sám ve volném čase a tím pádem nemůžu zaručit jeho bezchybnost, a vlastně jej nemůžu ani (pořádně) otestovat. Byl bych tedy rád, pokud najdete nějakou chybu, abyste mi napsali do komentářů, a já ji následně opravím.

PRVNÍ KROKY

Potřebujeme si vytvořit prázdný objekt, který bude sloužit jako nositel našeho skriptu / herního manažeru: Menu > GameObject > Create Empty

V okně Hierarchy na něj dvakrát poklepeme (či jej označíme a stiskneme klávesu F2) a pojmenujeme ho jako GameManager.

Vytvořte první skript: Menu > Assets > Create > Javascript
Pojmenujte ho GameM, myší ho přetáhněte (z okna Project do okna Hierarchy) na náš herní manažer GameManager. V okně Project klikněte na náš nově vytvořený skript. Otevře se skriptovací prostředí Mono Develop.

NÁŠ PRVNÍ SKRIPT

Karty můžeme vytvořit v Unity editoru tak, že do Hierarchy vložíme pexesoKartaLow.FBX, vytvoříme nový materiál, ten dáme na objekt v okně Project a v materiálu pak vybereme texturu. Proč to ale dělat tak složitě - jednoduše, když si karty můžeme vyrobit kódem?!

Vše vymažte. Na první řádku našeho skriptu napište následující (Unity díky této knihovně bude moci vytvořit dynamické seznamy):

import System.Collections.Generic;

Vytvoříme si první proměnné:

1. Seznam karet: pole, které bude obsahovat obrázky. Díky tomuto seznamu pak později snadno přidáme nové karty. Nestačí vám osm základních kartiček? Stačí nakreslit novou a tu poté přidáte do tohoto seznamu, a již více není třeba, kód vše obstará za vás.

var kartySeznam : Texture[];

2. Materiál karet: Karty sice budou mít každá jiný obrázek, materiál bude ale zapotřebí jen jeden. Pro všechny stejný.

var kartaMaterial : Material;

3. Model karet: Odkaz na 3D model, na nějž později přidáme materiál.

var kartaMesh : Mesh;

4. Pořadí karet: Číselné odkazy na naše karty. Co číslo, to karta. Později ve funkci CreateSeznam() tato čísla zduplikujeme, aby ve hře bylo každé číslo dvakrát.

var kartaPoradi : List.<int>;
5. Vytvoříme funkci CreateSeznam(): s pomocí této funkce vytvoříme seznam, který bude obsahovat šestnáct identifikačních čísel, resp. dvakrát osm (unikátních karet je osm).
function CreateSeznam()
{
    for(var j : int =0;j<pocet/2;j++)
{
kartaPoradi.Add(j+1);
kartaPoradi.Add(j+1);
}
}

V této funkci potřebujeme naplnit pole kartaPoradi čísly 1 až 8, přičemž je potřeba mít každé číslo dvakrát. Napíšeme tedy příkaz k přidání čísla dvakrát po sobě a tento příkaz přidáme do smyčky "for", která se zopakuje tolikrát, kolik jí řekneme: "j < pocet/2".

K našim proměnným nahoře je tak potřeba ještě přidat proměnnou int pocet - počet karet na začátku hry:
var pocet : int = 16;
U funkce CreateSeznam() potřebujeme, aby se spustila na začátku našeho programu, odkaz na ni zapíšeme tedy do funkce Start().
function Start()
{
    CreateSeznam();
}

K zamíchání karet potřebujeme vytvořit další funkci, která bude vypadat následovně:

function ShuffleKarty()
{
for (var i : int = 0; i < pocet; i++)
{
     var tempKarta : int = kartaPoradi[i];
        var randomIndex : int = Random.Range(i, pocet);
        kartaPoradi[i] = kartaPoradi[randomIndex];
        kartaPoradi[randomIndex] = tempKarta;
    }
}
Odkaz na funkci opět přidáme do Startu, za CreateSeznam(). V této chvíli nám program naplní seznam kartaPoradi čísly od 1 až 8, vždy dvakrát. Funkce ShuffleKarty() tato čísla v seznamu kartaPoradi náhodně zamíchá, aby každá nová hra byla unikátní. Ve smyčce for máme dvě proměnné v privátním módu - z důvodu, že je jinde v kódu použít nepotřebujeme.

V další části již sestrojíme naše karty pomocí kódu a balíček pak umístíme na stůl obrázkem dolů. Možná stihneme i vytvořit skript, pomocí kterého se kartička po kliknutí obrátí obrázkem nahoru.

zeal

úterý 24. května 2016

Teach Vision: První hra v Unity část I.

Následující text je návod pro úplného začátečníka, který se v Unity stihl pouze lehce zorientovat - čili něco málo tuší, ale neví ještě jak na TO. Z několika důvodů, také proto, že jde o můj úplně první návod, jsem se rozhodl jej vydat na části. Další část naváže poměrně rychle, takže se nebojte dlouhé pomlky, nic takového. Kódovat budeme v jazyku Unityscript, podobající se javascriptu, který je myslím velmi šetrný pro kodéra-začátečníka. První část pojme kratičkou teorii. V další se již pustíme do našeho kódu, se kterým si "postavíme" hru Pexeso. Již příště se budete muset pekelně se soustředit, dnes jen prolítneme pár základních pouček.

CO MÍT NA PAMĚTI PŘI PSANÍ KÓDU V UNITY

V Unity máme dvě základní funkce: Start() a Update(). Ve funkci Start() se spustí kód jen jednou (v rámci jediného časového políčka), a to na začátku. Zato kód ve funkci Update() spouští program neustále, tj. podle vašeho aktuálního FPS - např. šedesátkrát za sekundu v případě, že vaše hra běží v 60 FPS.

Funkcí je v Unity samozřejmě více. Pak je tu možnost mít svoje vlastní funkce, které si vytvoříme (a libovolně pojmenujeme). Kód v těchto našich funkcích můžeme volat (říci programu, aby ho spustil) ze základních funkcí, takže pokud chceme, aby začalo ve hře pršet hned na začátku, můžeme napsat:

function Start()
{   
prsi = true;
}

ANEBO

function Start()
{   
   ZacniPrset();
}

function ZacniPrset()
{   
   prsi = true;
}

Průběh čtení kódu probíhá seshora dolů, což si můžeme vysvětlit na příkladu:
function Start()
{
    var prsi : boolean;
    prsi = true;
    prsi = false;
}
Po spuštění kódu neprší, a to proto, že jsme proměnnou prsi přepsali ve třetím řádku na false.

Pokud spustíme vlastní funkci z funkce Update(), je třeba říct programu, aby ji spustil jen jednou (!) a pak už nikoli. Pokud by ji spouštěl neustále, bylo by to zaprvé k ničemu (proč programu neustále říkat, aby pršelo, když už prší?), zadruhé by program možná neběžel tak rychle, protože CPU by se muselo neustále zabývat spouštěním této funkce dokola. Aby se kód spustil z Update() jen jednou, toho docílíme vcelku jednoduše: dosazením podmínky if pro spuštění kódu:
var prsi : boolean = true; // inicializace proměnné a definice její hodnoty
          var destnikRozdelan : boolean; // logická proměnná je bez definice vždy false
function Update()
{
    if(prsi == true) // podmínka
    {
         RozdelatDestnik(); // jen pokud je splněna podmínka, tento kód se přečte.
    }
}
function RozdelatDestnik() // vlastní funkce
{
    prsi = false; //podmínka se neguje, aby nedošlo k dalšímu spuštění této funkce ve                                 // funkci Update()
    destnikRozdelan = true;
}
Pokud budeme chtít funkci RozdelatDestnik() kdykoli znovu přehrát, stačí přepnout proměnnou prsi na true.

V Unity se setkáte s jedním a dvěma rovná se. Rozdíl mezi nimi je takovýto:

Jedno "rovná se" použijeme jen v těch případech, kdy chceme přiřknout proměnné hodnotu.

Některé druhy proměnných a jejich hodnota:

Celé číslo: int = 2;
Desetinné číslo: float = 1.2;
Logický datový typ: boolean = true;
Textový řetězec: String = "Text";

Dvě "rovná se" použijeme jen v podmínce:
if(prsi == true) 
{ 
    SpustTutoFunkci(); 
}

Proměnné většinou zapisujeme (resp. inicializujeme) na první řádky skriptu, před funkci Start(). Inicializovat proměnnou lze v kódu jen jednou.

Každý příkaz je nutné zakončit středníkem.

Název proměnné píšeme vždy pouze s malým počátečním písmenem, u funkcí je to vždy naopak, čili s velkým písmenem.

Přehlednost je nadevše. Doporučuji nepsat do funkce Update() přímo kód, ale raději odkaz na vámi vytvořenou funkci. Díky tomu se později kód mnohem lépe upravuje:

          var zapniSvetlo : boolean;
function Update()
{
    ZapnoutSvetlo();
}
function ZapnoutSvetlo()
{
    zapniSvetlo = true;
}
zeal

pátek 20. května 2016

MVGA!

Můj první návod na tvorbu kompletní hry bude brzy na světě - momentálně je v rozpracovaném stavu o délce několika, abych ale nekecal, tak neřeknu přesně kolik stran. Jsem na něj pyšný, ale zjistil jsem jednu podstatnou, pro mě možná nečekanou, věc: dá to pořádně zabrat, takový "tutorial". Ani se nedivím, proč si za takové návody nechávají odborníci platit zlatými denáry. Je to ohromná fuška, a co teprve pro někoho, kdo je od přírody trošku línější povahy. Vidím to tak, že až ho dopíšu, dám ho i na nějaký zahraniční web, kde bude přeložený nejlépe do angličtiny a možná se ho budu snažit propašovat na Unity Asset Store, kam bych ho umístil, samozřejmě, zdarma. To by byla odměna pro mě největší, pokud by se to povedlo.

Lenost mě zatím zastavila od napsání článku na KK o mém nálezu na půdě pod hromadou... ani nebudu psát čeho. Tento nález je herní konzole druhé generace, výroba cca druhá půle sedmdesátých let, název Magnavox Odyssey², jestli vám to něco řekne. Hrával jsem na tom pár výborných her, asi ještě před pořízením PC. Grafika na této konzoli byla děsná, ale zábava byla něco extra. Hry byly jen o čisté hratelnosti - dva joysticky můžou napovědět, že jsem se u toho nebavil jen já. Více tedy asi v článku, který doufám napíši - slíbil jsem to na Twitteru, takže nejspíš ano. Budou i fotografie a možná i nějaká kratičká recenze té či oné hry, pokud se na této mašince ještě rozjedou.

Až se mi podaří publikovat návod na CC Pexeso, pouvažuji, jestli bych se nevrhnul do alespoň ještě jednoho návodu, tentokrát pro pokročilejší uživatele Unity, ale nejspíš to bude tak, že po vydání článku si dám se psaním tohoto druhu literatury na chvíli pohov. Abych pokračoval v blogu s heslem "Make videogames great again!", rád bych, aby mi to tu sloužilo jako takový vývojářský deník, kde bych psal nějaké ty poznámky a postřehy z právě vyvíjené hry.

zeal

pátek 13. května 2016

Unity tutorial: Již za rohem


Hra, kterou se naučíte v našem prvním Unity návodu, je ke stažení zde: https://zealcore.itch.io/casualcore-pexeso

Pexeso je ideální pro začínajícího tvůrce her. Předtím jsem měl téměř hotový tutoriál na bludištní hru s tanky, ale pak jsem usoudil, že nejdříve by se měl zájemce o Unity naučit opravdové základy a ty v této hře jsou použity tak, aniž by byly obklopeny jiným záludným kódem.

Co se naučíte krom zkompletování celé hry:

Jak vytvořit balíček karet
Jak ho zamíchat
Jak pomocí kódu sestrojit kartu
Jak zamíchané karty zobrazit na "stole"
Jak kartičku otočit pomocí interakce
Jak přidat skóre
Dva herní módy: versus CPU a lokální multiplayer
Jak ozvučit hru
Jak vytvořit více propojených scén, včetně funkčního menu
Jak správně psát kód v Unity



Část návodu je již napsána, možná příští týden by se to tu mohlo objevit. V případě zájmu bych mohl v návodech pokračovat. V opačném případě bych se soustředil na nějaký nový, pro mě zajímavý, Unity projekt.

zeal