This shows you the differences between two versions of the page.
pjv:laboratoare:2023:07 [2023/11/20 15:50] alexandru.gradinaru |
pjv:laboratoare:2023:07 [2024/10/07 10:49] (current) alexandru.gradinaru |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Mecanici uzuale ===== | + | ===== 7. Mecanici uzuale ===== |
==== Cerinte ===== | ==== Cerinte ===== | ||
- | TBU | + | Realizati o scena in Unity in care sa includeti urmatoarele elemente: |
+ | * Un player (poate fi FPS pentru simplitate) | ||
+ | * controlabil de la tastatura si mouse | ||
+ | * are o arma in mana | ||
+ | * la click stanga pe mouse poate trage cu arma (implementat folosind un raycast) | ||
+ | * damage: 5 | ||
+ | * arma este usor animata in momentul tragerii | ||
+ | * are viata: 50 | ||
+ | * Un turn de paza: | ||
+ | * radius turn 5 (afisat in editor) | ||
+ | * damage per proiectil 20 | ||
+ | * are viata: 100 | ||
+ | * fire rate: 1 proiectil la fiecare 5s | ||
+ | * in momentul in care player-ul intra in raza, acesta se roteste cu fata spre el si incepe sa traga proiectile (bombe) intantiate | ||
==== Documentatie video ===== | ==== Documentatie video ===== | ||
- | TBU | + | |
+ | Inregistrare pe Teams | ||
Line 86: | Line 100: | ||
+ | ==== Raycasting ==== | ||
+ | |||
+ | In spatiul 3D testarea selectarii sau tintirii asupra unui obiect se face in general printr-o tehnica numita Raycasting, care presupune trasarea unei raze de la sursa (in general camera) la destinatie. Acest lucru este util atat pentru object picking (selectarea unui obiect in spatiul 3D cu mouse-ul spre exemplu) cat si pentru tintirea si lansarea de proiectile. | ||
+ | |||
+ | Desi in cazul unui FPS, lansarea de proiectile se poate face si fizic (deci instantiez un proiectil care are damage, si ii imprim o forta cu care sa se deplaseze spre o directie), in general ea se simuleaza prin trasarea unei raze si detectia coliziuniii cu aceasta, si apoi aplicarea de efecte astfel incat impactul sa para real (proiectilul in general nu este vizibil ochiului uman). | ||
+ | |||
+ | Pentru trasarea unei raze de la camera la o tinta se poate folosi functia de Raycast din pachetul de Physics oferit de Unity. Functia Raycast accepta o multitudine de variante de paramtri, in functie nevoia de utilizare, parametrii principali fiind punctul de start si directia. Un exemplu pentru o camera FPS si o tinta intr-un anumit range se poate folosi urmatoarea secventa de cod: | ||
+ | |||
+ | <code c#> | ||
+ | RaycastHit hit; | ||
+ | |||
+ | //daca am un obiect pe directia in range | ||
+ | if(Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range)) { | ||
+ | //accesez un script de damage pe targetul meu daca accesta exista | ||
+ | Enemy orc = hit.transform.GetComponent<Enemy>(); | ||
+ | if(orc!=null) { | ||
+ | orc.TakeDamage(ammount); //TakeDamage este o functie publica in scriptul de Enemy | ||
+ | | ||
+ | enemyHealthBar.SetActive(true); //pot afisa si Healthbar-ul inamicului la plasarea tintei pe acesta | ||
+ | } | ||
+ | | ||
+ | if(orc.rigidbody != null) { | ||
+ | orc.rigidbody.addForce(-hit.normal * impactForce); //adauga o forta la impact | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Asa cum se observa si in exemplul de mai sus, Racycast-urile se pot folosi in multe moduri. Cateva exemple: | ||
+ | * aplicarea unei coliziuni | ||
+ | * selectia unui obiect | ||
+ | * tintirea unui obiect | ||
+ | * actionarea unei functii din obiectul tintit | ||
+ | * si altele | ||