2# Proměnné

V tomto díle budeme stále pracovat pouze s konzolí a UI se dostaneme až v další lekci. Na začátek si vytvoříme projekt Number Wizard, kdy cílem programu bude uhádnout jaké číslo si hráč myslí. Hráš mu dá číslo od 1-1000 a program postupně bude tipovat, hráč mu bude odpovídat větší/menší a do deseti pokusů by měl program číslo uhádnout. Samozřejmě začnemě vytvořením prázdného 2D projektu.

S ohledem na to, že naše hra nebude mít UI, bude hráč používat klávesy a výpis bude do konzole. Začneme stejně jako minule, pravé tlačítko do Assets, Create a C# Script.

Po vytvoření scriptu ho ihned pojmenujte jinak bude muset měnit jméno scriptu i uvnitř scriptu a je to zbytečná práce navíc. Scipt si otevřeme dvojklikem ve Visual Studiu a začneme psát kód. V první lekci jsme používali příkaz “print” pro výpis do konzole, úplně stejně funguje i Debug.Log, ale používá se časteji.  První řádek kódu bude vypadat takto:

Syntax je prakticky stejný jako u print a tak zatím pro vás nic nového. Můžete přidat klidně víc řádků hlášek, které hráči vysvětlí hru a jaké klávesy může používat. Samozřejmě na textu vůbec nezáleží a můžete si napsat co chcete, každopádně by jste určitě nějakým způsobem měli hráči vysvětlit jak hru hrát.

Po uložení se vrátíme do Unity a budeme pokračovat dál. První věc co můžeme udělat je upravit jméno naší scény, kdy “SampleScene” do budoucna rozhodně nebude dobré pojmenování, hlavně pokud budeme mít ve hře víc scén. Proto na ní klikneme pravým tlačítkem, vybereme “save scene as” a proklikneme se do složky “Scenes”, kde ji uložíme například pod názvem “NumberWizard”. Mělo by se nám změnit jméno v Hierarchy.

Nyní můžeme náš C# Script přátáhnout na Main Cameru a uvidíme jestli vše funguje jak má. Opět by se nám script měl objevit v Inspector po kliknutí na kameru. A po spuštění by se nám měly naše hlášky vypsat do kozole.

Nyní když máme základ vytvořený, můžeme se pustit do práce s proměnými. Proměnou si můžete představit jako krabici, krabice má jméno a každá krabice obsahuje nějaká data. Ještě ale existuje nějaký typ proměnné, ten určuje co můžeme do proměnné zapsat. To je celkem rozdíl od JS, ve kterém je jedno co do proměnné napíšeme a její typ se přizpůsobí obsahu. Pro náš příklad bude stačit proměnná Integer, která v C# dovoluje zapsat čísla od -32,768 do 32,767. S ohledem na to, že budeme pracovat s číslem od 1-1000 tak by INT měl stači. Umí ale pouze celá čísla. Pokud potřebujete desetinou čárku, je tu proměnná float. Pokud chcete uložit jen TRUE/FALS stačí nám proměnná bool a pokud chcete uložit například jméno použijeme proměnnou string. K tomu se ale dostaneme až v dalších lekcích, dnes nám stačí proměnná INT. Přepneme se do Visual Studia a začneme vytvářet naše proměnné. Ty musí být založeny dřív než je používáme a tak se většinou zakládají na začátku funkce, v našem případě hned za “void Start () {“. Založíme si proměnou max, min a tip, kdy všechny budou mít typ INT.

Jak vidíte, jména proměných mám podtržené zelenou čarou. Jediné co to znamená je, že tyto proměnné nikde ve svém kódu nepoužívám, není to chyba. Když máme proměné založené, můžeme do nich uložit nějaké číslo, případně můžeme do nich uložit číslo při jejich zakládání, stačí za jejich jméno přidat = *číslo, které chcete uložit*.

Tip zatím necháme prázdný a spíš se koukneme na výpis obsahu proměnné hráči. Do debug.log můžeme spojovat řetězce (řady znaků) pomocí +. Pokud se jedná o text, který píšeme my, musí být v uvozovkách, pokud se jedná o výpis proměné, stačí napsat jméno proměnné bez uvozovek. S ohledem na to, že čísla 1 a 1000 už máme napsané v proměných, můžeme je nechat vypsat do našeho debug.log. Možná si říkáte proč? V této hře to nebude tolik užitečné, ale do budoucna je dobré si nechávat většinu čísel v dobře pojmenovaných proměnných, aby jste je mohli snadno upravit, aniž by jste museli hledat všechny výskyty tohoto čísla. Takže náš upravený výpis bude vypadat takto:

Vypadá to komplikovaně, ale když jdete postupně, napřed vypíšeme náš kus textu, pak vypíšeme proměnou MIN, pak vypíšeme pomlčku a nakonec proměnou MAX. Doporučuji uložit a vyzkoušet, výpis by měl být k nerozeznání od našeho předchozího. Nyní musíme udělat input. Již v základu máme vytvořenou funkci “Update”, pomocí té budeme každý snímek sledovat stisknutí klávesy. Jako pomoc určitě budete potřebovat Input.GetKeyDown a takzvané KeyCodes. Ty používáme jako zástupná hesla pro jednotlivé klávesy. U písmen je to jednoduché, A-Z stačí napsat písmeno. U dalších kláves to může být malinko složitější. My budeme potřebovat UpArrow, DownArrow a RightArrow. Předpokládám, že názvy napoví o jaké klávesy se jedná. V odkaze výše najdete i ukázku jak kód použít v update scriptu. Můžeme to klidně zkopírovat a upravit na:

 

Doporučuji vyzkoušet v Unity, kde by výsledek měl vypadat nějak takto:

Pro účely naší hry můžeme ale narazit na drobný problém. Pokaždé když píšete nějaký kód, počítejte s tím, že uživatelé mají velmi nízkou až žádnou inteligenci a očekávejte nečekané. Proto se nám může stát, že uživatel zmáčkne všechny klávesy najednou. Pro nás stačí pochopit základní princip IF a ELSE IF a ELSE. Jedná se o podmínky, kdy jsme jednu z nich již párkrát použili. If používáme v případě, kdy chceme aby se něco stalo v případě, že se něco stalo. V našem případě chceme, aby se nám do konzole vypsala hláška, když uživatel zmáčkne klávesu. Základní syntax je if (*za jakých podmínek se má něco stát*) { *co se má stát* }. ELSE řadíme za IF a to je to co se stane pokud nejsou splněny podmínky IF. Kombinace je ELSE IF, zde předpokládáme, že není splněna podmínka předchozího IF ale zároveň chceme, aby byla splněna jiná podmínka. V našem případě může implementace vypadat takto:

Výpis by měl být úplně stejný jako předchozí, jen stisk dvou kláves najednou by neměl spustit dvě části scritpu, ale pouze tu první. Nyní ale nastává další “problém”, který musíme vyřešit. V naší funkci Update budeme potřebovat proměnné deklarované v funkci Start. Ty jsou však dostupné pouze pro funkci, ve které jsou vytvořeny a tak jsou mimo dosah funkce Update. Naštěstí proměnné můžeme deklarovat i mimo funkce a to uvnitř třídy (class). Tím budou dostupné pro všechny funkce uvnitř třídy.

Když mám proměnné dostupné v obou funkcích. Opět, pokud vše uložíte, tak výpis by měl vypadat úplně stejně jako předtím. Hlavně kontrolujte 1-1000. 

Nyní se pokusím trochu objasnit jak bude celé hádání fungovat. Vždy budeme tipovat číslo uprostřed našeho rozsahu, takže pokud máme čísla od 1-1000, náš první tip bude 500, hráč nám řekne že číslo je větší a tak hádáme číslo od 500-1000, kdy  náš tip bude 750. Hráč nám řekne, že číslo je menší a tak hledáme v rozsahu 500-750. Nejednodušší způsob jak toho docílit je udělat si výpočet prostředního číslo a pak postupně upravovat maximální a minimální hodnotu. Vzorec pro výpočet prostředního čísla je (max + min) /2 a pokud chcete upravovat obsah proměnné stačí napsat *jméno proměnné* = *nová hodnota*. Toto je opět velmi podobné/stejné ve všech programovacích jazycích. První co musíme udělat je nastavit náš tip na hodnotu 500 hned při jeho deklaraci na řádku 9. Při stisknutí šipky nahoru a dolů musí být odpověď programu rovnou otázka na nové číslo a tak musíme spočítat nový tip a vypsat ho uživateli. U šipky vpravo můžeme nechat aktuální hlášku.

Výborně. Nyní musíme přidat matematickou část, o které jsme psal před chvílí. Po té co nám uživatel odpoví jestli je číslo větší/menší musíme upravit min nebo max a provést výpočet nového tipu pomocí vzorce.

Ještě by stálo za to doplnit do start otázku jestli je vaše číslo “tip”. Debug.Log(“Je ” + tip + ” vaše číslo?”);

Aktuálně by jsme mohli říct, že program je hotový, ale pro novou hru musíme program vypnout a zapnout, což není úplně dokonalý způsob jak to dělat. Do naší třídy si můžeme dopisovat další funkce, ty pak můžeme volat v průběhu hry například proto, aby jsme nemuseli do nekonečna opakovat několik řádků funkce. Například u nás by jsme mohli upravit řádky kde opakujeme tip = (min + max) / 2 a Debug pod ním. Takže si můžeme vytvořit novou funkce TipUpdate(). Ta bude dělat to samé jako naše dva řádky a místo nich budeme pouze volat funkci TipUpdate.

Podobným způsobem můžeme udělat funkci pro zapnutí hry, kterou můžeme pak volat na kolika místech chceme. Využijeme pro to celý obsah naší funkce Start() a vytvoříme z ní funkci StartGame() a původní funkce Start() bude jen volat StartGame().

Nyní musíme udělat poslední část. Zatím jsme StartGame() umístili jen na začátek hry. Ještě musíme StartGame() umístit na konec hry, aby začala nová hra. K tomu musíme ještě “restartovat” naše proměnné. To všechno umístíme do části kde hráč zmákl šipku vpravo.

Nyní máme funkční “hru”. Samozřejmě tato hra nejde publikovat. Nemá žádné uživatelské prostředí a podstatou hry je pouze výpis do konzole. V další díle uděláme již něco publikovatelného.

 

2 Comments

  1. Dobrý den.
    Právě jsem dokončil tutorial unity #2 jenom ten restart jsem udělal jinak a v mojí “verzi” to potom jen napíše aby jste si myslel číslo a restartuje ty “krabice” (samozřejmě že to napíše i “je + tip + vaše číslo?”) Jinak moc děkuji za tento tutoriál který mě nakopl učit se dál.

  2. Ahoj Matěji, podle toho co píšeš jsi zapomněl na dvoje uvozovky. Pokud je text v uvozovkách bude vypsán jako text ne jako proměnná. To znamená, že musíš do uvozovek obalit jen text co chceš zachovat bez změny. Funkční verze je

    “je ” + tip + ” vaše číslo”

    Zde se tip vypíše jako proměnná.

    SenpaiCZ

Submit a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Share This