Differences

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

Link to this comparison view

pjv:laboratoare:2023:12 [2023/12/18 09:16]
alexandru.gradinaru
pjv:laboratoare:2023:12 [2024/10/07 10:49] (current)
alexandru.gradinaru
Line 1: Line 1:
-===== Sisteme UI avansate =====+===== 11. Sisteme UI avansate =====
  
 ==== Cerinte ===== ==== Cerinte =====
  
-TBU+Realizati o scena care sa contina: 
 + 
 +  * Personaj 
 +    * Controlabil 
 +    * Are un healthbar afisat 
 +    * Are cel putin 2 atribute (de ex strength si dexterity) 
 +    * Are un inventar cu obiecte 
 +      * accesibil pe tasta '​i'​ 
 +      * obiectele se pot adauga, utiliza sau elimina din inventar 
 +      * obiectele sunt de cel putin 2 tipuri:  
 +        - consumabil: de ex la apasarea pe el se poate recupera din viata personajului;​ dispare dupa consum 
 +        - echipabil: de ex la o apasare se echipeaza - cresc anumite atribute ale playerului (strength, dexterity etc.) - la o alta apasare se dezechipeaza - scad atributele definite pe item
  
  
 ==== Documentatie video ===== ==== Documentatie video =====
-TBU+ 
 +Inregistrare pe teams
  
  
 ==== Documentatie extinsa text ===== ==== Documentatie extinsa text =====
- 
  
 === Inventar === === Inventar ===
  
-Pentru a crea un sistem de inventar avem nevoie in primul rand de date atasate fiecarui obiect, cum ar fi nume, icon, atribute etc. Putem realiza acest lucru usor prin obiecte scriptabile (Scriptable Objects). Obiectele Scriptable sunt containere de date ce nu trebuie sa fie atasate la un GameObject intr-o scena. Ele pot fi salvate ca asset-uri in bibliteca proiectului ca mai apoi sa poata fi utilizate.+Pentru a crea un sistem de inventar avem nevoie in primul rand de date atasate fiecarui obiect, cum ar fi nume, icon, atribute etc. 
 + 
 +Putem realiza acest lucru usor prin obiecte scriptabile (Scriptable Objects). Obiectele Scriptable sunt containere de date ce nu trebuie sa fie atasate la un GameObject intr-o scena. Ele pot fi salvate ca asset-uri in bibliteca proiectului ca mai apoi sa poata fi utilizate
 + 
 +=== ScriptableObjects === 
 + 
 +ScriptableObject este o clasă Unity serializabilă care vă permite să stocați cantități mari de date partajate independent de instanțe de script. Utilizarea ScriptableObjects facilitează gestionarea modificărilor și depanarea. Puteți construi un nivel de comunicare flexibilă între diferitele sisteme din jocul dvs., astfel încât să fie mai ușor de gestionat să le schimbați și să le adaptați pe parcursul producției,​ precum și reutilizarea componentelor.
  
 Obiectele scriptabile se definesc prin crearea unui script ce mosteneste clasa ScriptableObject. Obiectele scriptabile se definesc prin crearea unui script ce mosteneste clasa ScriptableObject.
Line 32: Line 49:
     public Sprite icon;     public Sprite icon;
     public Vector3[] spawnPoints;​     public Vector3[] spawnPoints;​
 +    ​
 +    // Called when the item is pressed in the inventory
 + public virtual void Use ()
 + {
 + // Use the item
 + // Something may happen
 + }
 +
 + // Call this method to remove the item from inventory
 + public void RemoveFromInventory ()
 + {
 + Inventory.instance.Remove(this);​
 + }
 } }
 </​code>​ </​code>​
  
 Intrucat exista atribute implicite pentru un obiect scriptabil (e.g. name), putem folosi variabile diferite (e.g. objectName) sau putem suprascrie definirea acestui atribut prin folosirea metodei ''​new''​ (new public string name). Intrucat exista atribute implicite pentru un obiect scriptabil (e.g. name), putem folosi variabile diferite (e.g. objectName) sau putem suprascrie definirea acestui atribut prin folosirea metodei ''​new''​ (new public string name).
 +
 +Mai mult, putem crea obiecte cu actiuni specifice: de ex obiect consumabil sau echipabil.
 +
 +<code c#>
 +
 +using UnityEngine;​
 +
 +/* An Item that can be consumed. So far that just means regaining health */
 +
 +[CreateAssetMenu(fileName = "New Item", menuName = "​Inventory/​Consumable"​)]
 +public class Consumable : Item {
 +
 + public int healthGain;​ //​ How much health?
 +
 + // This is called when pressed in the inventory
 + public override void Use()
 + {
 + // Heal the player
 + PlayerStats playerStats = Player.instance.playerStats;​
 + playerStats.Heal(healthGain);​
 +
 + Debug.Log(name + " consumed!"​);​
 +
 + RemoveFromInventory();​ //​ Remove the item after use
 + }
 +
 +}
 +
 +</​code>​
  
 Mai departe, pentru un inventar vom avea nevoie de o lista de obiecte gestionabile. Pentru acest lucru vom face un script de gestiune pentru inventar (e.g InventoryManager) care gestioneaza adaugarea, eliminarea si interogarea inventarului. Pentru o accesare mai usoara si mai facila, ideal ar fi ca acest inventorymanager sa fie un Singleton. Pentru a avea un singleton trebuie sa ne asiguram ca avem o singura instanta creata pentru acest script atunci cand e accesat. Mai departe, pentru un inventar vom avea nevoie de o lista de obiecte gestionabile. Pentru acest lucru vom face un script de gestiune pentru inventar (e.g InventoryManager) care gestioneaza adaugarea, eliminarea si interogarea inventarului. Pentru o accesare mai usoara si mai facila, ideal ar fi ca acest inventorymanager sa fie un Singleton. Pentru a avea un singleton trebuie sa ne asiguram ca avem o singura instanta creata pentru acest script atunci cand e accesat.
Line 97: Line 156:
  
 Pentru sloturile de inventar este indicat sa folositi un prefab sau un template. Pentru sloturile de inventar este indicat sa folositi un prefab sau un template.
 +
 +<code c#>
 +
 +public class InventorySlot : MonoBehaviour {
 +
 + public Image icon;
 + public Button removeButton;​
 +
 + Item item; // Current item in the slot
 +
 + // Add item to the slot
 + public void AddItem (Item newItem)
 + {
 + item = newItem;
 +
 + icon.sprite = item.icon;
 + icon.enabled = true;
 + removeButton.interactable = true;
 + }
 +
 + // Clear the slot
 + public void ClearSlot ()
 + {
 + item = null;
 +
 + icon.sprite = null;
 + icon.enabled = false;
 + removeButton.interactable = false;
 + }
 +
 + // If the remove button is pressed, this function will be called.
 + public void RemoveItemFromInventory ()
 + {
 + Inventory.instance.Remove(item);​
 + }
 +
 + // Use the item
 + public void UseItem ()
 + {
 + if (item != null)
 + {
 + item.Use();​
 + }
 + }
 +
 +}
 +
 +</​code>​
  
 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: 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:
pjv/laboratoare/2023/12.1702883790.txt.gz · Last modified: 2023/12/18 09:16 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