Besplatan online tečaj UNITY – KORIŠTENJE DODATAKA

Photo of author

By Nenad Crnko

U prošlom, drugom nastavku serijala igraču smo u demo projektu izmijenili nekoliko svojstva (čije smo djelovanje detaljno objasnili), te ga tako pretvorili u svojevrsnog supermena u izmišljenom svijetu demo projekta.

Image created with PolarVectors graphic resources

Prvi dio

Drugi dio

Treći dio besplatnog online UNITY tečaja za programiranje igara

Četvrti dio

Peti dio

Danas ćemo prvo objasniti još nekoliko sličnih svojstava, ali će naglasak teksta biti na uključivanju posebnih dodataka u vlastiti projekt (npr. datoteka sa zvučnim efektima). Pretpostavljamo da ste se u međuvremenu i sami malo poigrali s korištenjem poznatih svojstava, to jest svojstava iz grupa General, Movement, Rotation i Fall Damage.

Grupe svojstava s kojima ćemo se pozabaviti u današnjem nastavku su Stance i Audio. Dok u pogledu korištenja svojstava iz prve grupe nema tehnički ničeg posebno novog (riječ je o običnim brojčanim svojstvima za dodatnu promjenu izgleda i ponašanja igrača), kod druge grupe svojstava po prvi put počinjemo koristiti u projektu datoteke s posebnim podacima.

Nove grupe svojstava Stance i Audio o kojima će nešto više riječi biti u današnjem nastavku.

Svojstva iz grupe Stance zadužena su za definiranje veličine i “načina držanja” igrača. U nastavku slijedi njihov kratak opis uz navođenje početne (podrazumijevane) vrijednosti:

 

Camera Height Ratio

Određuje mjesto gdje će se nalaziti kamera za prikaz sadržaja s obzirom na igračevu visinu. Mogući raspon vrijednosti je od 0 do 1, uz podrazumijevanu vrijednost 0.8

Capsule Height Standing

Visina igrača dok stoji uspravno. Početna vrijednost je 1.8

Capsule Height Crouching

Visina igrača za vrijeme dok je u stanju čučnja. Početna vrijednost je 0.9

Crouching Sharpness

Brzina prelaska između prethodna sva stanja. Podrazumijevana vrijednost je 15.

Stvaranje divovskih čudovišta

Slično kao što smo u prethodnom nastavku igrača pretvorili u svojevrsnog natčovjeka izmjenom vrijednosti svega nekoliko svojstava, tako je u ovom slučaju dovoljno promijeniti vrijednosti jednog jedinog svojstva da bi se igrač pretvorio u diva. Nešto što vam je svakako potrebno ako u vlastitoj igri namjeravate imati lik nalik na “čudovište” iz filma Colossal snimljenog 2016 godine. Na primjer, izmijenite početnu vrijednost s 1.8 na 50 i pokrenite izvođenje projekta. Zbog takve izmjene igrač sad daleko nadvisujete sve zidove u sceni, pa izravno možete pratiti sve što se događa u dostupnim prostorijama.

Pogled na sve prostorije nakon što je igrač pretvoren u kolosa.

Korištenje dodataka

Za razliku od svih ranije korištenih svojstava (gdje su vrijednosti svojstava bile različite brojčane vrijednosti), u grupi Audio mogu se uočiti vrijednosti svojstva zadužene za povezivanje s nazivima datoteka. Prvo slijedi kratko nabrajanje svojstava iz grupe Audio i njihovih početnih vrijednosti:

Footstep SFX Frequency

Broj zvukova koji se reproducira kod pomicanja igrača za jedan metar (0.3).

Footstep SFX Frequency While Sprinting

Broj zvukova koji se reproducira kod trčanja (sprinta) igrača na dužini od jednog metra (0.2).

Footstep SFX

Zvuk koji se reproducira kod šetnje (Footstep).

Jump SFX

Zvuk koji se reproducira kod skoka (Jump).

Land SFX

Zvuk koji se reproducira kod prizemljenja nakon skoka (Land).

Fall Damage SFX

Zvuk koji se reproducira kod ozljede nakon pada (Land_Damage).

Prva dva svojstva su obične brojčane vrijednosti tako da ih nije potrebno dodatno komentirati. Međutim, ostale četiri vrijednosti predstavljaju nazive datoteka sa zvučnim zapisom povezane s određenom akcijom u programu. Podrazumijeva se da se takve datoteke već nalaze u okviru projekta s kojim radimo. Kod demo projekta je sve to već pripremljeno na pravilan način.

Datoteke sa zvučnim efektima već su isporučene s demo projektom.

Po želji se preko prikazanog dijaloškog okvira prikazanog na prethodnoj slici mogu međusobno zamijeniti zvučni efekti za različite radnje igrača. Iako, budimo realni, to baš i nema previše smisla, budući da su efekti točno prilagođeni svakoj operaciji. Više smisla ima zamijeniti neki od početnih zvukova nekim drugim zvukom, koji u ovom trenutku još uvijek nije sastavni dio projekta.

Dodatni zvukovi za vlastiti projekt mogu se pronaći na različitim mjestima i po različitim cijenama (naravno i besplatno). Na primjer, jedno od mjesta gdje se može pronaći vrlo šaroliki spektar zvukova za različite prilike je adresa https://freesound.org. Preduvjet za korištenje dostupnih sadržaja je besplatna registracija nakon, čega se može početi s preuzimanjem besplatnih zvučnih efekata.

Preuzimanje besplatnih zvučnih efekata s adrese freesound.org.

Za potrebe ovog teksta preuzmite sljedeća dva zvučna efekta:

https://freesound.org/people/coby12388/sounds/222571/ (datoteka 222571__coby12388__minijump.wav)

https://freesound.org/people/Taira%20Komori/sounds/215425/ (datoteka 215425__taira-komori__beam03.mp3)

Nakon što se zvukovi poslije preuzimanja pojave na lokalnom računalom, potrebno ih je još uvesti u razvojnu okolinu Unity na odgovarajuće mjesto (Assets / FPS / Audio / SFX / Player). Kad u razvojnoj okolini otvorite navedenu karticu potrebno je izabrati naredbu Import New Asset te u nju uvesti preuzete datoteke. Na samom kraju postupka treba ih izabrati kao nove vrijednosti svojstava Jump SFX odnosno Land SFX. Preostaje još samo da ponovo pokrenete projekt i vidite (pardon čujete) promjene.

Napomena

Ako nakon pokušaja skoka samo čujete novi zvuk, a ne primijećujete da se doista dogodio nekakav skok, možda je razlog u tome što ste ostavili visinu igrača u statusu kolosa. Po potrebi je smanjite (može i na početnu vrijednost), kako bi mogli uživati u skokovima popraćenim novim zvučnim efektima.

Uvoz preuzetih datoteka s besplatnim zvučnim efektima u vlastiti projekt.

Ako među besplatnim zvučnim efektima ne možete pronaći odgovarajuće rješenje, uvijek vam je na raspolaganju komercijalna alternativa. Da stvar bude još bolja, komercijalna rješenja dostupna su izravno u samoj razvojnoj okolini Unity (slijedeća slika), pa ne trebate koristiti tražilice da bi pronašli to što vam treba.

Izravni pristup online trgovini s različitim vrstama dodataka.

Nakon odabira kartice Asset Store prelazi se na integriranu online trgovinu, gdje su dostupne različite vrste dodataka. U ovom trenutku nas prije svega zanima odjeljak Audio, gdje se nalazi mnoštvo različitih zvučnih efekata. Cijene pojedinih zbirkih zvučnih efekata kreću su u rasponu od 5 do 15 dolara, što zapravo i nije neki poseban iznos u slučaju kad radite na projektu komercijalne namjene.

Postojanje online trgovine dodataka nije dobro samo zbog moguće kupovine takvih proširenja projekta, nego istovremeno omogućuje da sami izrađujete takve dodatke i zarađujete na njima. Naravno, kad se dovoljno upoznate s razvojnim alatom Unity da bi tako nešto zbilja mogli i napraviti.

Prvi dodir s programskim kodom

Do ovog trenutka smo Unity isključivo koristili preko razvojne okoline. Došao je trenutak da malo zahvatimo i programski jezik u pozadini. Iako se puno toga može napraviti preko grafičkog korisničkog sučelja, teško da ćete pravi komercijalni projekt dovršiti bez pisanja programskog koda. Zato ćemo u budućim tekstovima koristiti oba pristupa, a sad ćemo napraviti samo osnovni uvod u programski kod.

Za pisanje odgovarajućeg programskog koda (takozvanih skripti) Unity koristi danas vrlo popularni programski jezik C#. Ako se do sada nikad niste bavili programiranjem (a pogotovo ne u tom jeziku), onda je svakako bitno istaknuti da učenje programskog jezika C# nije nešto što ćete moći primijeniti samo tijekom korištenja alata Unity. Zbog njegove rasprostranjenosti postoji velika vjerojatnost da će vam upravo poznavanje jezika C# pomoći kod traženja posla povezanog s programiranjem.

C# je moderan objektno orijentirani programski jezik i kao takav vrlo pogodan za rukovanje različitim objektima koji se pojavljuju kod izrade igara i drugih vrsta podržanih projekata (igrač, neprijatelji, osvjetljenje, posebni efekti itd.). Svaki objekt dostupan u Unity okruženju ima manji ili veći broj svojstava čijom izmjenom se upravlja izgledom i ponašanjem objekta. Izmjenu svojstva moguće je napraviti preko grafičke razvojne okoline (to smo radili do sada u prozoru Inspector), ili preko odgovarajućeg C# koda. Tijekom samog izvođenja igre svojstva se u pravilu mijenjaju programskim kodom, dok se kod početnog oblikovanja izgleda modela vrlo uspješno može primijeniti grafičko korisničko sučelje.

Da bi čitava stvar bila nešto jasnija početnicima, pogledajmo kako bi se našem igraču (čijim smo izgledom i ponašanjem do sada upravljali pomoću prozora Inspector) te iste stvari pridružili u programskom kodu. Čak i ako nikad do sada niste programirali, ali razumijete engleski jezik i probali ste preko grafičkog korisničkog sučelja izmijeniti stvari  opisane u zadnja dva teksta (prošlom i ovom kojeg upravo čitate), trebali bi steći bar prve, grube dojmove kako objektni pristup funkcionira u praksi. Tim više što iste komentare o pojedinom svojstvu dostupne u prozoru Inspector, vidite ovdje u obliku programskog koda.

using UnityEngine;
using UnityEngine.Events;


[RequireComponent(typeof(CharacterController), typeof(PlayerInputHandler), typeof(AudioSource))]
public class PlayerCharacterController : MonoBehaviour

{
    [Header("References")]
    [Tooltip("Reference to the main camera used for the player")]
    public Camera playerCamera;
    [Tooltip("Audio source for footsteps, jump, etc...")]
    public AudioSource audioSource;

    [Header("General")]
    [Tooltip("Force applied downward when in the air")]
    public float gravityDownForce = 20f;
    [Tooltip("Physic layers checked to consider the player grounded")]
    public LayerMask groundCheckLayers = -1;
    [Tooltip("distance from the bottom of the character controller capsule to test for grounded")]
    public float groundCheckDistance = 0.05f;

    [Header("Movement")]
    [Tooltip("Max movement speed when grounded (when not sprinting)")]
    public float maxSpeedOnGround = 10f;
    [Tooltip("Sharpness for the movement when grounded, a low value will make the player accelerate and decelerate slowly, a high value will do the opposite")]
    public float movementSharpnessOnGround = 15;
    [Tooltip("Max movement speed when crouching")]
    [Range(0,1)]
    public float maxSpeedCrouchedRatio = 0.5f;
    [Tooltip("Max movement speed when not grounded")]
    public float maxSpeedInAir = 10f;
    [Tooltip("Acceleration speed when in the air")]
    public float accelerationSpeedInAir = 25f;
    [Tooltip("Multiplicator for the sprint speed (based on grounded speed)")]
    public float sprintSpeedModifier = 2f;
    [Tooltip("Height at which the player dies instantly when falling off the map")]
    public float killHeight = -50f;

    [Header("Rotation")]
    [Tooltip("Rotation speed for moving the camera")]
    public float rotationSpeed = 200f;
    [Range(0.1f, 1f)]
    [Tooltip("Rotation speed multiplier when aiming")]
    public float aimingRotationMultiplier = 0.4f;

    [Header("Jump")]
    [Tooltip("Force applied upward when jumping")]
    public float jumpForce = 9f;

    [Header("Stance")]
    [Tooltip("Ratio (0-1) of the character height where the camera will be at")]
    public float cameraHeightRatio = 0.9f;
    [Tooltip("Height of character when standing")]
    public float capsuleHeightStanding = 1.8f;
    [Tooltip("Height of character when crouching")]
    public float capsuleHeightCrouching = 0.9f;
    [Tooltip("Speed of crouching transitions")]
    public float crouchingSharpness = 10f;

    [Header("Audio")]
    [Tooltip("Amount of footstep sounds played when moving one meter")]
    public float footstepSFXFrequency = 1f;
    [Tooltip("Amount of footstep sounds played when moving one meter while sprinting")]
    public float footstepSFXFrequencyWhileSprinting = 1f;
    [Tooltip("Sound played for footsteps")]
    public AudioClip footstepSFX;
    [Tooltip("Sound played when jumping")]
    public AudioClip jumpSFX;
    [Tooltip("Sound played when landing")]
    public AudioClip landSFX;
    [Tooltip("Sound played when taking damage froma fall")]
    public AudioClip fallDamageSFX;

    [Header("Fall Damage")]
    [Tooltip("Whether the player will recieve damage when hitting the ground at high speed")]
    public bool recievesFallDamage;
    [Tooltip("Minimun fall speed for recieving fall damage")]
    public float minSpeedForFallDamage = 10f;
    [Tooltip("Fall speed for recieving th emaximum amount of fall damage")]
    public float maxSpeedForFallDamage = 30f;
    [Tooltip("Damage recieved when falling at the mimimum speed")]
    public float fallDamageAtMinSpeed = 10f;
    [Tooltip("Damage recieved when falling at the maximum speed")]
    public float fallDamageAtMaxSpeed = 50f;

…

Programski jezik C# i njegov objektni pristup pogodni su za razumijevanje i korištenje od strane programera, ali nisu baš uvijek idealan izbor kad iz postojećeg hardvera treba “iscijediti” svaki ciklus procesora da bi igra radila čim brže. Zato autori Unity sustava intenzivno rade na alternativnom pristupu za takve situacije pod nazivom Data-Oriented Technology Stack (DOTS). O tom pristupu će više riječi biti nekom drugom prilikom.