NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 13 - 3D střílečka v Unity - Přebíjení - Náboje a skript Move

V předchozím kvízu, Kvíz - Úprava terénu, střelba a animace přebíjení v Unity3D, jsme si ověřili nabyté zkušenosti z předchozích lekcí.

V dnešním Unity3D tutoriálu začneme pracovat na přebíjení a zobrazení zbývajících nábojů. Nastavíme data pro ukazatel nábojů a upravíme skript Move.

Podobným způsobem, jako jsme dělali mířidla, si uděláme i zobrazení nábojů. Až na to, že tentokrát přidáme na naše plátno text s aktuálním počtem nábojů ve zbrani.

Ukazatel nábojů

Klikneme na záložku Scene a podíváme se do záložky Hierarchy. Zde máme náš Canvas, který obsahuje crosshair. Klikneme pravým tlačítkem myši na možnost Canvas, zvolíme možnost UI a klikneme na Image:

Tvorba 3D her v Unity

Na obrazovce se nám v záložce Game nebo Scene objeví čtverec.

Přejmenování obrázku pro náboje

Nejdříve upřesníme název našeho obrázku z obecného Image na detailní název ammoImage, abychom věděli o jaký obrázek jde dle screenshotu níže.

Potom klikneme na kruh s tečkou uprostřed s popiskem Source Image, který je součástí komponenty Image. Otevře se nám okénko, kde do vyhledávacího pole napíšeme název požadovaného obrázku, v našem případě se jedná o obrázek assault_rifle_01_icon. Poté na vyhledaný obrázek dvakrát klikneme:

Tvorba 3D her v Unity

Pozice obrázku pro náboje

V komponentě Rect Transform si nyní napíšeme takové hodnoty, aby se obrázek zbraně nacházel v levém dolním rohu. Hodnoty mohou být:

  • -280 pro Pos X,
  • -191 pro Pos Y,
  • 0 pro Pos Z.

Nyní klikneme na čtverec v záložce Inspector s nápisem center a postranním middle. Po kliknutí se nám zobrazí okno s těmito sítěmi:

Tvorba 3D her v Unity

Tyto sítě mají vždy jednu tečku, jeden bod, který znázorňuje, kam se bude náš UI prvek zarovnávat. Celé okno se sítěmi je rozděleno na sloupce a řádky. My si náš UI prvek zarovnáme například do levého dolního rohu tak, že levým kliknutím na síť zvolíme sloupec left a řádek bottom.

Všimněme si, že se nám změnily souřadnice Pos X, Pos Y, a Pos Z, ale obrázek zůstal na místě. To je způsobeno zarovnáním do levého dolního rohu. Tyto souřadnice se tedy nyní vztahují k levému dolnímu rohu.

Počet zbývajících nábojů

Nyní si vytvoříme samotný text s informací o počtu zbývajících nábojů. V okně Hierarchy klikneme pravým tlačítkem na objekt Canvas a vybereme možnost UI a poté Text.

V novější verzi Unity Editoru se možnost Text nachází pod záložkou Legacy. Dále se na objektu Canvas nacházejí možnosti TextMeshPro a TextMeshPro. Tyto možnosti jsou pro naše účely až moc detailně zaměřené na úpravu textu, tedy je nevyužijeme.

Klikneme na náš nově vytvořený Text a přejmenujeme si ho například ammo. Klikneme na obdélník s názvem Tag nacházející se hned pod názvem objektu ammo. Rozroluje se seznam všech tagů na scéně. My zvolíme možnost Add Tag. Objeví se tlačítko +, klikneme na něho a napíšeme ammo:

Tvorba 3D her v Unity

Text umístíme vlevo od našeho obrázku zbraně. Moje souřadnice byly: -318, -194, 0 (Ještě je nastavené zarovnání na střed). Již jsme si mohli všimnout, že objekt ammo má komponentu s názvem Text a tato komponenta má vlastnost Text:

Tvorba 3D her v Unity

Do této vlastnosti budeme vkládat náš text s počtem nábojů. Do příslušné kolonky napíšeme 30/30. Velikost fontu Font Size si nastavíme jak se nám líbí, například 27.

Při velikosti fontu 28 a vyšší se nám text už nezobrazí! Font je pak totiž větší než samotné okénko, do kterého text vykreslujeme. Řešením by bylo zvětšit hodnoty Width a Height, které se nachází přímo pod souřadnicemi objektu v komponentě Rect Transform.

Nyní si ještě nastavíme zarovnání. Klikneme levým tlačítkem na čtverec nacházející se v komponentě Rect Transform. Tento čtverec má v sobě obrázek sítě. Po rozkliknutí zvolíme sloupec left a řádek bottom.

Nastavení škálování obrázků a textů

V záložce Hierarchy klikneme na náš Canvas, aby se nám v záložce Inspector zobrazila komponenta Canvas Scaler. V této komponentě klikneme na UI Scale Mode a zvolíme možnost Scale With Screen Size. Pro volbu Match vložíme hodnotu 0, čímž zajistíme, že se bude náš Canvas zvětšovat jen podle velikosti šířky displeje:

Tvorba 3D her v Unity

Úprava skriptu Move

Teď přejdeme k druhé části práce této lekce, kterou je editace skriptu Move pro pohyb.

Proměnná

Do skriptu Move, pod ostatní proměnné, přidáme jen jednu proměnnou movementSpeed typu float:

public class Move : MonoBehaviour
{
    Rigidbody rb;
    Animator objectWithAnim;
    bool running;
    public float movementSpeed = 50f; // Tento řádek jsme přidali
    ...
}

Použili jsme modifikátor přístupu public abychom mohli proměnnou upravovat v editoru.

Metoda Update()

V metodě upravíme všechna volání metody AddRelativeForce(), v které nahradíme stávající hodnotu rychlosti výrazem movementSpeed * Time.deltaTime. Pak ještě upravíme jednu podmínku.

Úprava volání metody AddRelativeForce()

V těle první podmínky upravíme volání metody AddRelativeForce() takto:

void Update()
{
    if (Input.GetKey(KeyCode.W) &&
        Input.GetKey(KeyCode.LeftShift) &&
        !objectWithAnim.GetBool("Aim") &&
        !objectWithAnim.GetCurrentAnimatorStateInfo(0).IsName("Inspect"))
        {
            rb.AddRelativeForce(new Vector3(0, 0, 70)); // Tento řádek jsme upravili
            objectWithAnim.SetBool("Run", true);
            running = true;
        }
}

V podmínce if (!running) upravíme volání metody AddRelativeForce() v těchto podmínkách:

void Update()
{
     ...
     if (Input.GetKey(KeyCode.D))
     {
         rb.AddRelativeForce(new Vector3(movementSpeed * Time.deltaTime, 0, 0));
         CheckAndSetWalkingAnimation();
     }

     if (Input.GetKey(KeyCode.A))
     }
          rb.AddRelativeForce(new Vector3(-movementSpeed * Time.deltaTime, 0, 0));
          CheckAndSetWalkingAnimation();
     }

     if (Input.GetKey(KeyCode.W))
     {
          rb.AddRelativeForce(new Vector3(0, 0, movementSpeed * Time.deltaTime));
          CheckAndSetWalkingAnimation();
     }

     if (Input.GetKey(KeyCode.S))
     {
          rb.AddRelativeForce(new Vector3(0, 0, -movementSpeed * Time.deltaTime));
          CheckAndSetWalkingAnimation();
     }
     ...

V proměnné Time.deltaTime je doba od posledního snímku. Tuto dobu vynásobíme naší silou movementSpeed aby hráč byl stejně rychlý bez ohledu na výkon počítače.

Úprava podmínky if (Input.GetMouseButton(1))

Pod poslední úpravou dle předchozí kapitoly si najdeme v kódu podmínku if (Input.GetMouseButton(1), kterou upravíme následovně:

void Update()
{
     ...
     if (Input.GetMouseButton(1) &&
         !objectWithAnim.GetCurrentAnimatorStateInfo(0).IsName("Reload Ammo Left") &&
         !objectWithAnim.GetCurrentAnimatorStateInfo(0).IsName("Reload Out Of Ammo"))
      {
            objectWithAnim.SetBool("Aim", true);
      }
      else
      {
            objectWithAnim.SetBool("Aim", false);
      }
     ...
}

V příští lekci, 3D střílečka v Unity - Přebíjení - Skript Shoot , dokončíme práce na funkcionalitě přebíjení a zobrazení zbývajících nábojů editací skriptu Shoot.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 35x (4.08 kB)
Aplikace je včetně zdrojových kódů v jazyce C# .NET

 

Předchozí článek
Kvíz - Úprava terénu, střelba a animace přebíjení v Unity3D
Všechny články v sekci
Tvorba 3D her v Unity
Přeskočit článek
(nedoporučujeme)
3D střílečka v Unity - Přebíjení - Skript Shoot
Článek pro vás napsal Tomáš Brabec
Avatar
Uživatelské hodnocení:
10 hlasů
Hodně zdaru programátoři všeho druhu,doufám ,že nikdy nezažijete nudu.
Aktivity