[Crisálida] Por trás dos códigos - Parte 1
Tags: gamedev, braziliandevs, unity3d
Published: 2021-10-15 01:48:40

*Gostaria de compartilhar o desenvolvimento do meu projeto pessoal, um jogo desenvolvido em Unity C#, estou usando esse projeto para me aperfeiçoar em padrões e arquitetura de software.*


##O que é o projeto?
É um jogo do gênero visual novel, com mecânicas de point n click e foco em narrativa e tomada de decisões. 

O jogo está sendo desenvolvido em Unity, por ser mais acessível e pela equipe ter mais familiaridade.

O projeto está com uma campanha no Apoi.se, pra saber mais acesse o [link](https://apoia.se/crisalida)


###Estrutura inicial
Nosso projeto está sendo estruturado grande parte usando ScritableObject.

Um ScriptableObject é um contêiner/objeto de dados que pode ser usado para salvar grandes quantidades de dados. Um dos principais casos de uso de ScriptableObject é reduzir o uso de memória do seu projeto, evitando cópias de valores.

###Vantagens
Pode ser editado em tempo de execução, facilita edições de dados (uma ótima solução Game Designers), é otimizado e possui persistência de dados.

###Motivos para ser usado
Por ser um jogo de tomada de decisões, irá existir algumas cenas de gameplay e algumas interações com objetos, o uso do ScriptableObject deixará mais pratico a personalização das cenas e objetos. 

Junto com ScriptableObject está sendo utilizado a parte de Editor da Unity, onde possibilita criar interface/janelas mais amigáveis e customizadas.

##Exemplo 
Por ter N cenas de gameplay, essas cenas sempre terão os mesmos componentes mudando apenas o conteúdo, tendo isso em mente, o jeito que arquitetei foi possuir apenas uma cena da Unity, onde terá os componentes (gameObject) necessários para montar a cena de gameplay e usar o ScriptableObject para trocar o conteúdo desses componentes. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/he6wpxnhkz1utwn4wkhj.png)

[*Parar saber mais sobre conceitos iniciais da Unity, acesse o link*](https://unity.com/pt/learn/get-started)

Esse é um ScriptableObject criado, ele é responsável por ter todas as cenas

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bmkg2ey124x812ic32uf.png)
 
Para criar é necessário que sua classe herda de *ScriptableObject*, o atributo *CreateAssetMenu* facilita na criação e personalização. 

Você pode criar funções, variáveis conforme for necessário. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yr8hc67njio3i5jab49.png) 

A forma de utilização dos ScriptableObject está sendo por referência, assim não há necessidade do ScriptableObject estar na cena. 

O script *Controller* é adicionado em um gameObject na cena da Unity, assim pode ser utilizado os dados dele para o que precisar. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxwk2sgzhscjl3poghuu.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c46b0ulq5iscowyua2gk.png)

A vantagem de fazer assim é que caso precise mudar os dados (adicionar/remover cena) não é necessário abrir uma cena da Unity, procurar o gameObject e mexer nele. 

No próximo artigo falarei mais sobre o script de Editor desse ScriptableObject.

Links de referência: 

[https://edisciplinas.usp.br/pluginfile.php/4996986/mod_resource/content/1/Introdução aos Scriptable Objects.pdf](https://edisciplinas.usp.br/pluginfile.php/4996986/mod_resource/content/1/Introdu%C3%A7%C3%A3o%20aos%20Scriptable%20Objects.pdf)

[https://www.raywenderlich.com/2826197-scriptableobject-tutorial-getting-started](https://www.raywenderlich.com/2826197-scriptableobject-tutorial-getting-started)

[https://gamedevelopertips.com/unity-scriptableobject/](https://gamedevelopertips.com/unity-scriptableobject/)

[https://unity.com/pt/how-to/architect-game-code-scriptable-objects](https://unity.com/pt/how-to/architect-game-code-scriptable-objects)

[https://youtu.be/raQ3iHhE_Kk](https://youtu.be/raQ3iHhE_Kk)

[https://www.monkeykidgc.com/2021/02/pass-parameters-with-scriptableobject-events-in-unity.html](https://www.monkeykidgc.com/2021/02/pass-parameters-with-scriptableobject-events-in-unity.html)

[https://docs.unity3d.com/Manual/class-ScriptableObject.html](https://docs.unity3d.com/Manual/class-ScriptableObject.html)