Ir para o conteúdo
ReadySpawn

Como fazer um sistema de inventário em primeira pessoa na Unity

Por Imersa Studios · Atualizado em

Faça um raycast da câmera para encontrar um item, pegue-o ao apertar uma tecla guardando-o numa lista e prendendo-o à mão do jogador, troque o item na mão com a roda do mouse e solte-o desprendendo-o e religando o Rigidbody.

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 guiaSistema de Inventário (nível de $7.99)
Aviso de coleta com nome do itemVocê adicionaIncluído
Hotbar com ícones e destaqueVocê adicionaIncluído
Teclas numéricas 1-9 e roda do mouseSó a rodaOs dois
8 itens de exemplo com ícones, cena de demoNãoIncluído
Tempo até o primeiro jogávelUma ou duas tardesMinutos

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

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.