• Jogos
  • Setor
  • Recursos
  • Comunidade
  • Aprendizado
  • Suporte
Desenvolvimento
Engine do Unity
Crie jogos 2D e 3D para qualquer plataforma
BaixarPlanos e preços
Monetização
Compra no aplicativo (IAP)
Descubra e gerencie IAP em todas as lojas
Mediation
Maximize a receita e otimize a monetização
Qualidade do anúncio
Proteja a experiência do usuário do seu aplicativo
Tapjoy
Construa lealdade do usuário a longo prazo
Todos os produtos de monetização
Aquisição de usuários
Aquisição de usuários
Seja descoberto e adquira usuários móveis
Unity Vector AI
Conecte jogadores com os jogos certos
Aura publicidade no dispositivo
Alcance usuários no dispositivo no pico de engajamento
Todos os produtos de crescimento
Casos de uso
Colaboração 3D
Construa e revise projetos 3D em tempo real
Treinamento imersivo
Treine em ambientes imersivos
Experiências do cliente
Crie experiências interativas em 3D
Todas as soluções da indústria
Setores
Manufatura
Alcançar excelência operacional
Varejo
Transformar experiências em loja em experiências online
Automotivo
Elevar a inovação e as experiências dentro do carro
Todos os setores
Biblioteca técnica
Documentação
Manuais do usuário oficiais e referências de API
Ferramentas de desenvolvedor
Versões de lançamento e rastreador de problemas
Roteiro
Revisar recursos futuros
Glossário
Biblioteca de termos técnicos
Insights
Estudos de caso
Histórias de sucesso do mundo real
Guias de melhores práticas
Dicas e truques de especialistas
Todos os recursos
Novidades
Blog
Atualizações, informações e dicas técnicas
Notícias
Notícias, histórias e centro de imprensa
Central da Comunidade
Discussões
Discutir, resolver problemas e conectar
Eventos
Eventos globais e locais
Histórias da comunidade
Made with Unity
Mostrando criadores do Unity
Transmissões ao vivo
Junte-se a desenvolvedores, criadores e insiders
Prêmios Unity
Celebrando criadores do Unity em todo o mundo
Para todos os níveis
Unity Learn
Domine habilidades do Unity gratuitamente
Treinamento profissional
Aprimore sua equipe com treinadores do Unity
É iniciante no Unity?
Conceitos básicos
Inicie seu aprendizado
Caminhos Essenciais do Unity
É iniciante no Unity? Comece sua jornada
Tutoriais
Dicas práticas e melhores práticas
Educação
Para estudantes
Impulsione sua carreira
Para educadores
Impulsione seu ensino
Concessão de Licença Educacional
Leve o poder do Unity para sua instituição
Certificações
Prove sua maestria em Unity
Opções de suporte
Obter ajuda
Ajudando você a ter sucesso com Unity
Planos de sucesso
Alcance seus objetivos mais rápido com suporte especializado
Perguntas frequentes
Respostas para perguntas comuns
Entre em contato conosco
Conecte-se com nossa equipe
Planos e preços
Idioma
  • English
  • Deutsch
  • 日本語
  • Français
  • Português
  • 中文
  • Español
  • Русский
  • 한국어
Social
Moeda
Comprar
  • Produtos
  • Unity Ads
  • Assinatura
  • Unity Asset Store
  • Revendedores
Educação
  • Estudantes
  • Educadores
  • Instituições
  • Certificação
  • Learn
  • Programa de Desenvolvimento de Habilidades
Baixar
  • Unity Hub
  • Arquivo de download
  • Programa beta
Unity Labs
  • Laboratórios
  • Publicações
Recursos
  • Plataforma de aprendizado
  • Comunidade
  • Documentação
  • Unity QA
  • Perguntas frequentes
  • Status dos Serviços
  • Estudos de caso
  • Made with Unity
Unity
  • Nossa empresa
  • Boletim informativo
  • Blog
  • Eventos
  • Carreiras
  • Ajuda
  • Imprensa
  • Parceiros
  • Investidores
  • Afiliados
  • Segurança
  • Impacto social
  • Inclusão e Diversidade
  • Entre em contato conosco
Copyright © 2025 Unity Technologies
  • Informações legais
  • Política de Privacidade
  • Cookies
  • Não venda nem compartilhe minhas informações pessoais

“Unity”, logotipos Unity e outras marcas comerciais de Unity são marcas comerciais ou marcas comerciais registradas da Unity Technologies ou de suas afiliadas (mais informações aqui). Outros nomes e marcas são marcas comerciais de seus respectivos detentores.

Hero background image

Use ScriptableObjects como objetos delegados

Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.
Clique aqui.

Esta página explica como usar ScriptableObjects como contêineres de lógica. Ao fazer isso, você pode tratá-los como objetos delegados, ou pequenos pacotes de ações que você pode chamar quando necessário.

Este é o quarto de uma série de seis mini-guias criadas para ajudar desenvolvedores Unity com o demo que acompanha o e-book, Crie arquitetura de jogo modular no Unity com ScriptableObjects.

O demo é inspirado na mecânica clássica de jogos de arcade de bola e raquete, e mostra como ScriptableObjects podem ajudá-lo a criar componentes que são testáveis, escaláveis e amigáveis para designers.

Juntos, o e-book, o projeto demo e estas mini-guias fornecem as melhores práticas para usar padrões de design de programação com a classe ScriptableObject em seu projeto Unity. Essas dicas podem ajudá-lo a simplificar seu código, reduzir o uso de memória e promover a reutilização de código.

Esta série inclui os seguintes artigos:

  • Comece com o demo de ScriptableObjects do Unity
  • Separe dados e lógica do jogo com ScriptableObjects
  • Use enums baseados em ScriptableObject em seu projeto Unity
  • Use ScriptableObjects como canais de eventos no código do jogo
  • Como usar um conjunto em tempo de execução baseado em ScriptableObject
  • Nota importante antes de começar
  • O padrão de estratégia
  • Comportamento plugável
  • Exemplo: AudioDelegate
  • Demo de padrões
  • Exemplo: Padrão de estratégia no sistema objetivo
  • Mais recursos de ScriptableObject

Nota importante antes de começar

Antes de você mergulhar no projeto de demonstração do ScriptableObject e nesta série de mini-guias, lembre-se de que, em sua essência, os padrões de design são apenas ideias. Eles não se aplicam a todas as situações. Essas técnicas podem ajudá-lo a aprender novas maneiras de trabalhar com Unity e ScriptableObjects.

Cada padrão tem prós e contras. Escolha apenas aqueles que beneficiam significativamente seu projeto específico. Seus designers dependem muito do Unity Editor? Um padrão baseado em ScriptableObject pode ser uma boa escolha para ajudá-los a colaborar com seus desenvolvedores.

No final, a melhor arquitetura de código é aquela que se adapta ao seu projeto e equipe.

ScriptableObjects
UM SCRIPTABLEOBJECT CONTÉM A "ESTRATÉGIA" DENTRO DO MONOBEHAVIOUR.

O padrão de estratégia

Usando o padrão de estratégia, você pode definir uma interface ou classe base ScriptableObject e, em seguida, tornar esses objetos delegados intercambiáveis em tempo de execução.

Uma aplicação é encapsular algoritmos para realizar tarefas específicas em um ScriptableObject e, em seguida, usar esse ScriptableObject no contexto de algo mais.

Por exemplo, se você estivesse escrevendo um sistema de IA ou de busca de caminho para uma classe EnemyUnit, você poderia criar um ScriptableObject com uma técnica de busca de caminho (como A*, Dijkstra, etc.).

A própria EnemyUnit não conteria nenhuma lógica de busca de caminho. Em vez disso, ela manteria uma referência a um ScriptableObject "estratégia" separado. A vantagem desse design é que você pode trocar para um algoritmo diferente simplesmente trocando objetos. Esta é uma maneira de escolher comportamentos diferentes em tempo de execução.

Quando o MonoBehaviour precisa realizar uma tarefa, ele chama os métodos externos no ScriptableObject em vez de seus próprios. Por exemplo, o ScriptableObject pode conter métodos públicos para MoverUnidade ou DefinirAlvo para controlar a unidade inimiga e especificar um destino.

Download PaddleBallSO

Comportamento plugável

Você pode melhorar esse padrão com uma classe base abstrata ou uma interface. Fazer isso significa que qualquer ScriptableObject que implementa a estratégia pode ser trocado por outro. Esse ScriptableObject intercambiável "se conecta" ao MonoBehaviour que o referencia – mesmo em tempo de execução.

Se você precisar que o EnemyUnit mude comportamentos devido a condições do jogo, o contexto externo (o MonoBehaviour) pode verificar essas condições. Então, ele pode conectar um ScriptableObject diferente como resposta.

Ao separar os detalhes de implementação em um ScriptableObject, você também pode facilitar uma melhor divisão de responsabilidades entre sua equipe. Um desenvolvedor pode se concentrar no algoritmo dentro do ScriptableObject, enquanto outro trabalha no contexto do MonoBehaviour.

Para criar esse comportamento plugável, certifique-se de:

  • Defina uma classe base ou interface para a estratégia: Essa classe ou interface deve incluir os métodos e propriedades necessários para executar a estratégia.
  • Crie as classes ScriptableObject: Cada uma pode fornecer diferentes implementações da estratégia. Por exemplo, você poderia criar uma classe que implementa um algoritmo de IA simples e outra classe que implementa um algoritmo mais complexo.
  • Crie um ScriptableObject que implementa a estratégia: Preencha a lógica ausente e preencha o Inspector com quaisquer valores necessários.
  • Use a estratégia no contexto: No MonoBehaviour, chame os métodos e propriedades implementados no ScriptableObject. Para facilitar a chamada desses métodos, passe as dependências como parâmetros.

Organizar seu código dessa forma pode facilitar a troca entre diferentes implementações da mesma estratégia. Esse comportamento plugável se torna mais fácil de depurar e manter.

Exemplo: AudioDelegate

Um algoritmo ou estratégia não precisa ser complicado. O projeto PaddleBallSO, por exemplo, demonstra um sistema de reprodução de áudio bastante básico no SimpleAudioDelegate.

A classe abstrata, AudioDelegateSO, define um único método Play que aceita um parâmetro AudioSource. A implementação concreta então substitui isso.

A subclasse SimpleAudioDelegateSO define um array de AudioClips. Ela escolhe um clipe aleatório e o reproduz usando a implementação do método Play sobrescrito. Isso adiciona uma variação na tonalidade e no volume dentro de um intervalo personalizado.

Embora sejam apenas algumas linhas, você pode criar muitos efeitos de áudio diferentes com o trecho de código abaixo.

Embora este exemplo específico não seja realmente adequado para uso intenso de áudio, ele é apresentado aqui como uma demonstração básica de uso de ScriptableObjects em um padrão de estratégia.

Um designer pode criar muitos ScriptableObjects diferentes para representar efeitos sonoros sem tocar no código. Novamente, isso requer suporte mínimo de um desenvolvedor uma vez que o ScriptableObject base esteja completo.

Em PaddleBallSO, qualquer um pode agora configurar um novo array de sons para reproduzir quando a bola atinge uma das paredes do nível. Os designers ganham independência criativa e flexibilidade porque estão trabalhando inteiramente no Editor. Essa abordagem libera recursos de programação, já que os desenvolvedores não precisam mais ajudar com cada decisão de design.

Download PaddleBallSO
Objetos de delegado
A CENA DE DEMONSTRAÇÃO DOS AUDIODELEGATES MOSTRA COMO SCRIPTABLEOBJECTS PODEM MANTER LÓGICA.

Demo de padrões

Você também pode ver o exemplo de áudio na demonstração de Padrões. Cada som deriva de um ativo SimpleAudioDelegateSO ligeiramente diferente, com pequenas variações entre as instâncias.

Neste exemplo, cada canto inclui um AudioSource. Um MonoBehaviour AudioModifier personalizado usa um delegado baseado em ScriptableObject para reproduzir som.

As diferenças de tom decorrem apenas das configurações em cada ativo ScriptableObject (BeepHighPitched_SO, BeepLowPitched_SO, etc.).

Usar um ScriptableObject para controlar a lógica de ação pode facilitar para sua equipe de design experimentar ideias. Isso permite que um designer trabalhe de forma mais independente de um desenvolvedor.

Gerenciador de objetivos
O MONOBEHAVIOUR DO OBJECTIVEMANAGER TESTA AS CONDIÇÕES DE VITÓRIA USANDO SCRIPTABLEOBJECTS.

Exemplo: Padrão de estratégia no sistema objetivo

O projeto PaddleBallSO também usa o padrão de estratégia em seu sistema de objetivos. Embora isso não seja algo que precise variar em tempo de execução, encapsular cada objeto em um ScriptableObject fornece uma maneira flexível de testar condições de vitória e derrota.

A classe base abstrata, ObjectiveSO, mantém valores como o nome do objetivo e se ele foi concluído.

As subclasses concretas, como ScoreObjectiveSO, implementam a lógica real sobre como completar cada objetivo. Eles fazem isso sobrescrevendo o método CompleteObjective do ObjectiveSO e adicionando a lógica da condição de vitória.

O jogador precisa atingir uma pontuação específica ou derrotar um certo número de inimigos? Eles precisam chegar a um local específico ou pegar um item específico? Estas são condições de vitória comuns que poderiam se tornar objetivos baseados em ScriptableObject.

O ObjectiveManager serve como o contexto maior para os ScriptableObjects. Ele mantém uma lista de ObjectiveSOs e depende de cada ScriptableObject para determinar se está completo. Quando cada ObjectiveSO mostra um estado de conclusão, o jogo termina.

Por exemplo, o ScoreObjectiveSO mostra uma maneira de implementar um objetivo de pontuação:

  • Uma estrutura PlayerScore personalizada corresponde ao ID do jogador, um elemento de UI na interface e o valor real da pontuação.
  • Toda vez que o componente ScoreManager é atualizado, o objetivo verifica a condição de vitória.
  • Se a pontuação do jogador atender ou exceder o m_TargetScore, então ele envia o objeto PlayerScore vencedor como um evento.

O ObjectiveManager só se preocupa que todos os objetivos dados estejam completos. Ele não está ciente dos detalhes dentro de cada objetivo em si.

Novamente, o objetivo aqui é a modularidade. Isso permite que você personalize cada ObjectiveSO sem afetar os já existentes.

O jogo PaddleBallSO realmente tem apenas um objetivo. Se um dos jogadores atingir a meta de pontuação vencedora, o jogo termina.

No entanto, você pode estender isso ou combinar objetivos para criar um sistema de objetivos mais complexo. Experimente e veja se você consegue criar novos modos de jogo (por exemplo, marcar um número mínimo de pontos antes que o tempo acabe).

Como a lógica está encapsulada dentro de um ScriptableObject, você pode trocar qualquer ObjectiveSO por outro. Criar uma nova condição de vitória envolve simplesmente reconfigurar a lista no ObjectiveManager. De certa forma, o objetivo é "plugável" no contexto ao redor.

Observe que um aspecto útil do ObjectiveSO é o evento usado para enviar mensagens entre GameObjects. Em seguida, vamos explorar como usar ScriptableObjects para implementar essa arquitetura orientada a eventos.

Download PaddleBallSO
scriptable outro

Mais recursos de ScriptableObject

Leia mais sobre padrões de design com ScriptableObjects no e-book Criar arquitetura de jogo modular no Unity com ScriptableObjects. Você também pode descobrir mais sobre padrões de design comuns no desenvolvimento do Unity em Melhore seu código com padrões de programação de jogos.