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:
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:
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:
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
:
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:
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:
Ú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