🤔 Para Refletir :
"O que importa não é se criticam ou elogiam seu jogo, mas como você lida com isso."
- FL

Sistema de diálogos na Unity

Mayleone Feminino

Conde
Membro
Membro
Console.Write("Hello World!");
Juntou-se
25 de Outubro de 2016
Postagens
267
Bravecoins
3.095
Introdução:
Olá pessoal, como vão? Já faz um tempinho que eu havia prometido criar um tutorial de como desenvolver um sistema simples de diálogos na engine Unity, como visto nessa postagem aqui, porém por conta de alguns problemas pessoais eu não consegui gravar o tutorial na data pretendida!​
Entretanto, cá estou hoje postando o tutorial prontinho, então vamos lá!​
Como funciona:
O sistema é bem simples, você pode adicionar textos formatados ou não, através do inspector para criar todo o diálogo entre personagens, basta você indicar qual o personagem que está falando (através de um scriptable object que vai guardar todas as informações relevantes do personagem) e quais são suas mensagens, através de um array de strings:
sRzw7P7.png
Se você perceber na imagem de exemplo acima, quadriculado em vermelho temos as mensagens da primeira personagem chamada Úrsula, e em seguida quadriculado em azul temos as mensagens do segundo personagens chamado de Drake.​
Todos os textos e personagens podem ser editados via interface da Unity, mas caso deseje, existe a possibilidade de você escrever as mensagens e trocar os personagens por código, basta referenciar esses objetos no array de diálogo.​
Como os personagens que falarão serão criados através de scriptable objects, você pode expandir o sistema e adicionar outras informações a esses personagens, como por exemplo, expressões faciais, arquivo de áudios a serem reproduzidos, animações na imagem do personagem, e etc. Basta adicionar essas informações ao scriptable object, e alterar o script de UIManager para ler essas novas informações.​

Todos os diálogos são objetos de cena e os nós das mensagens, objetos-filhos, então é muito simples editar, adicionar ou remover as mensagens ou até mesmo diálogos inteiros!​
O que temos no sistema?
O sistema vai contar com um script para gerenciar os diálogos, outro para gerenciar os elementos gráficos do canvas, um script para disparar o diálogo, e outro script para gerenciar o container de mensagens.​
E cadê o tutorial?
Caso tenha ficado curioso(a) veja o tutorial logo abaixo:​
 
Última edição:
Mais um sistema aparentemente complexo, mas super simples, prático e dinâmico - tudo isso graças à talentosa professora que está ensinando! O legal é que quem não é programador, como eu, consegue aprender umas coisas bacanas que podem ser usadas até mesmo em outros sistemas! Muito bom e já estou no aguardo do próximo tutorial! * . *

@Mayleone o que você acha de, posteriormente, fazer um tutorial ensinando a galera a criar um "Angry Birds", na Unity? Pra galera ver o quão simples é de usar a física dessa engine maravilhosa!
 
Que coincidência!
Eu estava estudando sobre Scriptable Objects, e decidi re escrever e expandir o sistema de diálogos do meu jogo antigo usando eles. Ficou muito parecido ao seu, apenas com algumas diferenças na organização, já que ao invés de trocar o personagem, eu troco a expressão facial.😁

Ao invés de armazenar um array de strings, eu decidi armazenar um array de objetos contendo uma string em PT-BR, uma string em EN-US, um booleano para caso for necessário trocar a animação da expressão facial, e uma referência a animação de expressão.

O script de gerenciamento de diálogo compara o índice da lista, e exibe o texto de acordo com a linguagem definida nas configurações, e quando chega no fim da lista, fecha o diálogo.

Se eu soubesse que vc estava produzindo um tutorial desse, eu teria esperado e poupado umas 3 horas de pesquisa e estudo kkkkkk
 
Fazendo um breve resumo de uma leiga sobre o conjunto da ópera (que leu o tópico e assistiu o vídeo X3): É possível criar todo tipo de diálogos com esse sistema?
A cada dia que passa vem provando que a Unity é uma engine bem coringa sem referências ao @Eliyud '3', meus parabéns @Mayleone. Sua forma de explicar é sempre muito didática, acho uma pena que não seja da cultura brasileira o interesse pelos estudos, esse tipo de conteúdo merece ser melhor compartilhado...
 
Fazendo um breve resumo de uma leiga sobre o conjunto da ópera (que leu o tópico e assistiu o vídeo X3): É possível criar todo tipo de diálogos com esse sistema?
A cada dia que passa vem provando que a Unity é uma engine bem coringa sem referências ao @Eliyud '3', meus parabéns @Mayleone. Sua forma de explicar é sempre muito didática, acho uma pena que não seja da cultura brasileira o interesse pelos estudos, esse tipo de conteúdo merece ser melhor compartilhado...

Se me permite a intromissão em responder a pergunta. 😅

Tecnicamente sim. Tem alguns casos em que o pessoal faz até mesmo as árvores de escolhas de diálogo usando scriptable objetcs. Só a forma de implementar que vai variar de acordo com seu gosto e necessidade de projeto. Mas o sistema da @Mayleone é uma ótima base para criar derivações.
 
Mais um sistema aparentemente complexo, mas super simples, prático e dinâmico - tudo isso graças à talentosa professora que está ensinando! O legal é que quem não é programador, como eu, consegue aprender umas coisas bacanas que podem ser usadas até mesmo em outros sistemas! Muito bom e já estou no aguardo do próximo tutorial! * . *

@Mayleone o que você acha de, posteriormente, fazer um tutorial ensinando a galera a criar um "Angry Birds", na Unity? Pra galera ver o quão simples é de usar a física dessa engine maravilhosa!

@Eliyud
Então meu amor, obrigada por estar sempre apoiando os tópicos e os tutoriais! Você sabe que é uma de minhas motivações para escrevê-los!​
Realmente existe muito conteúdo interessante não só neste, mas também em outros tutoriais que podem ensinar coisas novas para serem utilizadas em outras situações, deixo como exemplo neste vídeo o uso de Scriptable Objects, eventos para gerenciar a UI e tornar o sistema desacoplado e a utilização da função WaitUntil!​
Sobre a sugestão: Já estou fazendo-a! :cafe:
Que coincidência!
Eu estava estudando sobre Scriptable Objects, e decidi re escrever e expandir o sistema de diálogos do meu jogo antigo usando eles. Ficou muito parecido ao seu, apenas com algumas diferenças na organização, já que ao invés de trocar o personagem, eu troco a expressão facial.😁

Ao invés de armazenar um array de strings, eu decidi armazenar um array de objetos contendo uma string em PT-BR, uma string em EN-US, um booleano para caso for necessário trocar a animação da expressão facial, e uma referência a animação de expressão.

O script de gerenciamento de diálogo compara o índice da lista, e exibe o texto de acordo com a linguagem definida nas configurações, e quando chega no fim da lista, fecha o diálogo.

Se eu soubesse que vc estava produzindo um tutorial desse, eu teria esperado e poupado umas 3 horas de pesquisa e estudo kkkkkk

Olha só @TerereZero isso que eu chamo de super coincidência! Tivemos ideias bem semelhantes, e a sua ainda tem a implementação de idiomas, que bacana!​
Foi bom você ter feito sozinho, pois tenho certeza que você aprendeu bastante coisa interessante!​
Como no meu sistema você configura o Scriptable Object para armazenar as informações do personagem, fica fácil estendê-lo e adicionar animações de expressões faciais, e etc, assim como você fez no seu!​
Inclusive, em um dos comentários deste vídeo lá no YouTube, eu havia comentado com um inscrito sobre as possibilidades de implementação de expressões faciais, deixo aqui em spoiler o comentário, pois pode ajudar o pessoal do fórum com ideias:​

Sobre mudar as expressões dos personagens, eu pensei em diversas alternativas:​
A primeira é bem simples, ao invés de no Scriptable Object do personagem você definir um Sprite diretamente, você define um Animator deste objeto, onde este animator possui os Triggers de cada expressão, que são ativados pelos seus respectivos parâmetros de strings.​
Então nas mensagens que você deseja mudar a expressão do personagem, você define por meio de um campo (também string) o nome do parâmetro da expressão correspondente dentro do Animator, ativando assim, sua animação desejada.​
Nesta abordagem acredito que além do Scriptable Object do personagem, você deva ter um prefab do mesmo contendo o animator e todas as suas possíveis expressões e parâmetros.​
A segunda ideia não conta com Animator, é focada novamente na ideia de sprites.​
No Scriptable Object, cria-se um array de sprites, e nesse array o usuário preenche com os sprites das possíveis expressões do personagem.​
E então dentro do container de mensagens, existirá um campo do tipo int que pede o índice dentro do array do Sprite necessário.​
Se não quiser usar índices numéricos, pode também utilizar um Dictionary para a coleção de sprites, onde a chave é uma String, o nome da expressão, talvez.​
Mas aí entra a questão de ter que editar o GUI do inspector para que ele exiba campos do tipo IDictionary.​
É um caminho um pouco mais complexo, porém não impossível.​
A terceira abordagem seria um pouco mais complexa, porém o resultado final mais satisfatório, que seria criar uma TAG customizada, para dentro da própria mensagem você poder chamar uma função interna que mude a expressão do personagem, algo como:​
"Eu estou com raiva! <changeExpression = Angry>"​
Onde changeExpression é uma TAG que chama essa função, e "Angry" é o parâmetro da expressão correspondente, então aqui a implementação para mudar a expressão do personagem pode ser através do Dictionary onde a chave do Sprite é o parâmetro, ou a abordagem do Animator onde o parâmetro do Trigger é o parâmetro da TAG.​
A última alternativa é a mais simples de todas, porém menos eficaz, você simplesmente tem um campo do tipo Sprite em cada mensagem, que define qual será a expressão do personagem quando essa mensagem for exibida.​
Parece ser a abordagem mais simples, pois não envolve nada mais complexo, que não seja um campo a mais no inspector para ser preenchido, mas o problema aqui é que o Sprite não terá nenhuma relação interna com o personagem, você pode acabar definindo um Sprite do personagem errado no processo, mas claro que, quando fosse testar isso seria percebido.​
Mesmo assim, prefiro garantir que as expressões tenham relação/pertençam a um personagem, não que seja colocado qualquer Sprite ali, mas é uma preferência pessoal minha e não deixa de ser uma abordagem válida, e das mais simples, ainda.​
Na verdade veja que não tem muito como fugir das abordagens de Animator e coleções quando você precisa implementar um sistema desse tipo, o que muda é como o usuário vai fazer uso dessas abordagens, seja referenciando parâmetros e Animator diretamente no inspector, seja sendo através de coleções e seus respectivos índices ou chaves, ou uma junção disso tudo, ao invés de definir campos no inspector, utiliza-se Tags customizadas.​
Enfim, são várias as ideias, espero que algumas delas possam ajudar o pessoal.​
Fazendo um breve resumo de uma leiga sobre o conjunto da ópera (que leu o tópico e assistiu o vídeo X3): É possível criar todo tipo de diálogos com esse sistema?
A cada dia que passa vem provando que a Unity é uma engine bem coringa sem referências ao @Eliyud '3', meus parabéns @Mayleone. Sua forma de explicar é sempre muito didática, acho uma pena que não seja da cultura brasileira o interesse pelos estudos, esse tipo de conteúdo merece ser melhor compartilhado...

Oi, Jully! Eu sempre fico muito feliz quando você curte algo referente à Unity! Quero muito converter todos vocês! HAHAHA!​
Bem, o membro @TerereZero respondeu perfeitamente sua dúvida, só irei reiterar que sim, realmente dá pra você fazer bastante coisa encima deste sistema, pois ele é uma base, e como o os componentes de canvas não são dependentes dos componentes do Dialogue Manager, você pode criar diversos tipos de diálogos e janelas, com diversas opções de formatação e design num mesmo projeto! Basta deixar a criatividade fluir!​
 
Voltar
Topo Inferior