Differences

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

Link to this comparison view

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:
pjv/laboratoare/2023/12.1702907505.txt.gz ยท Last modified: 2023/12/18 15:51 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