← Forrige: Vis spillerens inventory | Forside | Næste: Opsamling og udvidelser →
Nu kommer belønningen for adskillelsen af data og UI: Du giver en kiste et inventory og viser det ved siden af spillerens, uden at skrive ny inventory-logik.
Alt, hvad en ejer skal gøre, er:
Inventory-node som barn.Slot Count i Inspector.Spilleren gør netop det. Kisten gør det samme.
Chest.Inventory-node som barn, som du gjorde med spilleren.Scenes/Chest.tscn.Inventory, og sæt Start Items til tre af dine items, helst nogle andre end spillerens.Træet skal se sådan ud:
Chest (Node) └── Inventory (Inventory)
Højreklik på Chest, vælg Attach Script, og sæt stien til Scripts/Game/Chest.cs. Erstat indholdet med:
using Godot; // Kisten er en anden ejer af præcis samme Inventory-komponent. public partial class Chest : Node { public Inventory Inventory { get; private set; } public override void _Ready() { Inventory = GetNode<Inventory>("Inventory"); } }
Koden er næsten identisk med Player.cs. Det er helt i orden: En spiller og en kiste er to forskellige slags ejere, som senere kan få hver sin opførsel (spilleren kan bevæge sig, og kisten kan åbnes), mens inventory-delen er den samme. Hvis du vil undgå gentagelsen, kan du senere lave en fælles basisklasse. Det gør vi ikke her for at holde det enkelt.
Åbn Main.tscn:
Scenes/Chest.tscn ind på Main. Den hedder nu Chest.Scenes/InventoryUI.tscn ind på HBoxContainer, så den står ved siden af PlayerInventoryUI. Omdøb den til ChestInventoryUI.ChestInventoryUI, og vælg Access as Unique Name.Træet skal nu se sådan ud:
Main (Node)
├── Player (Player.tscn)
├── Chest (Chest.tscn)
└── UI (CanvasLayer)
└── CenterContainer
└── HBoxContainer
├── %PlayerInventoryUI (InventoryUI.tscn)
└── %ChestInventoryUI (InventoryUI.tscn)
Opdater Main.cs:
using Godot; // Main samler det hele: den fortæller hvert UI, hvilket inventory det skal vise. public partial class Main : Node { public override void _Ready() { Player player = GetNode<Player>("Player"); Chest chest = GetNode<Chest>("Chest"); // "%" finder en node med "Access as Unique Name", uanset hvor den ligger i scenen. InventoryUI playerUi = GetNode<InventoryUI>("%PlayerInventoryUI"); InventoryUI chestUi = GetNode<InventoryUI>("%ChestInventoryUI"); // Samme UI-scene, to forskellige inventories. playerUi.SetInventory(player.Inventory); chestUi.SetInventory(chest.Inventory); } }
Der er ikke ændret noget i Inventory, InventoryUI eller SlotUI. Vi har kun tilføjet en ejer og en ekstra instans af den samme UI-scene.
Tryk på Build og Run Project (F5). Du ser to 3×3 inventories ved siden af hinanden. Det venstre viser spillerens items, og det højre viser kistens.
Inventory ved ikke, hvem der ejer den. Den holder bare slots. Det er derfor, den kan sidde under både en spiller og en kiste.InventoryUI ved ikke, hvilket inventory den viser, før SetInventory kaldes. Hver instans får sin egen reference og sine egne slots.
Skal en fjende, en butik eller en skuffe også have et inventory, gør du det samme: en node med en Inventory som barn, og et UI, der får inventoryet at vide.
Chest.tscn en ekstra gang i Main, og tænk over, hvad der skal til for at vise den. (Svar: endnu en InventoryUI og endnu et kald til SetInventory.)Inventory, InventoryUI eller SlotUI.