Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pjv:laboratoare:06 [2018/12/12 11:17]
alexandru.gradinaru [Interactiunea cu obiectele]
pjv:laboratoare:06 [2019/10/02 12:59] (current)
alexandru.gradinaru [Cerinte]
Line 5: Line 5:
 === NavMesh === === NavMesh ===
  
-Pentru navigarea ​personajelor ​automata pana la un punct pe harta, indiferent ca e vorba de un personaj controlat sau un agent inteligent, avem nevoie in primul rand de generarea unor zone in care acestea sa se poata misca. Aceste zone poarta numele de Navigation Mesh sau NavMesh, prescurtat. In Unity se pot genera automat acest NavMesh folosind utilitarul de Navigation Bake: Window > AI > Navigation > Bake.+Pentru navigarea automata ​a personajelor ​pana la un punct pe harta, indiferent ca e vorba de un personaj controlat sau un agent inteligent, avem nevoie in primul rand de generarea unor zone in care acestea sa se poata misca. Aceste zone poarta numele de Navigation Mesh sau NavMesh, prescurtat. In Unity se pot genera automat acest NavMesh folosind utilitarul de Navigation Bake: Window > AI > Navigation > Bake.
  
 {{ :​pjv:​laboratoare:​bakenavmesh.png?​direct&​300 |}} {{ :​pjv:​laboratoare:​bakenavmesh.png?​direct&​300 |}}
Line 108: Line 108:
  
  
-==== Animatia ​personajelor ​====+==== Animatia ​caracterelor ​====
  
-<​hidden>​ +Animatia caracterelor 3D, se face similar ca in 2D, fiind utilizata animatia bazata pe oase. Astfel, fiecare caracter 3D are definite oase (bones) care controleaza miscarea si animatia acestuia.
-- animatii cu blend tree+
  
 +{{ :​pjv:​laboratoare:​humanoid_bones.png?​direct&​600 |}}
  
-</hidden>+Crearea animatiilor se poate face folosind utilitarul de animatie (Window > Animation), similar ca in spatiul 2D. Similar, se poate folosi Animator Controller pentru a gestiona starile. 
 + 
 +Ca notiune suplimentara,​ se pot defini stari de tranzitie/interpolare intre anumite animatii. Un exemplu comun este trecerea sau ajustarea animatiei de walk si run in functie de viteza curenta a personajului,​ sau a animatie de alergare stanga - fata - dreapta (daca sunt definite animatii diferite). Acest lucru se poate realiza folosind ''​BlendTrees''​ (Create State From New Blend Tree). 
 + 
 +{{ :​pjv:​laboratoare:​mecanimblendtreestatediagramcombined.png?​direct&​600 |}}
  
 ==== Interactiunea cu obiectele ==== ==== Interactiunea cu obiectele ====
Line 197: Line 201:
     public bool colorIsRandom = false;     public bool colorIsRandom = false;
     public Color thisColor = Color.white;​     public Color thisColor = Color.white;​
 +    public Sprite icon;
     public Vector3[] spawnPoints;​     public Vector3[] spawnPoints;​
 } }
Line 219: Line 224:
   //metode pentru gestionare   //metode pentru gestionare
   public void Add(Item item) {   public void Add(Item item) {
-    ​item.Add(item);+    ​items.Add(item);
   }   }
   ​   ​
   public void Remove(Item item) {   public void Remove(Item item) {
-    ​item.Remove(item);​+    ​items.Remove(item);​
   }   }
  
Line 233: Line 238:
 Inventory.instance.Add(item);​ Inventory.instance.Add(item);​
 Inventory.instance.Remove(item);​ Inventory.instance.Remove(item);​
-etc. 
 </​code>​ </​code>​
  
-<​hidden>​sistem inventar</​hidden>​+Inca un element util in gestionarea inventarului este definirea unei metode de a notifica atunci cand s-a produs o modificare in inventar. Pentru acest lucru putem folosi ''​Delegates''​. Un Delegate este un pointer la o metode. Aceasta ne permite sa tratam metoda ca o variabila și sa o folosim pentru un callback. Cand este apelata, acesta notifica toate metodele care fac referire la delegate. Astfel putem definit o variabila pentru evenimentul de schimbare. 
 +<​code>​ 
 +  public delegate void OnInventoryChanged();​ 
 +  public OnInventoryChanged onInventoryChangedCallback;​ 
 +   
 + //​metode pentru gestionare 
 +  public void Add(Item item) { 
 +    ... 
 +    onInventoryChangedCallback.Invoke();​ //notifica despre modificare 
 +  } 
 +   
 +  public void Remove(Item item) { 
 +    ... 
 +    onInventoryChangedCallback.Invoke();​ //notifica despre ​ modificare 
 +  } 
 +</​code>​ 
 +Urmatorul pas este crearea unei interfete grafice si legarea interfetei de functionalitatea InventoryManger-ului. 
 +Pentru interfata grafica, putem folosi, ca si pana acum, canvas-ul oferit de Unity, structurat astfel incat sa avem un panou general pentru inventar, si mai multe slot-uri pentru obiectele din acesta. Pe fiecare slot putem defini urmatoarele aspecte: 
 +  * un gameobject 
 +  * un buton de accesare : pentru folosirea obiectului, echipare etc. 
 +  * un buton de eliminare : pentru eliminarea din inventar 
 +  * o imagine: icon pentru obiectul in inventar 
 +  * script de gestionare: pentru fiecare slot putem avea un script de gestionare care va actualiza interfata slotului respectiv (nume, icon etc). 
 + 
 +Interfata grafica a inventarului are nevoie si de un script de gestionare. Astfel vom aveam un script care asculta (subscribe) evenimentul definit (''​delegate''​) la actualizarea inventarului,​ si actualizeaza fiecare slot din interfata grafica: 
 + 
 +<​code>​ 
 +void Start() { 
 +  inventory = Inventory.instance;​ 
 +  inventory.onInventoryChangedCallback += UpdateUI; //definesc o metoda ca se apeleaza la aparitia unui eveniment delegat 
 +   
 +  slots = GetComponentsInChildren<​InventorySlot>​();​ //fiecare slot din inventar 
 +
 + 
 +void UpdateUI() { 
 +   
 +  //​actualizare fiecare slot 
 +  for(i=0; i < slots.Length;​ i++) 
 +  { 
 +    if(i<​iventory.items.Count) slots[i].AddItem(..) 
 +    else slots[i].RemoveItem(..) 
 +  }  
 + 
 +
 +</​code>​ 
 + 
 +<​hidden>​sistem inventar 
 + 
 +Bineinteles,​ in inventar se pot pune diferse restrictii si interactiuni (cum ar fi dimensiunea maxima a inventarului) 
 +<​code>​ 
 +bool AddItem() { 
 + 
 +if(items.Count >= space) 
 +//no more room 
 +return false 
 + 
 +else return true; 
 +
 + 
 +if(Inventory.instance.Add(item)) Destroy(gameObject);​ 
 +</​code>​ 
 +</​hidden>​
  
 ==== Cerinte ==== ==== Cerinte ====
  
-Realizarea unui joc 3D RPG+Realizarea unui joc 3D Top-Down
  
   - Configurati scena pentru rulare 3D   - Configurati scena pentru rulare 3D
-  - Adaugati in scena un caracter ​TPS animat (puteti lua resurse din asset store sau alte locuri: [[pjv:​resurse|]]) astfel incat: +  - Adaugati in scena un caracter animat (puteti lua resurse din asset store sau alte locuri: [[pjv:​resurse|]]) astfel incat: 
-      - camera urmareste caracterul ​3rd person+      - camera urmareste caracterul ​de sus
       - se va deplasa prin click mouse-ul la o locatie pe harta;       - se va deplasa prin click mouse-ul la o locatie pe harta;
       - poate lua obiecte in inventar       - poate lua obiecte in inventar
       - poate arunca obiecte din inventar ​       - poate arunca obiecte din inventar ​
   - Adaugati mai multe tipuri de obiecte interactionabile in scena   - Adaugati mai multe tipuri de obiecte interactionabile in scena
-      
- 
- 
pjv/laboratoare/06.1544606234.txt.gz · Last modified: 2018/12/12 11:17 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0