
O Simples é melhor que o Complicado!
(Acredite, eu tento!)
Sempre repito para mim mesmo que o simples supera o complicado. Li isso em algum livro — não lembro qual para citar a referência — mas a frase me marcou. Em um período caótico durante o desenvolvimento do meu projeto, precisei respirar fundo e enxergar além da confusão. Foi quase como agir feito um samurai: golpes precisos, retirando o excesso e deixando apenas o essencial. Meu código passou a ser claro, legível e objetivo.
Menos é mais. Esse virou meu norte. Comentários apenas quando realmente ajudam. Organização usando Headers e Tooltips nas variáveis. E, claro, o sempre útil #region e #endregion, que me permitiram navegar pelo código com agilidade e entender cada parte sem me perder. Esse compromisso com a simplicidade virou parte da alma do projeto.

Como funciona o sistema de salvamento do jogo?
Como funciona o sistema de salvamento do jogo?
O jogo usa um sistema próprio de salvamento estruturado em Slots, parecido com jogos clássicos de console. Cada slot guarda tudo o que o jogador faz: terrenos plantados, inventário, tempo do dia, atributos, cutscenes, construções e mais.
Para isso, utilizo um conjunto de scripts internos, entre eles o SaveSystem, que organiza pastas, cria arquivos e garante que cada dado do jogo tenha seu lugar.
Ele funciona assim:
• Quando o jogador escolhe um slot, o sistema cria automaticamente toda a estrutura de pastas necessárias (Terrenos, CutsceneManager, Inventário, Tempo etc.).
• Depois, copia os arquivos-base de dentro da Unity (Resources) para o slot, somente se ainda não existirem — isso permite que cada jogador tenha seu próprio “mundo independente”.
• Sempre que o jogo precisa gravar algo (por exemplo, um terreno plantado ou um item coletado), ele usa métodos como ObterCaminhoDoArquivo() para localizar o arquivo JSON e atualizá-lo.
• Cada arquivo salvo fica em formato JSON, permitindo inspeção e debug fáceis.
A ideia central é manter o salvamento modular: cada sistema (Terreno, Inventário, Construções, NPC etc.) salva apenas seu próprio arquivo, e o SaveManager só cuida da estrutura e do acesso.

ItensManager — o porão organizado dos itens do jogo
O ItensManager é a peça responsável por transformar o catálogo de itens (sementes, consumíveis, equipamentos) em algo que o jogo entende e usa — e ao mesmo tempo garante que esse catálogo viva dentro do sistema de saves.
O que ele faz (em poucas linhas)
- Carrega os dados dos itens (JSON) e monta dicionários rápidos para consulta em tempo de execução.
- Carrega sprites e modelos 3D apenas quando necessário, com cache para não repetir trabalho.
- Exibe informações simples para a UI: nome, descrição, valor, tempo de crescimento, prefab 3D.
- Unifica os efeitos de consumir um item (cura, buffs, incrementos permanentes) num único pacote que o Player aplica.
- Salva uma cópia desses dados no slot do jogador, garantindo que o inventário seja persistente e inspecionável como JSON.
Como funciona (fluxo simples)
- Na inicialização, tenta ler os arquivos do slot do jogador.
- Se não existir, carrega os JSONs de
Resourcese grava uma cópia no slot (assim cada jogador tem seu mundo independente). - Durante o jogo, qualquer sistema que precise de um item (UI, plantio, player) pede ao ItensManager por ID e recebe objetos simples prontos para uso.
- Ao alterar o catálogo (ex.: coletou ou modificou um item), o manager grava o JSON no caminho do slot para persistência.
Snippet ilustrativo (apenas para visão)
File.WriteAllText(SaveSystem.ObterCaminhoDoArquivo(“Consumiveis”,”consumiveis”), JsonUtility.ToJson(invC, true));
Um exemplo visual (antes → depois)
// antes.json
{ “consumiveis”: [ { “id”:”agua”, “nome”:”Água”, “cura_energia”:5 } ] }
// depois.json (após coletar “fruta”)
{ “consumiveis”: [
{ “id”:”agua”, “nome”:”Água”, “cura_energia”:5 },
{ “id”:”fruta”, “nome”:”Fruta Silvestre”, “cura_energia”:10 }
]
}
Detalhe útil para devs e curiosos
O manager faz “sanitize” nos caminhos de assets (aceita placeholders como "0", "none") e cacheia sprites/prefabs para evitar buscas repetidas em Resources. Também oferece uma API simples para obter tempos de crescimento, efeitos de consumo e modelos 3D — tudo pensado para minimizar repetição de lógica no resto do código.

Inventário — simples, previsível e sob controle
O inventário do jogo foi pensado para ser prático e confiável. Por trás da UI existe o InventarioManager: ele controla capacidade, empilhamento, slots, persistência em JSON e as ações que realmente importam durante a jogatina. Tudo pensado para que o jogador nunca fique travado por uma regra obscura — só opções úteis.
O que o jogador sente
- Espaço claro: há um limite de slots e um limite de empilhamento por item.
- Coleta previsível: ao pegar um item, o jogo tenta empilhar nas pilhas existentes e só então ocupa slots vazios. Se não houver espaço suficiente, o método que adiciona itens devolve quanto sobrou — informação usada pra acionar a UX correta.
- Persistência: o inventário é salvo automaticamente como JSON no slot do jogador, então tudo volta certinho ao recarregar o jogo.
O que acontece quando o inventário está cheio
Em vez de bloquear ou mostrar só “Inventário cheio”, o jogo abre um mini-menu simples com duas ações imediatas:
- Abrir Inventário — para o jogador reorganizar, combinar pilhas ou usar/descartar itens.
- Descartar um item — descarte rápido para liberar espaço e pegar o item recém-coletado.
Essa solução resolve 90% das situações sem criar fricção: rápida, direta e com controle do jogador.
Ferramentas que tornam isso fluido
- AdicionarItem: empilha automaticamente e preenche slots; retorna restante.
- AdicionarItemNoInventario(indiceDestino): prioriza um slot específico (útil para atalhos/drag & drop).
- OrganizarSlotsAutomaticamente: agrupa tudo por ID e recompacta as pilhas para liberar espaço.
- TransferirParaBaus / TransferirTudoParaOsBaus: move itens para contêineres próximos (baús), reduzindo a necessidade de descartar.
- TemItemCraft / RemoverItemCraft: verificação e remoção automática de materiais para receitas — ideal para oferecer um atalho “ir pro craft” no futuro.

Inventário na tela — clareza antes de tudo
O InventarioUIManager é o responsável por transformar todos aqueles números e IDs do inventário em algo que o jogador realmente entende: ícones, quantidades, slots, descrições e atalhos práticos. Ele é o tradutor visual entre o jogador e o sistema interno.
Quando o jogador aperta a tecla I ou toca no botão do inventário, é esse script que entra em ação. Ele abre o painel, pausa o movimento do personagem e mostra cada item no seu devido lugar. Nada de mistério: cada slot da UI reflete um slot real do inventário salvo no JSON.
O que o jogador vê
- Ícone do item carregado automaticamente.
- Quantidade exibida apenas quando o item tem mais de um.
- Layout organizado, sem slots “mortos” perdidos na tela.
- A barra rápida desaparece quando o inventário abre, para não poluir a visão.
É tudo automático. O jogo observa o painel o tempo todo: se outro sistema abrir ou fechar o inventário, essa UI reage sozinha, garante que o personagem pare ou volte a se mexer e que as informações apareçam no momento certo.
A experiência de passar o mouse nos itens
Quando o jogador passa o mouse sobre um item, aparece uma pequena janela descritiva — um tooltip. Esse painelzinho mostra o nome, a descrição e até o valor de venda. O legal é que ele se adapta ao tipo do item: seja recurso, consumível ou equipamento. O jogador não precisa decorar nada, o jogo informa tudo de maneira bonita e funcional.
A forma como o menu se comporta importa
Se o jogador abre o inventário enquanto digita no chat, o jogo entende e não atrapalha. Se existe um inventário de montaria aberto, o sistema fecha um para abrir outro. Se o jogador muda a resolução, o tooltip se posiciona de novo para não sair da tela. Todos esses detalhes deixam a UI viva, parecendo algo que respira junto com o jogador.
Atalhos e botões que fazem sentido
Tudo é pensado para reduzir etapas desnecessárias. Um botão transfere tudo para os baús próximos. Outro fecha o inventário sem travar o personagem. A ideia é que a tela de inventário seja uma ferramenta e não um obstáculo.
A graça desse sistema é o equilíbrio: o código é robusto e cheio de detalhes de bastidores, mas o jogador só sente algo simples, limpo e natural. Essa era justamente a meta — o jogo faz o trabalho difícil, o jogador fica com o resultado fluido.

