This shows you the differences between two versions of the page.
pjv:laboratoare:2023:12 [2023/12/18 12:06] 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 | ||
Line 38: | 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 103: | 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: |