O MVC (Model-View-Controller) é um esquema que envolve a divisão de dados de aplicativos, interface do usuário e lógica de controle em três componentes separados, para que cada um deles possa ser modificado independentemente. O desenvolvedor
Cem Ugur Karacam compartilhou sua experiência de programação no Unity e falou brevemente sobre objetos programáveis. Apresentamos uma tradução de seu artigo publicado em dev.to.

Bem-vindo à primeira parte da minha palestra sobre a implementação do MVC no Unity usando objetos Scriptable. Neste artigo, escrevi apenas sobre o básico de trabalhar com Objetos Scriptable e, em geral, o texto será simples e claro.
Primeiro, descubra o que os desenvolvedores do Unity dizem sobre objetos Scriptable:
- Esta é uma classe que pode ser herdada para criar um objeto que não deve ser anexado a outro objeto na cena.
- O maior benefício desse objeto criado será se você o usar apenas para salvar dados.
Agora é lógico perguntar: por que objetos programáveis?
O Scriptable Objects faz parte da funcionalidade do mecanismo do Unity, portanto, esses objetos têm muitos recursos internos para trabalhar com o editor.
Gosto da abordagem usada no desenvolvimento de projetos no Unity. Você pode criar suas próprias ferramentas e personalizar facilmente aquelas instaladas por padrão. Objetos graváveis expandem significativamente seus recursos, pois permitem criar contêineres personalizados para dados e armazená-los como ativos no projeto.

A imagem acima é um exemplo de uso do objeto Scriptable no Unity. Um único arquivo .asset criado em um projeto pode conter as informações necessárias para a operação de vários sistemas e garantir a preservação de suas configurações. Se você quiser saber mais, há um excelente vídeo no YouTube com uma apresentação sobre SO (Objeto
programável ) chamada "
Derrubando a tirania MonoBehaviour em uma gloriosa revolução dos objetos programáveis ".

Outro ótimo exemplo é mostrado acima. Aqui, os objetos do jogo fazem referência a um objeto Inventory e o Save System gerencia todos eles. Esta imagem é de outra excelente palestra, “Arquitetura de jogos com objetos programáveis” (
Arquitetura de jogos com objetos programáveis ), eu recomendo a leitura.
Outro ótimo recurso é que, quando você descobrir objetos Scriptable, provavelmente não desejará usar outros formatos de armazenamento de dados, como JSON ou XML, pois o SO é o formato mais conveniente para armazenar dados no Unity.
Bem, vamos olhar para objetos Scriptable em ação.
using UnityEngine; public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff }
Nós escrevemos uma classe chamada
ItemData
e várias propriedades típicas de jogos de RPG. Em seguida, criaremos vários itens no projeto, obteremos acesso a eles a partir do script e exibiremos os valores no console. Mas primeiro, adicione uma linha importante ao nosso código.
using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff }
O atributo
CreateAssetMenu
que adicionamos antes da classe
ItemData
indica ao Unity que queremos criar arquivos .asset nos quais nossa classe será armazenada através do menu. Caso contrário, não conseguiremos fazer isso usando o botão direito do mouse ou o botão Criar na pasta do projeto.


Crie uma pasta chamada
Items
e tente criar um objeto
ItemData
nessa pasta.

Agora, escreveremos outro script chamado
Inventory
para trabalhar com o arquivo de dados.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; }
Adicione um método a ele que fornecerá informações para o console. Também executamos uma verificação para não ir além dos limites da matriz, mas fazer um loop ao redor da matriz.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } }
Atribuirei uma chamada ao nosso método à barra de espaço. Na Unity, isso é muito fácil. Graças à classe
Input
, podemos verificar no método
Update
se a tecla necessária foi pressionada.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } }
É hora de voltar ao editor do Unity. Vamos preencher nossa matriz de
inventory
com arquivos
ItemData
criados anteriormente na pasta
Items
. Mas primeiro, crie um objeto vazio na cena e adicione nosso script
Inventory
.

Agora vamos executar o projeto e testá-lo.

Isso funciona! E agora quero mostrar a você que o Objeto Scriptable pode armazenar não apenas dados, mas também métodos para trabalhar com eles. Por exemplo, vamos adicionar um método para calcular o preço na classe
ItemData
. Para mais informações, confira os documentos
aqui e
aqui .
using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; public float GetPrice() { return attack * 40; } }
Em seguida, usamos nosso novo método na classe
Inventory
.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index == inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } Debug.Log("Item price: " + inventory[index].GetPrice()); index ++; } }
Agora vamos reproduzir tudo e ver o resultado.

Exemplos deste tutorial estão no
GitHub !
A primeira parte da história chegou ao fim. No próximo artigo, falaremos sobre o uso do MVC no Unity. Mas, como já estamos familiarizados com objetos programáveis, adicionaremos alguns novos recursos para torná-lo mais legal e difícil, como fazem os verdadeiros gurus do Unity.