1. Marque o que pode ser pego
Dê a cada objeto coletável um pequeno componente com nome e ícone. O inventário procura esse componente em vez de tags, então os designers não esquecem uma tag.
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class InventoryItem : MonoBehaviour
{
public string displayName = "Item";
public Sprite icon;
}2. Olhar, aviso, pegar
Lance um raio curto da câmera a cada frame. Se ele atingir um item, mostre o nome; se o jogador apertar E, guarde-o.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Inventory : MonoBehaviour
{
public Transform cam, hand;
public float reach = 2.5f;
readonly List<InventoryItem> items = new();
int selected;
void Update()
{
var kb = Keyboard.current;
if (Physics.Raycast(cam.position, cam.forward, out var hit, reach)
&& hit.collider.TryGetComponent(out InventoryItem item)
&& kb.eKey.wasPressedThisFrame)
PickUp(item);
float scroll = Mouse.current.scroll.ReadValue().y;
if (scroll != 0 && items.Count > 0)
Select((selected + (scroll > 0 ? 1 : -1) + items.Count) % items.Count);
if (kb.gKey.wasPressedThisFrame && items.Count > 0) Drop();
}
void PickUp(InventoryItem item)
{
item.GetComponent<Rigidbody>().isKinematic = true;
item.GetComponent<Collider>().enabled = false;
item.transform.SetParent(hand, false);
items.Add(item);
Select(items.Count - 1);
}
void Select(int index)
{
selected = index;
for (int i = 0; i < items.Count; i++)
items[i].gameObject.SetActive(i == selected);
}
void Drop()
{
var item = items[selected];
items.RemoveAt(selected);
item.transform.SetParent(null, true);
item.GetComponent<Collider>().enabled = true;
var rb = item.GetComponent<Rigidbody>();
rb.isKinematic = false;
rb.AddForce(cam.forward * 3f, ForceMode.VelocityChange);
if (items.Count > 0) Select(Mathf.Clamp(selected, 0, items.Count - 1));
}
}3. Adicione a interface da hotbar
Uma hotbar é uma fileira de espaços: uma Image por espaço mostrando items[i].icon e um destaque em selected. Reconstrua-a quando a lista mudar, não a cada frame. Dispare um evento C# (public event System.Action Changed;) em PickUp, Select e Drop e deixe a interface escutar.
Construir ou comprar?
| Construir com este guia | Sistema de Inventário (nível de $7.99) | |
|---|---|---|
| Aviso de coleta com nome do item | Você adiciona | Incluído |
| Hotbar com ícones e destaque | Você adiciona | Incluído |
| Teclas numéricas 1-9 e roda do mouse | Só a roda | Os dois |
| 8 itens de exemplo com ícones, cena de demo | Não | Incluído |
| Tempo até o primeiro jogável | Uma ou duas tardes | Minutos |
Se quer aprender, construa. Se quer passar para o seu jogo de verdade, o Sistema de Inventário traz isso com todo o código-fonte, para você ainda poder mudar tudo. Some o Sistema de Save e Load para manter os itens entre sessões e o Sistema de Portas para chaves que abrem portas trancadas.
Perguntas frequentes
Para definições de item (nome, ícone, atributos) compartilhadas por muitas instâncias, sim. Para pegar objetos físicos no mundo, um componente no objeto, como acima, é mais simples.
Troque Keyboard.current.eKey.wasPressedThisFrame por Input.GetKeyDown(KeyCode.E) e o scroll por Input.mouseScrollDelta.y.
Quem escreveu
Imersa Studios cria os sistemas Unity, packs low poly e guias vendidos no itch.io. O código e as técnicas daqui vêm de lançar esses produtos. Saiba mais sobre o estúdio.

