Blog arme de foc vadakuma în udk

intrare

Astăzi vom vorbi despre cunoștințele și setările de bază referitoare la crearea armelor.
UDN armament Ghid Tehnic de sistem (pe care eu numesc WSTG) ne oferă câteva idei: cum comutator mecanism de arme, modul în care unitatea responsabilă de regimul de foc (chiar și într-o rețea), ceea ce este diferența dintre funcțiile din clasa de arme și subclasele sale.

Pagina Configurarea armelor ne spune cum să simulam și să importăm arme și ce cod să scriem. pentru UTWeapons.

Și totuși, după ce am citit toate acestea, încă nu știm câteva lucruri:

• Cum să adăugați arme la inventarul standard.
• Stabiliți diferite tipuri de fotografii pentru arme.
• Ce funcții trebuie rescrise pentru a controla anumite caracteristici ale armei.
• Cum funcționează sistemul de avarii.

Vorbind despre sistemul daunelor, cred că acest subiect merită un manual separat (împreună cu armele de foc), așa că nu voi atinge această problemă aici.

Punct de plecare: inventarulManager

Notă. InventoryManager este legat de Pion. nu pe PlayerController.

Un alt lucru important trebuie să știți despre clasa InventoryManager. Este că ține doar evidența stării actuale a armelor: valorile PendingFire. despre care citim în WSTG. Deși această matrice nu este inițializată în InventoryManager. Cu alte cuvinte, baza nu permite InventoryManager trage cu ea (să ne facă haz de erori dacă încercați să faceți acest lucru) inventar .po clasă implicit UDKPawn ruleaza doar InventoryManager. așa că avem nevoie pentru a crea o subclasă a acesteia din urmă, pentru a afla cum de a trage.


Și aici este. Krutatenyushka. Mai întâi adăugați PendingFire la fel de mult ca și cum doriți modurile de împușcare din joc. Dacă nu doriți un tip alternativ de fotografiere, puteți uita despre a doua celulă a matricei. Și dacă vrei mai mult de două fotografii alternative, bine, poți să faci cât ai nevoie.

Pr. interpret. PendingFire - matrice care conține numărul și starea de moduri alternative de ardere ale aceleași arme. De exemplu, PendingFire (0) = 0 înseamnă că arma nu se aprinde, PendingFire (0) = 1 - arma ognya.Po mod implicit, focurile de armă de foc mod (mod) 0 activate de vopsea, și modul de fotografiere (modul de foc) 1 , pe PCM.

După cum am menționat mai devreme, InventoryManager este asociat cu pionul. așa că trebuie să-i spunem pionului să folosească propriul InventoryManager:

Noi facem arme (scripturi)

Putem crea propriile noastre arme în două moduri: în primul rând, putem să scriem mai întâi comportamentul armelor (efecte împușcate, cochilii) și numai atunci să facem o apariție. Exemplul armei fizice demonstrează că arma nu are nevoie de un model, pentru a funcționa pe deplin. De exemplu, creați un pistol de paintball.


Pasul 0: câteva sfaturi despre instalarea armelor


• FiringStatesArray (array): specificat după nume. Ceea ce spune despre starea de arme în mâini și modul de foc. Implicit nu este utilizat. Puteți să atribuiți orice valoare doriți, dacă nu doriți să reinventați roata. (Traducător: acest parametru nu mai există în scripturi)

• WeaponFireType (matrice): setat prin EWeaponFireType. Spune ce tip de armă aparține. O să ajungem mai târziu.

• WeaponProjectiles (matrice). este dat printr-o subclasă de cochilii. Dacă modul de foc adecvat este setat pentru fotografii de anumite proiectile, trebuie să știți ce tip de proiectile ar trebui să fie numit pentru această armă.

• FireInterval (matrice): setat prin float. Indică cât timp durează o fotografie în acest mod de incendiu. Cu alte cuvinte - rata focului.

• Spread (matrice): setează eroarea în direcția tragerii (ca și cum "scatter"). În caz contrar, toate gloanțele (cochilii) vor acoperi întotdeauna exact la țintă. Ceea ce nu este credibil.

• WeaponRange. este dată de un flotor. Definește distanța maximă, distrugerea, durata de viață a proiectilului. Rețineți că această valoare este comună tuturor modurilor de foc.


Pasul 0.5. adăugați armele noastre la inventar

Vom face acest lucru astfel încât să fie ușor să urmăriți esența implementării codului.
Când se repornește playerul (adică începutul jocului, repornirea jocului, inversarea jucătorului), clasa de Pawn este creată de GameInfo și atașată la PlayerController. și GameInfo apelează funcția AddDefaultInventory. luând un nou Pion ca parametru.
În mod prestabilit, nimic nu se face decât prin apelarea funcției AddDefaultInventory din clasa de pion. Și acest lucru este bun din mai multe motive. Cu toate acestea, există o clasă de bază a jocului. Și cel mai probabil veți avea o altă subclasă din clasa de pion (pentru caracter). AddDefaultInventory din clasa GameInfo poate fi suprascris dacă aveți parametri comuni, setări pentru toate clasele (de exemplu, pentru un cuțit).

Deci, în propria clasă de pion, rescriem funcția AddDefaultInventory ca aceasta.

E simplu. Funcția are un al doilea parametru opțional, dacă valoarea sa este TRUE, atunci echipamentul de armament imediat va fi împiedicat. Acum, dacă vom începe jocul, nu vom vedea nimic, deoarece arma nu are propriile sale plasă. Și totuși, dacă scrieți o comandă magică "arma showdown" în consola. vedem următoarele în colțul din stânga sus al ecranului:

Blog arme de foc vadakuma în udk

Partea verde a textului ne spune despre armele pe care jucătorul le deține acum și confirmă faptul că pistolul nostru este gata de utilizare!

Luați în considerare unitatea WeaponFiring. în funcția BeginState, numim FireAmmunition. apoi încă TimeWeaponFiring. care va determina o întârziere în focul modului de incendiu corespunzător, determinat în matricea FireInterval. Dacă dintr-un motiv oarecare, aveți nevoie de o întârziere în fotografierea la fotografiere, rescrierea acestei părți a funcției va fi decizia corectă.

Când timpul alocat sa terminat, RefireCheckTimer va funcționa. El verifică două lucruri:

1. Echipa a oprit arma. Dacă da, comanda este executată.
2. Dacă nu există comenzi pentru oprirea armei, este apelată cererea pentru funcția ShouldRefire. Dacă TRUE este returnat, FireAmmunition este apelat imediat fără a ieși din bloc.


Dacă nu se întâmplă nimic din cele de mai sus, înseamnă că am oprit fotografierea, așa că este chemat HandleFinishedFiring. care implicit comută controlul armelor la unitatea activă.


Atenție, vă rog. Așa cum ați fi observat, prima fotografie (sau apelul FireAmmunition) funcționează într-un mod ușor diferit de fotografiile ulterioare. Deci, dacă trebuie să prescrieți o acțiune care să funcționeze înainte de împușcare, este mai bine să faceți acest lucru în interiorul funcției FireAmmunition. dar nu în BeginState.


Funcția ShouldRefire verifică dacă există muniție din armă (funcția HasAmmo întoarce întotdeauna TRUE în mod implicit), dacă tot doriți să fotografiați. (Funcția StillFiring în mod implicit returnează valoarea funcției PendingFire).
WSTG ne arată corpul funcției FireAmmunition (vechea versiune UTWeapon. Deși toate ideile de bază sunt păstrate și acolo). La început, se utilizează muniția (nu se întâmplă nimic implicit) și apoi se determină modul de foc, după care, în funcție de mod, se apelează diferite funcții.
Cu alte cuvinte, modul de incendiu instalat pe arma, mai mult sau mai puțin, spune cu ce funcții ar trebui să lucrăm:

EWFT_InstantHit. InstantFire () Flashy Fire
EWFT_Projectile. ProjectileFire () Fire shells
EWFT_Custom. CustomFire ​​() Ceva de casă

Înainte de a continua, să stabilim un regim specific de foc în armele noastre.

Foc rapid (incendiu instant)

Toate acestea ne dau următorul rezultat:

În plus, dacă observați, în mod implicit, arma rezultată se află în modul "complet automat". Și dacă aveți nevoie de un singur mod de fotografiere (trebuie să apăsați butonul de fiecare dată când trebuie să fotografiați)?
Ei bine, lasa-ti temele! Câteva sugestii:

- PendingFire se resetează numai când are loc un apel StopFire
- În mod implicit, StillFiring presupune că PendingFire are o valoare TRUE, deci arma trebuie să continue să se declanșeze.


Pasul 2: Afișați armele

Avem o armă de lucru, este timpul să o formăm. Pentru aceasta, trebuie să facem două lucruri: adăugați o plasă de arme și plasați-o în locul potrivit. După cum era de așteptat, există o diferență între tipul de armă de la un terț și de la primul. Vom face tot ce este necesar pentru ambele specii. Dar mai întâi, să prescrie ceea ce este necesar pentru fiecare situație: atașăm la arme modelul său:

Eu folosesc, de exemplu, plasă de legătură Gun. În general, se folosesc diferite tipuri de modele ale aceleiași arme, în funcție de tipul de cameră din joc. Dacă te uiți la Arma din Editorul AnimSet, vei observa că este mutat în lateral. Cel mai probabil aceasta este o deplasare preliminară, pentru poziționarea adecvată a armei.

Un fel de arme cu o camera de la prima persoana. (Perspectiva persoanei întâi)

Clasa UDKWeapon are funcția SetPosition. se numeste la fiecare desen ulterior al cadrului. În mod implicit, nu face nimic, dar poate fi rescris astfel încât a plasat modelul arma la locul potrivit, în imaginea de modul în care aceeași funcție, numai UTPawn. O decizie oarecum nepoliticoasă, dar se confruntă cu sarcina sa.


Dacă ați citit tutorialele camerei mele, probabil ați înțeles ce am făcut aici. Din anumite motive, sunt necesare apeluri către SetHidden (false) și SetBase. Asta se întâmplă ca rezultat.

Tipul de arme cu aparatul de fotografiat terț (Perspectiva a treia persoană)

Dar acest lucru este mult mai ușor. Și nu necesită cunoașterea geometriei spațiale. ) Trebuie doar să atașăm modelul armei la mufa corespunzătoare.
Pentru a face acest lucru, trebuie să utilizați funcția AttacWeaponTo din clasa UDKWeapon. care va atașa SkeletalMeshComponent la soclul corespunzător. Dar, în realitate, această funcție nu este chemată (probabil pentru că nu știe unde să atașeze arma). Un tur rapid al clasei UTWeapon ne-a arătat că toate acestea trebuie făcute în TimeWeaponEquipping. că, în general, are sens. Rescriem aceste funcții:


Nu este așa de simplu? Dar rezultatul eforturilor noastre:

Cu toate acestea, am adăugat doar arme jucătorului, nu am atins niciun set de armă în sine (cum ar fi locația armei), ceea ce poate duce la unele probleme, de exemplu, atunci când este împușcată o cochilie. Aceasta înseamnă că trebuie să facem ceva în funcția SetPosition ().

Articole similare