I et RPG skal spilleren kunne samle våben, potions og armor op og beholde dem, når spilleren skifter scene.
Vi løser det ved at oprette en global `InventoryManager` som Autoload. Den eksisterer, så længe spillet kører, og kan tilgås fra alle scener.
Opret et C#-script med navnet `InventoryManager.cs`.
using Godot; using Godot.Collections; public partial class InventoryManager : Node { public Array<Item> Items { get; private set; } = new(); public void AddItem(Item item) { if (item == null) return; Items.Add(item); GD.Print($"Samlede op: {item.Name}"); } }
Hvad sker der?
Bemærk, at `Item` er den fælles Resource-klasse fra den foregående øvelse. Både `WeaponItem` og `PotionItem` kan derfor tilføjes.
For at inventory overlever sceneskift, skal `InventoryManager` oprettes som en Autoload.
Godot opretter nu en global instans af `InventoryManager`, som ikke bliver fjernet, når en almindelig scene skiftes ud.
Du kan tilgå den fra C# med:
GetNode<InventoryManager>("/root/InventoryManager");
Opret et script med navnet `ItemPickup.cs`. Det sættes på en `Area2D`, som spilleren kan gå ind i for at samle et item op.
using Godot; public partial class ItemPickup : Area2D { [Export] public Item Data { get; set; } public override void _Ready() { _sprite = GetNode<Sprite2D>("Sprite2D"); if (item != null) { _sprite.Texture = item.Icon; } BodyEntered += OnBodyEntered; } private void OnBodyEntered(Node2D other) { if (other is Player) { var inventory = GetNode<InventoryManager>("/root/InventoryManager"); inventory.AddItem(Data); QueueFree(); } } }
Bemærk: `Player` skal svare til navnet på jeres spillers C#-klasse.
Opret følgende nodestruktur:
ItemPickup (Area2D) ├── Sprite2D └── CollisionShape2D
Du kan nu genbruge samme pickup-scene til eksempelvis `Sword.tres`, `HealthPotion.tres` og `IronArmor.tres`.
Tilføj eventuelt denne metode til `InventoryManager` for at teste indholdet:
public void PrintItems() { foreach (Item item in Items) { GD.Print(item.Name); } }
Kald metoden fra et passende sted i spillet, når du vil kontrollere inventory.
En almindelig scene bliver fjernet, når spillet skifter til en anden scene. En Autoload-instans lever derimod videre, mens spillet kører.
Inventory ligger derfor ikke i den scene, spilleren forlader, men i en global instans.