This shows you the differences between two versions of the page.
|
pjv:laboratoare:2023:12 [2023/12/18 15:51] 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 ===== | ||
| Line 13: | Line 13: | ||
| * obiectele se pot adauga, utiliza sau elimina din inventar | * obiectele se pot adauga, utiliza sau elimina din inventar | ||
| * obiectele sunt de cel putin 2 tipuri: | * obiectele sunt de cel putin 2 tipuri: | ||
| - | - consumabil: de ex la apasarea pe el se poate recupera din viata personajului | + | - 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 | - 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 49: | 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 114: | 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: | ||