Ekwipunek to system przechowujący przedmioty posiadane przez gracza. Może być bardzo prosty, na przykład lista nazw przedmiotów, albo rozbudowany, z ikonami, slotami, wagą, opisami, przeciąganiem myszką i przedmiotami zużywalnymi.

W tym artykule stworzymy prosty system ekwipunku w Godot 4. Będzie on pozwalał dodawać przedmioty, usuwać je oraz sprawdzać, czy gracz posiada konkretny przedmiot.
Przykładowa struktura gracza
Player (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
└── InventoryComponent (Node)
Tak jak w przypadku zdrowia i ataku, ekwipunek warto zrobić jako osobny komponent. Dzięki temu główny skrypt gracza nie będzie przeładowany dodatkowymi funkcjami.
Skrypt InventoryComponent.gd
extends Node
signal inventory_changed(items: Array[String])
var items: Array[String] = []
func add_item(item_name: String) -> void:
if item_name.is_empty():
return
items.append(item_name)
inventory_changed.emit(items)
func remove_item(item_name: String) -> void:
if not items.has(item_name):
return
items.erase(item_name)
inventory_changed.emit(items)
func has_item(item_name: String) -> bool:
return items.has(item_name)
func get_items() -> Array[String]:
return items
Co robi ten skrypt?
Tablica items przechowuje nazwy przedmiotów. Funkcja add_item() dodaje przedmiot, remove_item() usuwa go, a has_item() sprawdza, czy dany przedmiot znajduje się w ekwipunku.
Sygnał inventory_changed jest emitowany za każdym razem, gdy zawartość ekwipunku się zmieni. Dzięki temu interfejs ekwipunku może automatycznie się odświeżać.
Przykładowy przedmiot do zebrania
Utwórz scenę przedmiotu, na przykład ItemPickup.
ItemPickup (Area2D)
├── Sprite2D
└── CollisionShape2D
Do node’a ItemPickup dodaj skrypt:
extends Area2D
@export var item_name: String = “Klucz”
func _ready() -> void:
body_entered.connect(_on_body_entered)
func _on_body_entered(body: Node) -> void:
if not body.has_node(“InventoryComponent”):
return
var inventory = body.get_node("InventoryComponent")
inventory.add_item(item_name)
queue_free()
Gdy gracz wejdzie w obszar przedmiotu, przedmiot zostanie dodany do ekwipunku, a obiekt zniknie ze sceny.
Sprawdzanie, czy gracz ma klucz
Załóżmy, że w grze są drzwi, które można otworzyć tylko wtedy, gdy gracz posiada klucz. Można to sprawdzić w taki sposób:
func try_open_door(player: Node) -> void:
if not player.has_node(“InventoryComponent”):
return
var inventory = player.get_node("InventoryComponent")
if inventory.has_item("Klucz"):
print("Drzwi otwarte")
else:
print("Potrzebujesz klucza")
Prosty interfejs ekwipunku
Do wyświetlania ekwipunku można użyć na przykład VBoxContainer i dodawać do niego etykiety z nazwami przedmiotów.
InventoryUI (Control)
└── ItemListContainer (VBoxContainer)
Przykładowy skrypt interfejsu:
extends Control
@onready var item_list_container: VBoxContainer = $ItemListContainer
func update_inventory(items: Array[String]) -> void:
for child in item_list_container.get_children():
child.queue_free()
for item_name in items:
var label = Label.new()
label.text = item_name
item_list_container.add_child(label)
Jak rozbudować ekwipunek?
Prosty system oparty na nazwach jest dobry na początek, ale w większej grze warto stworzyć osobny zasób opisujący przedmiot.
ItemData (Resource)
├── name
├── description
├── icon
├── max_stack
└── item_type
Dzięki temu każdy przedmiot może mieć ikonę, opis, typ, wartość, obrażenia albo inne właściwości.
Najczęstsze błędy
- trzymanie całego ekwipunku w skrypcie gracza,
- brak sygnału informującego interfejs o zmianie ekwipunku,
- brak sprawdzania, czy przedmiot już istnieje,
- mieszanie logiki przedmiotu z logiką GUI,
- brak planu na rozbudowę systemu.
Podsumowanie
Prosty system ekwipunku w Godot 4 można stworzyć bardzo szybko. Wystarczy komponent z tablicą przedmiotów, funkcje dodawania i usuwania oraz sygnał informujący o zmianie ekwipunku. To dobra baza pod bardziej rozbudowany system przedmiotów.
