Transcription

Introdução aos ScriptableObjectsLeonardo Tórtoro Pereira ([email protected])1

Este material é uma criação doTime de Ensino de Desenvolvimento de JogosEletrônicos (TEDJE)Filiado ao grupo de cultura e extensãoFellowship of the Game (FoG), vinculado aoICMC - USPEste material possui licença CC By-SA. Mais informações legalcode2

Objetivos Definir scriptable objectsMostrar suas principais vantagens e desvantagensApresentar algumas de suas principais utilidadesApresentar exemplos práticos

O que é ScriptableObjects?

Scriptable Objects - É de comer? Não Mas dá pra colocar as propriedades da comida doseu jogo :) É uma classe serializável da Unity Armazena grandes quantidades de dados compartilhadosindependentemente das instâncias de script Pode ser salva como .asset

Scriptable Objects - Onde usar? Arquivos de configuração de jogoInventáriosAtributos de InimigosColeção de Áudio

Scriptable Objects - Como usar? Variáveis Eventos Sistemas

Scriptable Objects - Por que usar? Facilita gerenciamento de alterações e depuraçãoComunicação flexível entre diferentes sistemas do jogoMais fácil de adaptar e alterar, e reutilizar componentesPode ser uma boa substituição a singletons

Singletons?

Singletons?void Awake(){if (instance null){instance this;DontDestroyOnLoad(gameObject);audioSrc GetComponent AudioSource ();.}else if (instance ! this){Destroy(gameObject);}}

Singletons? Em algum outro ap.startX, map.startY);Player.instance.SetRoom(map.startX, map.startY);

Singletons - Vantagens É fácil de fazerAcessa qualquer coisa importante em qualquer classeEstado persistente (resiste a mudança de cenas)Fácil de entenderPadrão consistenteFácil de planejar*Só funciona bem pra projetos bem pequenos e quevocê não vai mais mudar depois de pronto

Singletons - Desvantagens Conexões “rígidas” Não é modular Não aceita polimorfismo Não é “testável” Pesadelo de dependências Desista de paralelizar Uma única instância

Lembra disso? Em algum outro ap.startX, map.startY);Player.instance.SetRoom(map.startX, map.startY);

Lembra disso? Em algum outro ap.startX, map.startY);Player.instance.SetRoom(map.startX, map.startY); Estava dentro de outro Singleton.

Gerenciadores Singletons - Objetivos Rastrear todos os inimigos de uma cena Entender o jogador Enviar comandos

Gerenciadores Singletons - Problemas Race Conditions Problemas de null reference e de paralelismo Singleton rígido Difícil de testar Só 1 (ou muitos )

Voltando aos SOs

Scriptable Objects - Como usar? Variáveis Eventos Sistemas

Scriptable Objects - Variáveis[CreateAssetMenu]public class FloatVariable : ScriptableObject{public float Value;}public void SetValue(float value){Value value;}.public void ApplyChange(float amount){Value amount;}

Scriptable Objects - Variáveis Vida Dano Dados de tempo

Scriptable Objects - Variáveispublic class DamageDealer : MonoBehaviour{public FloatVariable DamageAmount;}

Scriptable Objects - with-scriptable-objects

Demo - : HP 1

Scriptable Objects - Como usar? Variáveis Eventos Sistemas

Scriptable Objects - Eventos Modularizam sistemas Reúso em outros projetos Isola prefabs Responde a um evento, não importa de onde vem Só executa quando precisa Não precisa ficar com “ifs” checando variável Fácil de debuggar (se você sabe bem)

Scriptable Objects - Eventoshttps://www.youtube.com/watch?v raQ3iHhE Kk

Scriptable Objects - Eventos Pode colocar no editor Menos código, não precisa assumir que o código está emalgum componente específico Pode passar argumentos Extend UnityEvent T Estáticos ou Dinâmicos

Scriptable Objects - Eventos Problemas Ligações rígidas Botão precisa de referência “hard” do que eleresponde Serialização limitada Alocação de lixo Não criar evento chamado todo frame

Scriptable Objects - Eventospublic class GameEvent : ScriptableObject{private readonly List GameEventListener eventListeners new List GameEventListener ();}public void Raise(){for(int i eventListeners.Count -1; i 0; i--)eventListeners[i].OnEventRaised();}public void RegisterListener(GameEventListener listener){if .Add(listener);}public void UnregisterListener(GameEventListener listener).

Scriptable Objects - Eventospublic class GameEventListener : MonoBehaviour{public GameEvent Event; //Pode ser referenciadopublic UnityEvent Response; //Serializa a chamada de função como respostaprivate void OnEnable(){ Event.RegisterListener(this);}private void OnDisable(){ Event.UnregisterListener(this);}}public void OnEventRaised(){Response.Invoke();}

Demo - : HP 2*********

Extras

Scriptable Objects - Runtime Sets Solucionar problema de gerenciadores singletonsRuntime SetsManter controle de uma lista de objetos na cenaEvita race conditionsMais flexível que tags da Unity e singleton

Scriptable Objects - Runtime Setspublic abstract class RuntimeSet T : ScriptableObject{public List T Items new List T ();public void Add(T thing){if (!Items.Contains(thing))Items.Add(thing);}}public void Remove(T thing){if (Items.Contains(thing))Items.Remove(thing);}

Scriptable Objects - Runtime Sets Um sistema que sabe todas as entidades de um RTS Unidades, construções Pode adicionar um novo conjunto no fim do projeto Renderizadores para efeitos especiais Script de renderização precisa saber de todos osefeitos Câmera lia todos os itens de renderização adicionados Itens em um mapa

Demo - : Sets

Scriptable Objects - Enums Precisa mudar no código Difícil de remover/reordenar Não podem ter dados adicionais

Demo - : Elements

Voltando ao trio.

Scriptable Objects - Como usar? Variáveis Eventos Sistemas

Scriptable Objects - Sistemas SOs podem ter funções dentro Não é muito comum. Mas não é errado! Sistema é um Asset de SO no projeto Referência direta com o inspetor Não precisa procurar coisas em código Sem referências que só existem na cena Como AudioMixer/AudioMixerGroup

Scriptable Objects - Sistemashttps://www.youtube.com/watch?v raQ3iHhE Kk

Scriptable Objects - Sistemas Inventário SO: Master List Todos os itens disponíveis 1 SO por item Busca que acontece na validação da Master List Popula ela com todos os itens Usa diferentes inventários em diferentes cenas Como num tutorial

Scriptable Objects - Sistemas Inventário SO: Master List Todos os itens disponíveis 1 SO por item Busca que acontece na validação da Master List Popula ela com todos os itens Usa diferentes inventários em diferentes cenas Como num tutorial

Scriptable Objects - Sistemashttps://www.youtube.com/watch?v raQ3iHhE Kk

Dúvidas?

Vamos a um exemplomais ptableobject-tutorial-getting-started

Referências

Referências[1] Unite Austin 2017 - Game Architecture with Scriptable Objects, Ryan Hipple (Schell Games) https://www.youtube.com/watch?v raQ3iHhE Kk[2] ScriptableObject Tutorial: Getting Started, Jeff Fisher & Ben MacKinnon ject-tutorial-getting-started[3] 3 maneiras legais de construir seu jogo com Objetos Scriptáveis, Unity3d table-objectsExtra:Exemplo de um sistema de habilidades com SOs -system-with-scriptable-objects#

Fellowship of the Game (FoG), vinculado ao ICMC - USP . É uma classe serializável da Unity Armazena grandes quantidades de dados compartilhados . Evita race conditions Mais flexível que tags da Unity e singleton. Scriptable Objects - Runtime Sets