Programul de studii: Automatică și Informatică Aplicată [305787]
Universitatea “Constantin Brâncusi” [anonimizat], Medicale și Comportamentale
Programul de studii: Automatică și Informatică Aplicată
PROIECT DE DIPLOMĂ
Coordonator Științific:
Șef Lucrări dr.ing. Gîlcă Gheorghe
Absolvent: [anonimizat]
2018
Universitatea “Constantin Brâncusi” [anonimizat], Medicale și Comportamentale
Programul de studii: Automatică și Informatică Aplicată
Proiectarea și dezvoltarea unui joc 3D particularizat utilizând platforma de dezvoltare Unreal Engine 4
Coordonator științific:
Șef Lucrări dr.ing. Gîlcă Gheorghe
Absolvent: [anonimizat]
2018
Cuprins
1Introducere
1.1 Aplicati Populare
2. Concluzi
3. Bibiografie
1. Introducere
Dintr-o curiozitate jocurile au aparut pentru prima oara in jurul anilor 1950-1960 , [anonimizat] 1970 [anonimizat].
[anonimizat], [anonimizat] , [anonimizat] o [anonimizat] . Acest gen de joc a fost inspirat din lucrarile lui Howard Philips Lovecraft si din filmele de tip slasher urmand ca primele jocuri folosind aceasta tema numite Haunted house aparut in 1981 si Sweet home iar primul joc care a folosit imprejurimi in 3d.
Programul de dezvoltare a acestui joc este Unreal Engine 4 ,[anonimizat] a fost folosit prima oara pentru creerea jocului Unreal in anul 1998 , [anonimizat]-o [anonimizat]-uri . Unreal Engine are cudul scris in C++ ,avand un grad foarte mare de portabilitate si este unu dintre cele mai folosite motoare grafice de dezvoltatori de jocuri. Varianta actual folosita este Unreal Engine 4.19.2 facuta pentru versiunile de DirectX 11 si 12 , [anonimizat] , Windows , [anonimizat] 4, se mai poate folosi si in JavaScript/WebGL ( pentru browsere folosind html)
1.1 Istoric Unreal Engine
Prima versiune a acestui motor grafic numita Unreal Engine 1 unul dintre jocurile dezvoltate este jocul de tip Survival Horror este Clive Barker's Undying aparut in 2001 [anonimizat]-[anonimizat] o varietate de arme pentru a invinge inamicii care ii apar in drumul spre finalul jocului . [anonimizat] o anumita cantitate de viata care deobicei valoarea ei setata este de 100 si in coltul stang jos o [anonimizat]toarele poze:
Clive Barker's Undying
Cea de-a doua versiune a acestui motor grafic este Unreal Engine 2 care a aparut in anul 2002 avand ca urmare aparitia primului MMORPG creeat in acest motor grafic numit Lineage II. Jocul a aparut pe data de 1 Octombrie 2003 in Korea iar pe data de 27 Aprilie 2004 a aparut in America de Nord ,dezvoltatori acestui loc au ales sa utilizeze acest motor grafic datorita capacitatii sale de a face scene in aer liber si caracteristicile sale puternice de editare. Lineage II la alegerea caracterului este implementata functia de personalizare ca aspect fizic , acesta este un joc mult mai complex fata de cel prezentat mai sus avand implementate mult mai multe functii , butoane , o fereastra in care jucatori pot vorbi intre ei, Lineage II creeat pentru platforma Microsoft Windows ,jocul poate fi vazut in urmatoarele poze de mai jos.
Lineage II
In anul 2008 aparitia celei de-a trea versiuni a acestui motor grafic a aparut numita Unreal Engine 3 , unul dintre jocurile dezvoltate in aceasta versiune este un joc de tip aventura numit Life is Strange care este o aventura grafica care este jucata in viziunea third-person in care jucatorul poate interactiona cu mai multe personaje din povestea , poate sa faca aleger in dialoguri care va afecta sau va ajuta persona jucat ,de la bun inceput pana la sfarsittoate dialogurile raspunsurile se ramifica in poveste ducand la un sfarsit diferit tinand cont de alegerile facute de jucator.Jocul este creat pentru o multitudine de platforme ,cateva din ele sunt Microsoft Windows, PlayStation 3 si 4 Android , IOS,Linux , Xbox 360 si Xbox One facandusi aparitia pe data de 30 Ianuarie 2015 avand ca dezvoltatori pe Dontnod Entertainment.
Life is Strange
Versiunea folosita in prezent al motorului grafic prezentat este numit Unreal Engine 4 care a aparut in anul 2015 ,unul dintre jocurile dezvoltate in aceasta versiune este Little Nightmares , dezvoltatorii sunt Tarsier Studios care au facut jocul doar pentru patru platforme acelea fiind Microsoft Windows, Playstation 4 Xbox one si Nintendo Switch . Genul jocului este puzzle-platformer respectiv survival horror , in mare parte jocul este 2d avand foarte multe pazzle-uri.
Little Nightmares
1.2 Motivatie in dezvoltarea unui joc horror survival
Jocurile horror au o trasatura in comun, fiind aceea de a speria persoana din spatele ecranului. Motivul pentru care exista agest gen de divertisment este desfasurarea monotona a vietii individului ,prin urmare in subconstient de declanseaza nevoia de paranormal, horror care in viata de zi cu zi nu o are. Acest tip de divertisment „horror” contribuie la o metoda foarte usoara de satisfacere al acestei nevoi.
O sa descriu in continuare prin cateva exemple de jocuri de tip horror care ar putea fi elementele cheie la un joc de genu:
Slender: The Eight Pages (2012): jucatorul controleaza un personaj in first person adica poate vedea prin ochi personajului lasat intr-o padure noapte si scopul lui este sa gaseasca ce opt pagi, cu cat va gasi mai multe pagini jocul va deveni din ce in ce mai greu, insemnand ca personajul negativ pe nume Slender te va gasi si urmari din ce in ce mai des.
Doom3 (2004): jucatorul este pus in pielea personajului in first person ,iar dupa prezentarea comenzilor personajul este plasat intr-o baza de pe o alta planeta observand ca acea baza este bantuita si gazda unor creeaturi de tip paranormal si fictiv ,jucatorul casa poata sa treaca de anumite nivele trebuie sa se confrunte cu anumite obstacole monstrozitati folosint diverse tipuri de armanent , abgradandule pe parcursu nivelelor care devin din ce in ce mai intunecate si mai grelepana la sfarsitul jocului.
Amnesia: The Dark Descent (2010): locatia acestui joc este un castel intunecat si pustiu ,jucatorul prea controlul caracterului care este la intuneric sanatatea mentala ii se schimba incepand sa vada lucruri paranormale.
S.T.A.L.K.E.R.: Shadow of Chernobyl (2007):personajul principal este situat in zona centralei nucleare din ucraina care este evacuata din cauza ca zona era radioactiva, populata de cautatori de artefacte radioactive ,creaturi munante care ataca atat cautatori cat si banditi, povestea personajului consta in regasire memoriei pierdute prin explorarea zonei precizate.
Metro: Last Light (2013) :actiunea are loc intr-un viitor post apocaliptic in Moscova in mare parte toata actiunea are loc prin tunelele de metrou care inafara de factiunile rivale mai existau si creeaturi mutante si unele parti din metro erau radio active fiind principalul motiv pentru care populatia sa retras in tunelele de metrou , in mare parte nu erau toxice si radio active , jucatorul prea controlul personajului principal in first person si va urma un traseu de misiuni care din cand in cand va fi necesar sa iesi la suprafata unde numai creaturile mutante si cele paranormale puteau trai fara masti cu oxigen,jucatorul este obligat ca uneori sa intre in cele mai intunecate locuri si periculoase pentru a trece de o poarta sau o misiune.
1.3 Concluzie
Privind exemplele de mai sus observa ca jocurile de tip Survival horror au mai multe multe puncte comune care definesc acest tip de jocuri
Un exemplu as putea sa il dau acela ca in toate jocurile de acest gen caracteru in pare parte sau tot timpul singur este obligat de mediul inconjurator sa supravietuiasca si sa lupte cu anumite creaturi infricosetoare care pot sa iti sara in fata sau sa sara pe tine de ori unde.
Inca un exemplu bun care pot sa il mentionez este sonorizare ,avand in vedere ca jucatorul in mare parte o sa joace jocul cu castile pe urechi si cel mai probabil noaptea sunetul are un rol foarte mare cand ceva iti sare in fata te ataca sau teurmareste, unele dintre aceste sunete o sa dea impresia jucatorulu ca si cum cineva ar fi in stapele lui si i-ar respira in ceafa.
In concluzie pentru dezvoltarea unui joc horror trebuie sa ca jocul respectiv sa aiba aceste aspecte mentionate mai sus altfel jocul nu o sa atinga sentimentele pe care jucatorul ar trebui sa le simta in momentul cand trece prin contentul jocului.
1.4 Contributii
Pentru a imi atinge scopul acestei lucrari am sadezvolt in Unreal Engine 4 un joc survival horror 3d in care jucatorul va prelua controlul caracterului in first person urmand ca acesta sa supravietuiasca mediului inconjurator.
2. Capitolul 1
Platforma de dezvoltare
Unreal Engine ne ofera doua metode care ajuta dizainari si programatori sa lucreze mult mai usor impreuna , una dintre ele este cea de programare in C++,uramand ca programatori sa adauge sistemele de baza pentru un obiect sau nivel urmand ca dizainari sa selecteze ce au nevoie si sa inceapa sa dezvolte unumite texturi , jocuri ,animati. Acest motor graficeste mult mai accesiv pentru ca ofer posibilitatea unui non-programator sa isi dezvolte propriul joc. Programatorul deobicei va scrie partea de cod in programul C++ sau Microsoft Visual stidoa ,Xcode-ul Apple, iar dizainerul o sa lucreze cu Editorul Blueprint Unreal asta fiin a doua metoda. Aparent ambele sisteme pot functiona separat dar pentru ca cele doua sa se poata completa reciproc ele trebuie sa functioneze impreuna ceace inseamna ca API-ul gameplay-ului si clasele de cadru sunt disponibile pentru ambele sisteme ,asta inseamna ca programatori o sa creeze blocuri de constructie in C++ ,iar aceste blocuri vor fi folosite de dizaineri pentru a face un gameplay
1.1 Bibliotecile funcționale ale Blueprint –urilor
Uneori persoana care este in timpul dezvoltarii simte nevoia unui set de functii care este necesara pentru a usura si a scurta timpul de dezvoltare a proiectului .De obicei aceste functii sunt reutilizate intr-o varietate de cod de joc, aceiasi nevoie se prezinta de multe ori cand construiesti cu Blueprint-uri. Cu toate astea da dorim sa expunem functile de utilitate , in mod clar nu dorim sa le legam in mod necesar de un obiect din joc pentru ca exista bibliotecile de functii Blueprint pentru aceste cazuri. Aceasta bibleoteca de functi reprezinta o colectie de functi statice ce ofera dezvoltatorului functionalitati utilitare care nu sunt legate de un anumit obiect din joc sauproiectul care acesta il dezvolta ,aceste biblioteci pot fi grupate in seturi de functii logice.
Pentru crearea unei biblioteci de funcții Blueprint care este foarte asemănătoare cu expunerea funcțiilor la Blueprint folosind macrocomanda UFUNCTION (). În loc de a deriva de la un actor sau direct de la UObject, toate bibliotecile Blueprint moștenesc de la UBlueprintFunctionLibrary. Ele ar trebui să conțină și metode statice. Codul de mai jos este un fragment din Biblioteca Blueprint Analytics, care arată modul de configurare a clasei dvs. de bibliotecă.
UCLASS()
class UAnalyticsBlueprintLibrary :
public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
/** Starts an analytics session without any custom attributes specified */
UFUNCTION(BlueprintCallable, Category="Analytics")
static bool StartSession();
Dupa cum putem vedea in exemplul de mai sus este prezenta o biblioteca de functii Blueprint care este derivata imediat UObject, deci necesita macrocomanda standard UCLASS () și GENERATED_UCLASS_BODY (). De asemenea aceasta decoreaza functiile care trebuie eliminate din modele ,utilizand macrocomanda UFUNCTION (). Funcțiile dintr-o Bibliotecă de funcții Blueprint pot fi desemnate ca BlueprintCallable sau BlueprintPure în funcție de faptul dacă apelurile au efecte secundare sau nu. Vedem / UE4 / Engine / Plugins / Runtime / Analytics / AnalyticsBlueprintLibrary pentru codul sursă complet. Iată cum putem implementa functia StartSession ():
bool UAnalyticsBlueprintLibrary::StartSession()
{
TSharedPtr<IAnalyticsProvider> Provider = FAnalytics::Get().GetDefaultConfiguredProvider();
if (Provider.IsValid())
{
return Provider->StartSession();
}
else
{
UE_LOG(LogAnalyticsBPLib, Warning, TEXT("StartSession: Failed to get the default analytics provider. Double check your [Analytics] configuration in your INI"));
}
return false;
}
Implementarea de mai sus interacționează cu un obiect derivat din UObject. Aceasta este o modalitate bună de a expune funcțiile bibliotecii Third-Party la Blueprints sau de a interacționa cu clasele C ++ care nu au suport UObject. Codul de mai jos este un exemplu de metodă Blueprint Function Library care efectuează o activitate comună pentru a găsi AIController pentru un actor controlat:
AAIController* UAIBlueprintHelperLibrary::GetAIController(AActor* ControlledActor)
{
APawn* AsPawn = Cast<APawn>(ControlledActor);
if (AsPawn != nullptr)
{
return Cast<AAIController>(AsPawn->GetController());
}
return Cast<AAIController>(ControlledActor);
}
Această funcție ia ceea ce ar fi mai multe noduri Blueprint și se rostogolestează într-un singur nod. Desigur, ați fi putut face o facilitate în Blueprints pentru acest lucru, dar dacă se va numi, versiunea C ++ va oferi performanțe mai bune.
2.1. Sistemul audio Unreal Enigen 4
Sistemul audio din Unreal Engine 4 (UE4) este compus din mai multe componente, fiecare lucrand impreuna pentru a produce experienta audio pentru jucatori. Când importam un fișier audio în motor și îl aruncam într-un nivel, vom avea mai multe opțiuni, cum ar fi nivelurile de bază sau volum de nivel pentru ajustare, precum și mai multe setări de reglaj fin, cum ar fi atenuarea sunetului, care definește modul în care un sunet se aude în funcție de distanța de la originea sa. Unreal Engine 4 permite, de asemenea, construirea de sunete compozite sub forma Sound Cues și Sound Cue Editor, care ne permit să combinam sunete, precum și să aplicați modificatori numite Noduri de sunet pentru a modifica rezultatul final. Există elemente suplimentare care sunt utilizate pentru a defini modul în care se aude un sunetul.
Importare sunetului in Unreal Engine 4 in prezent accepta importarea unor fisiere de unda edian mic de 16 biti necomprimate la orice rata de etansionare (prezentata in imaginea de mai jos).Pentru rezultate optime, se recomanda utilizarea ratelor de etansionare de 44100 Hz sau 22050 Hz.
Esantionare Sunet
Importarea unui fișier de sunet în editor generează un material Sound Wave care poate fi aruncat direct într-un strat sau poate fi folosit pentru a crea un Sound Cue și pentru a putea fi edita în interiorul editorului Sound Cue.Importarea unui fișier de sunet poate fi tratată în două moduri:
Din Browserul de conținut, faceți clic pe butonul Importați (afisat in imaginea cu numele import Sound)
Selectarea fișierul .WAV pe care doriți să-l importați.
Import Sound
Sound Cues, sunt sunete compozite (Composite Sounds) care ne permit să modificam comportamentul redării audio, să combinam efecte audio și să aplicam modificatori audio cu Nodurile de sunet pentru a modifica rezultatul final. In urmatoarea imagine putem vedea cum arata constructia.
Sound Cue
Sound attenuation assets permit definirea proprietăților de atenuare într-o manieră reutilizabilă. Orice loc pe care îl putem specifica proprietățile de atenuare a utilizării unice, putem specifica activul de atenuare a sunetului. Aceasta permite ajustarea proprietăților de atenuare fără a fi nevoie să revedem fiecare sunet individual. Imaginea de mai jos reprezinta un panou de setari pentru precizarile de mai sus.
Sound attenuation settings
Reverb effects sunt un bun definabil, cu câteva proprietăți care pot fi ușor reglate și aplicate oricărui Volum Audio plasat în nivelul creat .Cu un efect Reverb, putem ajusta setările (în imaginea de mai jos) care ne vor permite să controlam elemente precum densitatea ecoului, câștigul general de reverb, absorbția aerului și multe altele pentru a vă ajuta să vă simțiți în general.
Reverb Effects
Sound Classes reprezintă o colecție de proprietăți care pot fi aplicate unui număr de elemente de sunet. Proprietățile în clasa de sunet acționează ca multiplicatori față de valorile existente și vor fi efectuate de către toate activele de sunet atribuite clasei de sunet. Ierarhiile pot fi create prin adăugarea de clase de copii, ceea ce ne va permite să transmitem numai proprietățile specificate din clasa părintească în clasele copil. Putem conecta clasa împreună în Editorul de clasă de sunet, care partajează o interfață bazată pe noduri asemănătoare, așa cum se vede în editorul Sound Cue.
Sound Cue Editor
De asemenea, putem adăuga amestecurile pasive de sunet într-o clasă de sunet care se va activa automat de fiecare dată când va fi redată clasa de sunet (de exemplu, sunetul de background care se aude incontinu intr-un joc).
Sound Mixes ne permit să setam setările EQ (Setări egalizator) și să modificam proprietățile volumului și ale pitch ale clasei de sunet.
Setari Egalizator
Mixele de sunete multiple pot fi active în același timp, toate contribuind la efectul audio general. Putem să amestecam sunetul în mod direct în interiorul unui Blueprint cu modificatorii Push Sound Mixer și Pop Sound Mix Modifier sau să-i activați pasiv ori de câte ori un sunet cu o anumită clasă de sunet se joacă într-un prag specificat. Cu toate acestea, metoda Push / Pop poate deveni foarte complexă rapid dacă avem un număr mare de amestecuri pe care încercam să le comutam. Acesta este locul în care se află jocul Set Override Blueprint Node. Poate seta un Mix de sunet activ pentru a utiliza orice clasă de sunet pe care o avem și pentru a interpola între clasa sa de sunet curentă și noua clasă de sunet în timp.Apoi putem seta Mixul de sunet înapoi la setarea sa originală utilizând funcția Clear Sound Mix Override. În interiorul materialului Sound Mix, care poate fi deschis prin dublu clic pe materialul din Browserul de conținut, există mai multe proprietăți. Putem specifica setările EQ pentru amestec pentru a ajusta frecvențele înalte, medii și joase și câștigurile. Deoarece setările EQ ale mai multor amestecuri de sunet nu pot fi combinate, Prioritatea EQ vă permite să controlați proprietățile amestecului activ care sunt aplicate la un moment dat. În secțiunea Clase de sunet, setam ce clase de sunet să fie afectate de mix. Pentru fiecare clasă de sunet, putem seta comenzile pentru volum sau pitch, setam dacă se vor aplica setările mixului pentru clasele de copii sau modificați VoiceCenterChannelVolume. Secțiunea Sound Mix ne permite să specificam cum sunt aplicate sau îndepărtate proprietățile Sound Mix. Întârzierea indică cât timp înainte de începerea aplicării proprietăților amestecului. Fade in Time și Fade out Time specifică cât de repede se trece de la nici un efect la proprietăți specificate. Durata permite mixului de sunet să se poată afișa automat după durata specificată. O valoare de -1 indică faptul că nu veți aplica în mod automat și pasiv în mod automat aplicațiile de mixare a sunetului nu vor apărea automat.
Dialogue Voice and Dialogue Wave assets sunt utilizate pentru generarea de evenimente de dialog în timpul jocului, crearea de subtitrări și pentru completarea eforturilor de localizare.Atunci când editam un material Dialog Voice nou creat, putem defini genul și pluralitatea unui actor vocal și, deși nu specificam niciun material audio în interiorul Dialogue Voice, informațiile furnizate aici pot fi menționate în interiorul Dialogue Wave.Dialogul Wave oferă mai multe opțiuni și este locul unde este realizată conexiunea dintre audio și difuzor / ascultător (i). De asemenea, se face corelarea dintre dialogul audio și textul subtitrare. Dialogul Wave reprezintă o singură linie de dialog, iar componenta de bază a setărilor pentru Dialogue Wave este secțiunea Contexturi de dialog.
Dialogue Voice and Dialogue Wave
În secțiunea dialogs Contexts , putem specifica difuzorul sau dialogul din acele secțiuni atribuind un dialog vocal. Linia audio reală a dialogului poate fi adăugată ca sunet Wave prin extinderea ferestrei de context și prin alegerea elementului dorit din meniul derulant sau prin îndreptarea către un material din browserul de conținut.Dacă avem mai mulți actori care susțin același dialog, opțiunea Add Dialog Context ne va permite să construim o nouă intrare de dialog unde putem configura noi secțiuni care sunt indrumate catre Speaker.
2.2. Arhitectura unreal
Cand programarea elementelor se face folosind codul C ++, fiecare modul poate contine mai multe clase C ++.
Fiecare clasă definește un șablon pentru un nou actor sau obiect. În fișierul de antet al clasei, clasa și orice funcții și proprietăți de clasă sunt declarate. Clasele pot conține structuri, structuri de date care ajută la organizarea și manipularea proprietăților conexe. Structurile pot fi, de asemenea, definite pe propria lor interfață.
La programarea cu Unreal Engine, este posibil să existe clase, funcții și variabile standard C ++. Acestea pot fi definite folosind sintaxa standard C ++. Cu toate acestea, macrocomenzile care au fost mentionate si mai sus numite UCLASS (), UFUNCTION () și UPROPERTY () pot fi folosite pentru a face Engineerul Unreal conștient de noile clase, funcții și variabile. De exemplu, o variabilă cu o declarație prefațată de o macrocomandă UPROPERTY () poate fi colectată de către motor și poate fi afișată și editată în Editorul Unreal. Există, de asemenea, macrocomenzi UINTERFACE () și USTRUCT () și cuvinte cheie pentru fiecare macro care pot fi folosite pentru a specifica comportamentul clasei, funcției, proprietății, interfeței sau structului în cadrul Unreal Engine și Unreal Editor.În plus față de macrocomenzile de mai sus, există o macrocomandă UPARAM () care este folosită în primul rând atunci când se expune codul C ++ la Blueprints. Pentru a vedea exemple de utilizare a UPARAM (), consultați documentația Elemente de expunere a elementelor de joc în Blueprints.
2.2. Crearea unui proect folosind Blueprints
Sistemul Blueprints Visual Scripting în Unreal Engine este un sistem complet de scripting bazat pe conceptul de utilizare a unei interfețe bazate pe noduri pentru a crea elemente de joc din cadrul editorului Unreal. Ca și în cazul multor limbi de scriere comune, este folosit pentru a defini clasele sau obiectele orientate pe obiecte (OO) în motor. Pe măsură ce utilizați Unreal Engine4 , veți găsi adesea că obiectele definite folosind Blueprint sunt denumite în mod colocvial doar "Blueprints".Acest sistem este extrem de flexibil și puternic, deoarece oferă proiectanților posibilitatea de a utiliza practic toată gama de concepte și instrumente disponibile în general pentru programatori. În plus, marcajul specific Blueprint disponibil în implementarea C ++ a Unreal Engine permite programatorilor să creeze sisteme de bază care pot fi extinse de designeri.
În forma lor de bază, Blueprints sunt scenarii adacugate intr-un proiect. Prin conectarea nodurilor, a evenimentelor, a funcțiilor și a variabilelor cu cablurile, este posibil să creați elemente de joc complexe. Blueprints funcționează utilizând graficele de noduri pentru diverse scopuri – construcția obiectelor, funcțiile individuale și evenimentele generale de joc – care sunt specifice fiecărui exemplu de plan pentru a implementa comportamentul și alte funcționalități.
Tipurile Blueprint folosite frecvent fiind cele mai obistuite tipuri de Blueprin cu care lucreaza toate persoanele care utilizeaza acest motor grafic sunt Level Blueprint si Blueprint Classes. Sunt doar doua clase Blueprint, care de asemenea includ Blueprint Macros și Blueprint Interfaces.
Level Blueprint
Nivelul Blueprint umple același rol pe care Kismet la făcut în Unreal Engine 3 și are aceleași capacități. Fiecare nivel are un nivel propriu de planificare a nivelului, iar acest lucru poate referi și manipula Actorii în cadrul nivelului, controla cinematica folosind Matinee Actors și gestionează lucruri precum streaming de nivel, puncte de control și alte sisteme legate de nivel. Nivelul Blueprint poate, de asemenea, interacționa cu clasele Blueprint plasate în nivel, cum ar fi citirea precum si setarea oricăror variabile sau declanșarea evenimentelor personalizate pe care le-ar putea conține.
Blueprint Class
Modelele Blueprint sunt ideale pentru a face aseturile interactive, cum ar fi ușile, întrerupătoarele, obiectele de colecție și peisajul distructiv. În imaginea de mai sus, butonul și setul de uși sunt fiecare separate Blueprints care conțin scriptul necesar pentru a răspunde la evenimentele de suprapunere a jucătorului, pentru a le anima, pentru a reda efecte sonore și pentru a schimba materialele lor, ca de expemplu putem plasa o comanda ca butonul cand este apasat sa se aprinda. În acest caz, apăsarea butonului activează un eveniment în interiorul ferestrei Blueprint, cauzând deschiderea acesteia – dar ușile pot fi activate la fel de ușor cu ajutorul unui alt tip de Blueprint sau printr-o secvență Level Blueprint. Datorită naturii autonome a Blueprints, ele pot fi construite astfel încât să le puteți lăsa la un nivel și ei vor lucra pur și simplu, cu o configurație minimă necesară. Acest lucru înseamnă, de asemenea, că editarea unei Blueprint care este utilizată pe parcursul unui proiect va actualiza fiecare instanță a acestuia.
Putem construi prefabricate personalizate cu ajutorul Construction Scripts
Scriptul de construcție este un tip de grafic în cadrul claselor Blueprint care se execută atunci când actorul este plasat sau actualizat în editor, dar nu în timpul gameplay-ului. Este util pentru crearea de elemente de recuzită ușor personalizabile care să permită artistilor de mediu să funcționeze mai repede, cum ar fi un dispozitiv de iluminare care actualizează automat materialul pentru a se potrivi cu culoarea și luminozitatea componentei sale de lumină punctuală sau cu un Blueprint care împrăștie întâmplător ochiurile de frunziș peste o zonă.
În hărțile din Exemple de conținut, camerele lungi care conțin fiecare exemplu (imaginea de mai sus) sunt de fapt o singură Blueprint compusă din mai multe componente. Scriptul Blueprint's Construction creează și aranjează diferitele mese statice și lumini în funcție de parametrii expuși în panoul Detalii al Blueprint. Cu fiecare hartă de conținut pe care am creat-o, am reușit să renunțăm la camera de demo Blueprint, stabilind valori pentru lungimea, înălțimea și numărul de camere care ar fi generate (și câteva alte opțiuni) și au un set complet de camere gata în momente.
Un plan ca acesta poate fi consumator de timp pentru a crea inițial, dar dacă stiim că îl vom folosi adesea, timpul economisit când se construiește un nivel și ușurința de a face schimbări poate face foarte util.
Crearea unui caracter de joc care sa poata fi redat.
Pioni sunt, de asemenea, un tip de clasă Blueprint, și este posibil să se pună împreună fiecare element de care aveți nevoie pentru un caracter jucabil în graficul Blueprint. Avem posibilitatea să manipulam comportamentul camerei, să configuram evenimente de intrare pentru mouse, controler și ecrane tactile și să cream un material de animație Blueprint pentru manipularea animațiilor cu ochiuri scheletice.
Când dezvoltam un nou model de caractere, acesta vine cu o componentă de caractere care are o mare parte din comportamentul necesar pentru deplasarea în jur, săriturile, înotul și încadrarea încorporată și tot ce este necesar este adăugarea unor evenimente de intrare în conformitate cu modul vrei ca personajul dezvoltatorului să fie controlat cum trebuie. Pentru un joc indiferet pe ce platforma o sa aiba nevoie de HUD( head-up display) sau o putem numii bara de status este metoda prin care informatile sunt transmise pe ecran , informati care sunt de ajutor jucatorului.
Scriptul Blueprint poate fi utilizat și pentru a crea un HUD al unui joc, care este similar cu clasele de Blueprint, prin faptul că poate conține secvențe și variabile de eveniment, dar este atribuit activității dvs. de joc GameMode în loc să fie adăugat direct la un nivel.Puteți configura un HUD pentru a citi variabilele de la alte planuri și pentru a le folosi pentru a afișa o bară de viata, pentru a actualiza o valoare a scorului, pentru a afișa marcatori obiectivi și așa mai departe. Este, de asemenea, posibil să utilizați HUD pentru a adăuga casetele de hit-uri pentru elemente cum ar fi butoanele pe care se poate face clic sau, în cazul jocurilor mobile, pot răspunde la atingerea de intrare.Toate exemplele ilustrate mai sus există în conținutul eșantionului disponibil cu Unreal Engine 4. Aceste metode mentionate mai sus plus altele care vor fi explicate , vor face parte din acest proiect.
2.3.Cele mai bune Blueprint-uri si cele mai practice
Se pot face multe lucruri cu Blueprints. Totul, de la crearea unui mic joc sau a unor instrumente de conținut de procedură, la prototiparea de noi funcționalități, la alinierea și lustruirea lucrurilor făcute de programatori, este posibilă cu sistemul de scripting vizual Blueprint.Cu toate acestea, există anumite lucruri care vă vor afecta performanța mai mult dacă sunt realizate în Blueprints. Dacă aveți un Blueprint care face multe operații și matematică complexă la fiecare bifat, poate doriți să luați în considerare utilizarea codului nativ C ++. Blueprints sunt cele mai potrivite pentru a face funcționalitate bazată pe evenimente, cum ar fi manipularea daunelor, controale și alte lucruri care nu se numesc fiecare cadru.Chiar daca functionalitatea este potrivita pentru Blueprint, exista decizi pe ca trebuie luate in configurarea Blueprint ca lucrurile sa mearga mai bine,care vor fi explicate in continuare.
Level Blueprints – Blueprint Classes
Level Blueprint poate fi foarte asemanator Unreal Engine 3 Kismet, deoarece puteți selecta obiecte direct în nivel și le puteți folosi. Ele sunt excelente pentru prototipuri unice și pentru a se familiariza cu sistemul Blueprints, dar ele sunt specifice nivelului în care sunt utilizate. Aceasta înseamnă că Level Blueprint poate fi un loc minunat pentru a stabili un nivel de funcționalitate sau Actori în aceasta. Câteva exemple ar fi lansarea și cinematică atunci când un anumit declanșator este atins sau deschiderea unei anumite uși după ce ați omorât toți inamicilor .În general, clasele Blueprint sunt cea mai bună modalitate de a obține un comportament reutilizabil intr-un proect. Dacă creem o Clasă Blueprint, o putem adăuga la oricare dintre nivelele proectului și putem adăuga, de asemenea, cât mai multe copii pe care le dorim, fără a fi nevoie să copiem scenariul în jurul acestuia. Dacă nu începem în Level Blueprint și apoi decidem să ne mutam într-o clasă Blueprint, acesta ar trebui să fie un proces destul de simplu. Când copiem dintr-un plan de nivel care funcționează pe actori (de exemplu, apelați setarea luminozității pe o lumină) și inserați-le într-o clasă Blueprint pe baza unui actor de lumină, funcțiile se vor actualiza pentru a fi în domeniul corespunzător.
Class Variables – Local Variables
Cand lucram in Blueprint avem posibilitatea de a adauga variabile utilizand tabelul My Blueprint, totusi cand utilizatorul se afla in interiorul unei functii o sa observe inca o sectiune suplimentara din fila My Blueprint pentru variabilele locale. Variabilele locale sunt înclinate, ceea ce înseamnă că ele există doar acolo unde sunt definite de catre utilizator. Deci, variabila locală dintr-o funcție este vizibilă numai pentru acea funcție, și nu pentru alte funcții sau Grafic de evenimente. Acest lucru ajută la reducerea aglomerării pentru lucruri care sunt relevante numai în contextul funcției respective. Se poate lua în considerare variabilele locale și "scratch pad" pentru a lucra cu o funcție. Avem posibilitatea să le utilizam pentru a vă ajuta la efectuarea la ceea ce are nevoie funcția, dar ei vor fi aruncați după ce caracteristica a terminat. Variabilele de clasă se referă la lucruri despre care utilizatorul este potențial interesat să acceseze din mai multe locuri în Blueprint. Deci, lucruri ca referirile la ochiuri sau alte componente sau variabile care trebuie să fie publice, astfel încât să le putem accesa de la alte Blueprint-uri, ar trebui să fie variabile de clasă. Sunt lucrurile pe care nu trebuie uitate după ce sunt folosit.
Functions – Macros
Funcțiile și macrocomenzile (Functions and Macros) îndeplinesc ambele obiective externe: ne permit să trimitem intrări într-un nod, ceva se întâmplă cu acesta și apoi ies.Se realizează aceste lucruri în două moduri diferite, dar au unele asemănări:
ambele au un loc central pe care se poate edita funcționalitatea a ceea ce face nodul (macro-uri în macro-graf și funcții în graficul funcțiilor) și fiecare nod care apelează funcția sau macro-ul va fi actualizat ori de câte ori acel loc central este schimbat.
ambele sunt reutilizabile.
ambele permit variabilele locale. Macrourile utilizează variabile locale "anonime", care nu au un nume specific, ci doar o valoare.
ambele sunt modalități minunate de încapsulare a funcționalității pentru reutilizare și claritate.
Exista unele diferente-cheie care vor deveni din ce in ce mai evidente pe masura ce persoana care foloseste programul va ajunge in cazuri mai avansate de utilizare fiind:
funcțiile sunt de fapt numite atunci când utilizatorul plaseaza nodurile pentru a apela funcția. Aceasta înseamnă că le putem viza (adică "apelați o funcție pe un alt obiect") și acestea permit comunicarea între Blueprint-uri.
macro-urile iau nodurile din graficul macro și, de fapt, înlocuiesc nodul macro cu o copie a tuturor acestor noduri. Practic, atunci când Blueprint-ul este compilat, macro-ul copiază toate nodurile de graf și le inserează acolo unde este nodul macro.
Din cauza modului de lucru al motorului grafic rezulta ca exista cateva diferente in ceea ce utilizatorul poate face:
macro-urile pot folosi orice nod pentru clasa în care sunt incluse (clasa pe care este aleasa când se creaza un nou Macro Blueprint sau dacă este o macrocomandă locală, clasa în care este definită macrocomanda). Aceasta înseamnă că avem o mică versatilitate în nodurile pe care le puteți pune într-o macrocomandă.
una dintre cele mai mari diferențe dintre o funcție și o macrocomandă este că putem plasa noduri latente într-o macrocomandă, dar nu într-o funcție.
Funcțiile vă permit să înlocuiți funcționalitatea acestora în planurii. De exemplu, să presupunem că aveam un Blueprint de mașină care avea o funcție "PlayerInteractedWithMe". În această funcție, s-ar putea sa apasam pe butonul care are comanda de a clacsona sau care poate are un clacson personalizat . Acum, să presupunem că avem doua copii ale mașinii Blueprint, pentru o mașină de poliție și un camion de pompieri. În mașina de poliție, putem suprascrie funcția pentru a reda un zgomot de sirenă și a porni lumina. În camionul de pompieri , butonul respectiv ar putea fi comana pentru apă. Acest tip de funcționalitate nu este posibilă cu macrocomenzile.
deoarece macrocomenzile sunt doar copiate și inserate în grafic în timpul compilarii, putem avea mai multe fire de execuție în și din macro. Nu putem face asta într-o funcție.
În general, o regulă bună ar fi să utilizam o macrocomandă dacă există o scurtă funcționare pe care dorim să o avem peste tot. Dar, dacă dorim să modificați acest comportament la copiile Blueprint sau dorim să îl accesam direct dintr-un alt Blueprint, este mai bine sa se utilizeze o funcție.
2.4.Blueprint Editor
Blueprint scripting vizual este un sistem care este folosit în Unreal Engine4 în multe moduri diferite. Modelele Blueprints pot conduce evenimente bazate pe niveluri, controlează comportamente scenariu intern pentru Actori în joc și chiar pot fi folosite pentru a controla animații complexe prin intermediul sistemelor extrem de realiste de caractere. Pentru fiecare dintre aceste aplicații Blueprint, locația în care se editeaza acest script Blueprint, precum și instrumentele disponibile pentru utilizator, se vor schimba ușor în funcție de nevoile utilizatorului. Acest lucru înseamnă că există, de fapt, mai multe locuri și moduri diferite în cadrul Unreal Engine 4 pe care editorul Blueprint poate să apară. Cu toate acestea, indiferent de diferențele, Editorul Blueprint întotdeauna efectuează aceeași sarcină cheie: vă permite să creați și să editați scripturi vizuale puternice pentru a conduce diverse aspecte ale jocului.Editorul Blueprint este, în centrul său, pur și simplu un editor de grafic bazat pe noduri. Acesta este instrumentul principal pentru crearea și editarea rețelelor de noduri de scripting vizual, denumite în mod obișnuit doar ca Blueprints. Editorul Blueprint utilizează un design sensibil la context care ajută utilizatorul să acceseze funcționalitatea obiectelor de care are nevoie în mod special atunci când avem nevoie de ele, oferind în același timp flexibilitate pentru acele momente când trebuie să construim ceva puțin neconvențional.
Iata cateva lucruri pe care utilizatorul trebuie sa le cunoasca despre Editorul Blueprint:
Acesta include mai multe instrumente și panouri pentru a ajuta utilizatorul sa construiasca propriile variabile, funcții, tablouri și multe altele.
Dispune de o varietate de instrumente de depanare și de analiză integrate pentru a ajuta utilizatorul să depane rapid și să îmbunătățeasca fluxul de date în rețelele construita.
În cadrul programului Unreal Engine 4, Editorul Blueprint vine într-o varietate de forme specializate, în funcție de tipurile de rețele Blueprint pe care le putem edita.
2.5 Concluzie
Din cele scrise mai sus concluzia este ca acest motor grafi, aceasta varsiune de motor grafic numita Unreal Engine 4 foloseste in mare parte Blueprints si este mai usor de manipulat folosind aceste Bluprint -uri.
3. Capitolul 2
Ca la fiecare proiect dezvoltat in Unreal Engine incepem incepem cu crarea proiectului care va fi construit cu Blueprints camera va fi aaleasa ca third-person apoi voi alaege ca jocul sa fie construit pentru calculator sa foloseasca tastatura si mouse-ul , calitatea texturi sa fie la maxim comanda selectata numinduse Maximum Quality apoi am inclus contentul de baza care imi este oferit de Unreal Engine 4 pentru ca in marea majoritate a cazurilor este de mare ajutor urmat sa dau nume proiectului numit SurvivalHorror ,dupa toate de mai sus motorul a creat versiunea de inceput al unui caracter si unei mici camere asteptand sa fie modelat in continuare,se poate observa ce am explicat pana acum in urmatoarele doua imagini:
1.Crearea Proectului.
2. Faza de inceput care Unreal Engine 4 ne-o ofera.
Fisierul principal cu care voi lucra este Blueprint Folder in care care avem caracterul Third-person cum putem vedea si in imaginea 2 unde voi dezvolta majoritatea mecanicilor pe parcursul acestui poiect.primul lucru care l-am adaugat in caracter este un sistem numit Hunger Sistem acest sistem este un fel de timer in care este notat debicei cu bara de viata a caracterului rezultand ca jucatorul trebuie sa caute hrana sau obiectele necesare pentru refacerea bari de viata. Ca de obicei lucruri ca astea sunt variabile ,prin urmare am accesat caracterul din folderul Blueprint selectand tabul viewport si am creat o variabila noua numita PlayerHunger urmand sa setez tipul variabilei numita integer ,am ales acet tip pentru ca pentru ca valoarea variabilei o sa fie un numar ,setandui valoarea ded baza cu 100 , acesta este un sitem simplu care de fiecare data can ceva o sa afecteze caracterul sau o sa treaca un timp o sa scada cu 25 .pentru a face aceast eveniment sa se intample trebuie creat in urmatorul fel ,mutandune la tab-ul Event Graph ,in prima faza am adaugat o functie numita Event Tick( avand functia de a scadea un anumit numar din cel de baza ) care este legata de o functie de Delay avand un timer care pot sa ii setez un anumit timp care sa scada cei 25 din 100 aceasta functie fiind legata de de variabila creata Player hunger care detine valoarea maxima, apoi am adaugat un Branch intre Event Tick si F Delay avand ca rol de a verifica daca caracterul are destula viata ca sa mai fie in viata si adaugand o conditie care este legata de Integer care are rolul de a transmite daca caracterul are valoarea 100 sau 0 , folosint 0 si 1 legate de minimum si maximum acesta va trimite in napoi in Branch 0 fiind pentru false and 1 find true , de acolo caracterul va pierde iar daca este 1 jucatorul va putea sa continue jocul.
PlayerHunger Event Graph
Dupa toate astea am adaugat 2 noi Bluprint- uri aproape identice ele urmand sa fie mancarea pe care jucatorul o aduna pentru a supravietui. Am importat 4 imagini pentru Bluprint-urile ca va urma sa le fac ,dupa cele 3 imaginile au fot importate am creat materialul pentru imaginile importate pentru a putea fi adaugate in blueprint.Trecand la functionalitate am creat un nou blueprint care practic o sa fie pentru adunarea mancari,este creata ca un Normal Actor , in interiorul acestui Bluprint in prima faza am adaugat un cub apoi pentru a ii da imaginea care mi-o doream am am adaugat din setarile cubului materialul creat mai devreme pe baza pozelor importate urmand a intra in partea de functionalitate unde am adaugat functia Cast To Third Person Character pentru a facelegatura acestui obiect cu caracterul principal si dandui obiectului anumite functii, legand de Cast To Third Person Character variabila PlayerHunger Set adaugand functia integer+integer care va face legatura cu PlayerHunger Get ,prin aceasta functie caracterul cand va atinge cutia i se va aduna o valoare setata in functia integer+integer, pentru a verifica ca valoarea trecesau nu trece de 100 cand cutiile sunt colectate am adaugat un Branch care este legat de PlayerHunger Set, avand concluzia legata de integer > integersi aceasta functie este legata inapoi de PlayerHunger Set,am adaugat si o functie de a ne printa pe ecran cate puncta facem in finalul acestui blueprint avem o functie de distrugere a cutiei si pentru cea dea doua cutie pur si simplu am duplicat blueprint -ul , am schimbat imaginea si cateva valori, pentru o mica idee in imaginea urmatoare este prezentat Bluprint-ul explicat
Player Hunger functionalitate in joc
In continuare am revenit la Blueprint-ul caracterului pentru a adauga o functie numita Event BeginPlay aceasta functie are rolul de a arata pe ecran un anumit text sau cum o sa fie in acest proiect barile de viata, este legat de un Wiged node in care am introdus o clasa pe care am creato fiind de data asta user widget, la randul lui a trecut prin modificari, din nou am importat cateva imagini pentru barile de hunger si de Stamina avand scris deasupra fiecarei bari numele ei , adaugarea imaginii se face un progressbar care ne permine sa mai adaugam o poza peste poza originala putin mai inghisa decat originala ia sazand cand in joc se intampla un anume eveniment.
Inainte de a continua procesul de dezvoltare al jocului doresc sa explic mai pe larc ce fac functile si comenzile atribuite caracterului miscarile cum sunt construite pozele cum pot fi create cam tot ce am folosit pana acum.
Incepand cu caracterul care este creat automant de Unreal Engine 4 in functie de cum este ales in optiunile proiectului inainte de creare ,caracterul de fata este unul Third-person adica jucatorul il va vedea din spate ,el este creat automat de motor cu un set de comenzi care pot fi modificate la alegerea dezvoltatorului sau pot fi lasate asa cum sunt date , acestea fiind miscarile de baza stanga dreapta fata spate si sarituri , in spatele caracterului exista o camera care poate fi plasata in ori ce pozitie de utilizator ,putem chiar sa trecem din third-person in first-person prin mutarea camerei in capul caracterului legando prin anumite comenzi de cap ,pentru a evita bugurile care pot aparea in timpul miscari , in modul acesta viziunea devinde din third-person in first person putand vedea prin ochi caracterului , bine inteles camera se poate muta inapoi si in timpul jocului dand posibilitatea jucatorului sa poata sa isi aleaga cum doreste sa joace jocul respectiv, trecand peste subiectul acesta ,am inceput sa construiesc un set nou de comenzi cum am precizat mai sus tot in blueprintul caracterului, am sa explic aceste comezi ,evenimente ,functi pentru a evita explicarea lor de fiecare data cand sunt folosite in joc incepand cu:
Ca inceput am pornit cu Event Tick este un eveniment. Evenimentele sunt noduri care sunt chemați din codul de joc pentru a începe executarea unei rețele individuale în cadrul EventGraph. Acestea permit Blueprint-urilor să efectueze o serie de acțiuni ca răspuns la anumite evenimente care apar în joc, cum ar fi începerea jocului, resetarea nivelului, luarea de daune etc. Aceste evenimente pot fi accesate în Blueprints pentru a implementa noi funcționalități sau pentru a suprascrie sau augmenta implicit. Orice număr de evenimente poate fi folosit într-un singur eveniment EventGraph; deși se poate utiliza numai unul din fiecare tip.In cazul de fata avem EvenTick care functioneaza ca un cronometru ca exemplu timpul care jucatorul il are pana la sfarsitul actiuni care o face pe un nivel.
Nodul Branch servește ca o modalitate simplă de a crea fluxul bazat pe decizie dintr-o singură condiție adevărată / falsă. Odată executat, nodul Branch se uită la valoarea de intrare a Booleanului atașat și emite un impuls de execuție pe ieșirea corespunzătoare. In acest exemplu, ramura verificata este starea curenta a variabilei PlayerHunger .Daca este adevarata caracterul va putea continua jocul, daca este falsa caracterul nu va putea continua jocul.
F Delay este o functie care face o actiune latenta cu o intarziere (specificata in secunde)si apelarea din nou in timp ce se numara in jos va fi ignorata ,ca de exemplu dupa ce caracterul sare timp de trei secunde nu poate sa mai faca acea actiune ,doar decat cupa ce timpul trece.
F Print String este tot o functie ce are rolul de a arata un anume text pe ecran cand caracterul atinge anumite puncte sau se intampla anumite evenimente, ca de exemplu cand viata caracterului ajunge la zero functia este apelata si pe ecran o sa apara un text.
Set Game Pause fiind tot o functie aceasta dupa cum spune si numele fa pune pauza jocului cand este legata in cazul de fata de F Print String ,atunci cand F Print String este in functiune o sa trimita date la Set Game Pause urmand ca jocul sa fie pus pe pauza .
Widget: Odată ce am creat și expus Blueprint Widget, pentru a fi afișat în joc, va trebui să-l asociem folosind nodurile Create Widget și Add to Viewport în interiorul unui alt Blueprint (de exemplu Blueprint Level sau Caracter Blueprint) .
Imaginile care sunt prezente in acest joc se pot modela in diverse programe unul dintre ele fiind PhotoShop ,ele apoi fiind importate in Unreal Engine 4 aopi create modelele 3d de care este nevoie pentru jocul respectiv.
Revenind la dezvoltarea jocului in continuare am construit in Blueprintul Widget PlayerHunger care este unul dintre Hudurile jocului ,primul lucrul care l-am facut a fost acela de a umbla la culorile barilor pentru vizibilitate mai buna si estetica lor ,urmand schimbarea culori si tipului de scris ,fontul a fost importat in Unreal apoi schimbat cu cel din joc,prin adaugarea celei dea doua culori peste cea originala care se face prin intermediul tabului Style si cu ajutorul tabului Progress am reusit manual sa reduc bara de hunger,pentru functionalitatea ei in joc am apelat in tabul progres comanda Bind ,urmand sa creez un nou set in event graph unde avem o comanda Get Proccent 0 si return node , intre aceste doua am adaugat functia Get The ThirdPersonCharacter de aceasta functie din object am legat functia Get Player Caracter , in partea opusa am legat variabila PlayerHunger pentru a avea valuarea maxima si variatile care se fac in timpul desfasuraril jocului apoi din Return Node am legat functia float/float pentru ca valoare variabilei scade de la 100 la 0 si bara de progres (bara de hunger) creste de la 1 la 100 cand colecteaza resursele necesare urmand ca functia respectiva sa imparta la 100 pentru a ajunge la valuarea necesaracare la randul ei este legata de PlayerHunger
Player Hunger Widget
Dupa cum putem vedea ,chenarul punctat este ecranul care va fi aplicat peste imaginea jocului in partea stanga sus avem barile de viata , in stanga avem optiunile care le putem modifica cum am precizat mai sus in dreapta la taburi avem obiectele care le putem adauga in acest plan iar in continuare este imaginea cu functionalitatea explicata mai sus.
Functionalitate Widget
In continuare realizand aceasta parte a jocului am intrat din nou in Blueprintul third-person pentru a sterge functile f Print String deoarece cu realizarea asta nu mai este nevoie sa mi se afiseze procentajul care il am deoarece avem bara de progres care ne indica valoarea ,acum cand caracterul colecteaza suplimentele necesare bara o sa urce ,daca nu o sa le colecteze bara o sa scada pana la zero.
Pentru a da sentimentul de teama care jocurile de genu trebuie sa le aiba am transformat viziunea caracterului din una Third-person care amavuto pana acum in una first-person ,pentru inceput am intrat in Blueprint -ul Third-person facand asta pentru ca acesta contine tot ce am facut pana acum si ce e important in acest pas este camera ,camera fiind viziunea jucatorului, practic acesta este un procedeu foarte fusor de facut care consta in mutarea camerei in fata si apoi fixata pe cap apoi atasata de cap pentru a nu sta intrun singur loc, lucrul pentru care am facut asta este acela de a evita anumite probleme , aceasta ficsare salu lipire se pace din panoul de detali tabul sockets apoi atasata de o parte a corpului in cazul de fata de cap.
Pentru ca jocul sa fie mai frumos in continuare am creat un sistem de sprint si stamina,ce inseamna asta ca folosind sprint caracterul o sa alerge mai tare pentru o periada de tim ,aceasta perioada de timp este bazata pe sistemul de stamina.
Primul lucru pe care l-am facaut este adaugarea unei comenzi de pe tastatura ( Shift) pentru sprint, aceasta va avea face ca atunci cand tasta este apasata caracterul sa alerge mai tare iara dupa ce nu mai este apasata sa revina la viteza normala ,daca tasta va fi appasata in continu caracterul va ramane fara stamina si cand se va intampla din nou isi va reveni la viteza normala.o tasta pentru un joc poate fi adaugata intr-un joc poate fi adaugata prin mai multe moduri ,eu am adaugata din Project Settings deoarece imi va ramane salvata daca schimb platforma pe care va rula jocul ,in schimb cu cea de-a doua metoda aceia fiind adaugarea tastei direct in Blueprin-ul caracterului nu mi se va salva daca platforma va fi schimbata vreodata dand nastere la tot felul de probleme.
Adaugarea tastei Shift
Dupa ce am creat tasta respectiva ,o putem lega de Blueprin-ul caraterului si cam tot ce se va intampla cu aceasta tasta si aceste sisteme noi vor avea de aface cu caracterul. In interiorul Blueprintu-ul Caracter am creat cateva variabile noi,una dintre ele este PlayerStamina ,setata ca Integer pentru ca va fi o valuare numerica setata la 100 care pursi simplu va fi timpul de sprint al caracterului, urmatoarea variabila creata este una de tipul Boolean numita is sprint on ,aceasta va fi variabila prin care vom putea pune conditile si ca sa putem sti cand caracterul va folosi stamina si cand nu o va folosi, urmatorul pas este setarea eventuri-lor pentru apasarea butonului. Primul bloc este un event numit Imput Action Sprint care va avea 3 iesiri de legatura Pressed, Released si Key, urmand ca din iesirea Pressed sa ii face o verificare adica adaugarea unei conditi ( Branch) avand 3 iesiri True, False si Condition, de Condition am legat o functie integer care este mai mare sau egala decat o valuare, rolul acesteia este de a vedea daca caracterul are mai mult sau mai egal cu unu, daca are mai mult nu va face nimic ,daca va fi egala sau mai mica caracterul isi va schimba viteza automat,aceasta functie fiind legata de variabila PlayerStamina, Din Branch iesirea True am legat un bloc numit Is Sprint on ,bifand casuta din interiorul blocului ,dupa aceasta regula am adaugat o referinta a miscarii caracterului care va fi legata de regula Set Max Walk Speed cu valuarea sprintului de 1200 care va fi legata de Regula Is Sprint On. Pentru Released in principal este cam acelasi lucru numai ca la Blocul Is Sprint On casuta este deselectata iar la Set Max Speed valuarea sprintului este de 600. Putem vedea acest Event in urmatoarea imagine:
Functionalitate Shift
Ce nu este existent in poza este o functie care am adaugato in prima faza pentru verificarea functionalitati este Print String care ma ajutat sa vad daca butonul functioneaza afisand pe ecran cand butonul este apasat si cand nu mai este apasat.
Urmatorul pas este functionalitatea sistemului de stamina,care va fi creatintre Event Tick si sistemul de hunger al caracterului dupa cum putem vedea in urmatoarea imagine.
Locul unde va fi construita functionalitatea staminei
Pentru ca am sistemul Hunger dega legat de Event tick si va trebui legat si de sistemul staminei am introdus intre un nod numit Sequence care imi ofera posibilitatea de a impartii acest Event Tick pentru mai multe sisteme , incepand din cea dea doua iesire a nodului, am legat acest nod de un Branch care din iesirea Condition am legat variabila Is Sprint on , variabila de tip bool creata anterior,din iesirea true am legat o functie de amanare (Delay) , de iesirea False am legat tot o comanda de amanare setandule la 0.2 secunde, de prima functie de Delay am legat blocul Branch legand de iesirea Condition functia Integer mai mic sau egal cu o valuare, motivul pentru care am facut asta este pentru ca trebuie verificata valuarea Variabilei PlayerStamina pentru a schimba viteza caracterului aceasta functie automat va fi legata de Variabila PlayerStamina ,urmatorul pas este legarea variabilei Set Sprint On legata de iesirea True din blocul Branch care in continuare va fi legata de Set Walk Speed care va fi setata la viteza normala 600 cu referinta legata de miscarea caracterului. Pentru iesirea False din blocul Branch am legat Set player stamina care este legata de functia Integer-integer care va face posibil scaderea staminei cand sprintul este folosit,scazand cu 1 la fiecare 0.2 secunde sau depinde cum este setat timpul pe delay.
Functionalitate Stamina
Pe cea de-a doua functie de Delay am creat evenimentul de regenerare al staminei atunci cand butonul shift nu este apasat, legand de functia Delay variabila Set Player Stamina apoi de aceasta legata de functia integer+integer care ne va oferi regenerarea staminei. Blocul branch are rolul de a mentine cresterea staminei pana in valoarea 100.
Pentru afisarea staminei si cresterea si descresterea bari afisate pe ecran am construit in Blueprintul Wiget in care avem prezenta si bara de Hunger. Intre cele doua blocuri din Graful bari progresive am adaugat blocul Cast The Third Person Character putant vedea asta in urmatoarea imagine:
Invocarea Caracterului
Acest bloc ne ajuta prin crearea legaturi intre Blueprintul Caracterului si a cel Widget-ului . Din iesire numita obiect am legat functia Get Player Caracter iar de iesirea As Third Person Character am legat referinta get Player Stamina, din nodul Return iesirea Return Value am adaugat o functie float impartit la float care o sa aiba rolul de a scadea bara de progres cand sprintul este activ ,bineinteles puteam sa jolosesc si functia integer-integer dar in acest caz este mult mai buna functia Float impartit la float deoarece aceasta functie si cu numere cu virgula de exemplu 2,2 , pe cand functia integer-integer functioneaza numai cu numere intregi fara virgula, dupa ce este legata de variabila PlayerStamina mecanica din spatele afisajului a sprintului si a staminei care este in mare parte bazata pe functi integer ,pentru a fi afisata pe bara de progres este transformata intro functie float/float. Functionalitatea explicata mai sus este prezentata in imaginea de mai jos.
Functionalitatea afisarii staminei pe ecran.
Pentru urmatoarea parte a jocului am decis sa construiesc mapa,locul unde jocul si caracterul va fi plasat.putem crea foarte usor un nivel nou,o mapa nou din tabul de optiuni ,selectand file apoi optiunea create a new Level ,in continoare se va deschide o fereastra cu 3 optiuni, Default in care motorul grafic ne ofera o platforma plata pe care dezvoltatorul poate sa o modeleze com vrea ,adaugand elemente noi texturi noi sau poate sa le foloseasca pe cele incluse in Unreal Engine 4, cea de-a doua este VR-Basic in care sunt construite jocurile VR sau diverse aplicati , cea de-a treia este un nivel gol numit Empty Level in care totul este construit de la bun inceput asa cum vrea dezvoltatorul.
Crearea unui nou nivel
Eu dintre cele 3 optiuni am ales level-ul Default pentru ca acest nivel deja imi ofera o platforma pe care pot sa o modelez dupa cum doresc,luminile pe acest nivel sunt deja construite automat de program ,eu doar avand in vedere doar schimbare lumi9nilor ,asta insemnand ca va trebui sa fac in asa fel incat luminozitatea sa fie cat mai scazut pentru acest gen de joc. Inainte de crearea peisajului pot sa zic, in modul de editare am o fereastra cu mai multe optiuni cum putem vedea in poza de mai jos.
Optiuni creare nivel.
Unde putem alege cat de mare sa fie nivelul cate componente putem adauga rezolutia plus multe altele, eu am avut nevoie doar de marimea nivelului care am setato 100×100 fiind marimea optima pentru ce doresc sa dezvolt in acest nivel. Pentru inceput am modelat din terenul plat care motorul grafic mi la oferit anumite deformati care cu anumite texuri o sa arate ca niste munti.
Acest lucru l-am realizat din editorul motorului grafic sectiunea Landscape optiunea Sculpt instrumentul sculpt , pentru crearea unui lac sau o groapa trebuie folosit instrumentul de la aceasi categorie numit Erosion .
Modelarea nivelului.
Dupa cum putem vedea in dreapta imagini este terenul care este in timpul modelari iar in partea stanga avem meniul din care ne alegem uneltele forma pensulei dimensiune pensulei si densitatea acesteia. Pentru ca munti creati sa fie cat mai realistici am adaugat o noanta de eroziune prin folosirea instrumentului Erosion peste formele create,realizand aceasta noanta de eroziune prin apasare click-ului in continu peste formele create pana am ajuns la o varianta care ar arata sau arata cat mai aproape de o stanca. Mutandu-ma in tabul care se ocupa de geometria obiectelor si de crearea lor , mi-am propus sa construiesc 4 pereti care pe viitor o sa devina o casa. Am realizat asta prin adaugare unui cub din din primul tab din poza de mai sus numit Place apoi Geometry urmand adugarea unui obiect box. Din acest obiect numit box am modelat acest cub intr-un perete urmand sa il duplichez de 3 ori apoi aranjand peretii in asa fel in cat sa arate ca o camerera.
Crearea unui Obiect
In continuare am sa explic cum o sa dau culoare si cum o sa partajez culorile pe diferentele de altitudine create anterion pe acest level. Pentru a putea ajunge la colorarea level-ului am creat in fisierul Third Person Blueprint am creat un material nou pe care l-am denumit First Terrain Mat , in interiorul acestui material graficul arata in urmatorul fel.
First Terrain Mat
Avand in stanga obiectul rotund care este momentan negru deoarece nu ii este atribuita nici o culoare, dedesupt de el avem menul de optiuni care poate modifica obiectul in sine,se poate adauga culoare iar cand viitoare blocuri vor fi adaugate in graficul de evenimente vor aparea cand avem selectat un bloc optiunile acelui bloc selectat. Blocul din grafic este legatura dintre cum vor arata culorile care vor fi aplicate nivelului si modelarea in grafic a culori.
Pentru inceput am adaugat in graficul evenimentelor un nod numit Landscape Layer Blend Note care l-am conectat in blocult principal la iesirea Base color si cu acest nod creat in continuare a trebuit sa adaug mai multe Layers pentru diferitele dipuri de materiale care vor fi adaugate mai exact culorile pentru nivelul prezentat ,acestea fiind culorile pentru piatra , iarba , namol,acestea vor fi create in fereastra de optiuni a blocului Landscape Layer Blend Note ,ca blend type am ales Height Blend pentru toate cele trei Layers, numindule pe fiecare in parte cu un nume propriu, primul nulit Grass cel de-al doilea cu mud si ultimul cu rock
Adaugarea Straturilor de culoare 1
Pasul urmator este adaugarea texturi in material , texturi care le putem gasi in texturile de baza ale motorului grafic care le-am adaugat in graficul materialului printr-un bloc numit Texture Sample care apoi l-am legat de de Layer Grass si de Height Grass deoare ce primul bloc este pentru culoarea vegetatiei in principal, cea de-a doua a fost pentru mud care va da culuare pamantului ,a fost adaugata prin aceiasi modalitate si ultima adaugata la fel ca cele doua anterioare va da culoare pietrelor sau muntilor ,toate acestea trei fiind legate layer-urile care le sunt corespunzatoare. Toate aceste 3 Leyer-uri vo mai fi legate de un bloc numit Landscape Coords care ma va ajuta sa scalez marimea texturi in functie de terenul pe care este aplicata. Inainte de a incepe colorarea suprafetei nivelului in fereastra de optiuni a blucului cu numele Landscape Layer Blend Note am schimbat valoarea la optiunea Preview Weight din zero in 0,5 la fiecare layer in parte pentru aparitia culori pe globul negru din poza de mai sus ,astfel in continuare pot colora nivelul cum doresc eu. In imaginea de mai jos este prezentata partea a doua din graficul materialului folosit pentru colorarea nivelului.
Adaugarea Straturilor de culoare 2
Pentru a avea culoarea in nivel va trebui sa selectez terenul (landscape) din tabelul de obiecte al nivelului in fereastra de detali al terenului sectiunea Landscape am adaugat materialul creat precedent, facand legatura intre materialul ce contine culorile necesare pentru colorarea nivelului cu Landscapul-ul.
Adaugarea materialului in Landscape
Pentru a colora nivelult trebuie sa ne folosim de editorul grafic unde avem fereastra precizat si mai devreme cand am modelat nivelul numit landscape in care avem cele trei suboptiuni Manage, Sculpt, Paint , de cea care o sa ma folosesc evident este paint , unde o sa ne apara cele trei Layere dupa ce au fost adaugate precedent in Landscape ,dupa ce am facut toate astea am inceput sa dau culoare nivelului cum putem vedea in poza de mai jos.
Adaugarea texurilor pe teren 1
Pentru ca in prima faza culuare nu arata atat de frumos pe cat ar trebui sa arate, in continuare am sa detalizez textura aplicata ,am sa ajustez materialul pentru a scapa de stralucirea pe care o putem vedea in poza de mai sus, mai pe scurt o sa arate din ce in ce mai realistic.
Intrand in materialul creat pentru textura ca sa scap de stralucirea texturii care imi este oferita momentan, in blocul principal al materialului exista legatura numita Specular care practic este o valoare care se ocupa cu luminozitatea texturi ajutandu-ma in modificarea luminozitatii materialului, legand un bloc numit Normal Constant in care putem seta valuare luminozitati mai mic , incercand diverse valori cea mai optima pentru mine este o valuare sub unu. Pentru a detalia textura si a adauga inca un element realistic din blocul principal am legat de nodul Normal inca un bloc numit Landscape Layer Blend Note deoare ce in continuare am facut acelasi lucru ca la primul Landscape Layer Blend Note numai ca de data asta in loc de imaginea care de exemplu adaugata pentru rock , in locul ei am adaugat o imagine identica dar special facuta ca sa trimita informatie motorului grafic cum sa defineasca textura pe acel nivel cat de definita sa fie ,sa arate deformatile minore care le poate ave un munte, sau rafinitatea nisipului care se afla pe pamand, aceste obiecte se pot gasi in Unreal Engine 4 doar daca cand se creaza un proiect nou dezvoltatorul alege sa selecteze optiune include Starter content. Dupa ce am creat cele trei blocuri pe acelasi principiu ca primele trei apoi legate de acelasi bloc Landscape Coords ca primele trei blocuri, ajungand in acest punct pot sa controlez cat de detaliata poate sa fie textura aplicata doar dintr-un singur bloc acela fiind Landscape Coords dearece cum a spus si mai sus toate blocurile sunt legate de acesta. Schimband valoarea Variabilei Mapping Pan U si V pornind de la 0 poate fi modificata la alegerea dezvoltatorului in functie de cat este nevoie pentru texturile folosite intr-un proiect.
Pe langa toatea astea am mai modelat nivelul incat sa para putin mai realista de cat in prima faza a nivelului ,facand munti putin mai slefuiti de ani, un mic drum care sa strabata nivelul anumite deformati inafara de munti si toatea astea facute cu ajutorul editorului grafic.
Adaugarea Texturilor pe teren 2
Dupa cum putem vedea in imagina de mai sus avem 3 exemple de cum arata textura momentan , primul fiind poza cu tot nivelul unde nu se mai poate observa stralucirea texturii, iara in cele trei poze aplicata peste poza originala ne arata cat de detaliata poate sa arate textura de aproape .
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Programul de studii: Automatică și Informatică Aplicată [305787] (ID: 305787)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
