Usando tinta e linha do tempo da Unity para fazer Wayward Strand

A seguinte postagem do blog, salvo indicação em contrário, foi escrita por um membro da comunidade do Gamasutra.
Os pensamentos e opiniões expressos são do autor e não da Gamasutra ou de sua empresa-mãe.


Já faz um certo tempo desde a minha último artigo relacionado ao desenvolvimento . Ainda estamos trabalhando no mesmo jogo e, cinco anos depois, é surpreendentemente semelhante, mas tem sido um passeio selvagem.

Agora que estamos perto de terminar e lançar o Wayward Strand, pensamos em compartilhar um pouco sobre a tecnologia que colocamos juntos para fazer isso. A propósito, se você não tem ideia do que é Wayward Strand, nós atualizou recentemente o texto em nossa página Steam , e acho que fez um bom trabalho resumindo-o agora.

Então, um dos desafios que tivemos que superar ao decidir fazer um jogo narrativo em tempo real totalmente 3D com personagens complexos e animados como uma equipe indie foi: … como?

Isso é algo que tem sido um enigma para desenvolvedores indie de jogos narrativos por um tempo agora, com alguns optando por abrir mão de visualizar personagens todos juntos. Por exemplo, Fullbright, os criadores de Gone Home e Tacoma, estão apenas incluindo personagens totalmente visualizados em seus próximos Open Roads, e em seus jogos anteriores, eles projetaram inteligentemente em torno da necessidade de incluir personagens totalmente visualizados para contar suas histórias.

Embora nossa resposta a isso tenha sido parcialmente apenas “vamos fazer isso e ver como vamos”, e tivemos muitos problemas ao longo do caminho, nós descobri o que considero uma combinação muito boa de ferramentas existentes / de código aberto, o que nos permitiu criar um jogo do tamanho e escopo com que sempre sonhávamos.

O primeiro deles é tinta – Linguagem de script do Inkle, que eles forneceram generosamente como uma ferramenta de código aberto para desenvolvedores. Ink preenche um papel semelhante a ferramentas narrativas como Twine ou Yarn Spinner – permite que você construa narrativas interativas complexas de uma forma que você possa facilmente conectá-las a um mecanismo de jogo. A escritora astrologista Katharine Neil tem A screenshot of one of our scene files, open in the Inky editor, displaying several lines of a scene, including some logic that checks if Casey is present, which causes some additional dialogue to occur. um ótimo artigo de como integrar tinta , bem como Twine and Yarn Spinner, com Unity.

A screenshot of one of our scene files, open in the Inky editor, displaying several lines of a scene, including some logic that checks if Casey is present, which causes some additional dialogue to occur.

Um de nossos arquivos de cena, aberto no editor Inky.

Há muitos motivos pelos quais amamos tinta , mas um em particular é o ímpeto narrativo que incentiva por meio de seu design. Escrevendo com tinta parece menos projetar uma placa de circuito do que escrever um roteiro para o teatro ou a tela – embora possa lidar com qualquer nível de complexidade de que você precisa, seu foco inicial é a página em branco e a palavra escrita, e você pode adicionar complexidade interativa à medida que vai.

A propósito, o Inkle acaba de lançar

Ao mar!

– um jogo de mistério e assassinato que usa tinta como a espinha dorsal de sua dinâmica narrativa – dê uma olhada! E se você usa tinta ou acha que é uma ferramenta legal, definitivamente considere apoiá-los no Patreon .

Nós estamos usando ink em conjunto com a ferramenta Timeline do Unity.

A screenshot of one of our lines in Unity’s sequencing tool called ‘Timeline’. There are three tracks: Line Length, Dialogue, and Subtitle. Each Track has a single Clip on it. The Clips display the text of the line: “Neil: Hello, Devin, you there mate?”

A screenshot of one of our lines in Unity’s sequencing tool called ‘Timeline’. There are three tracks: Line Length, Dialogue, and Subtitle. Each Track has a single Clip on it. The Clips display the text of the line: “Neil: Hello, Devin, you there mate?”

Uma de nossas linhas na ferramenta de linha do tempo do Unity.

As linhas de tempo são um recurso do Unity que permite sincronizar clipes que eles chame “jogáveis” para um eixo de tempo – é basicamente um sequenciador programável para eventos que podem acontecer em seu jogo, como animações em execução, personagens se movendo, sons acionados, etc. Se você gostaria de saber mais sobre o tempo linha e como usá-la, A screenshot of one of our lines in Unity’s sequencing tool called ‘Timeline’. There are three tracks: Line Length, Dialogue, and Subtitle. Each Track has a single Clip on it. The Clips display the text of the line: “Neil: Hello, Devin, you there mate?” esta postagem de Robert Yang é um ótimo lugar para começar.

Então, como conectamos esses dois diferentes ferramentas juntas para Wayward Strand?

No início, decidimos que tinta A linha seria o bloco de construção chave do jogo. Isso nos limitaria em termos de de tinta capacidade de construir linhas dinamicamente com base na lógica, mas esta é uma limitação que teríamos que assumir de qualquer maneira para incluir a narração e também para tornar a localização mais fácil – incluir suporte para cada uma delas era um objetivo para o jogo em um estágio inicial.

A partir daí, planejamos nossa integração com o Unity. Queríamos a capacidade de “direcionar” nossas cenas interativas – ser capaz de modificar qualquer parte delas, incluindo ser capaz de direcionar rápida e facilmente o tempo de qualquer aspecto da cena.

Também precisávamos de uma maneira de acionar animações, mudanças de olhar de personagem, movimentos de câmera e outros detalhes menores do Unity – e embora pudéssemos ter executado todas essas coisas de tinta, estávamos ansiosos para traçar uma linha entre o processo de escrita e o processo de ‘direção da cena’, o que nos permitiria focar em cada um desses processos por sua vez.

 written scene from the game that demonstrates the use of differentiators - at the end of a line that is exactly the same as a previous line, there’s a “differentiator” - a unique word surrounded by angle brackets.

Nossa antiga ferramenta de edição de linha, incluindo alguns recursos que cortamos para reduzir o escopo.

Nossa integração inicial realmente aconteceu antes do lançamento da linha do tempo – desenvolvemos uma estrutura de dados no lado do Unity que armazenava dados por ink Line, em matrizes de “componentes” (portanto, cada linha pode ter um componente Dialogue, múltiplo Componentes de movimento e assim por diante). Estes dados do componente foram criados automaticamente para cada linha como ink os arquivos foram compilados, em um dicionário vinculado à tinta
Arquivo.

Quando o Timeline foi lançado, nós rapidamente trocamos, começando com uma solução semelhante. Percebemos que poderíamos (com um pouco de hackeamento, na época), gerar ativos de linha do tempo automaticamente e começamos criando-os para cada um ink A screenshot of one of our scene files, open in the Inky editor, displaying several lines of a scene, including some logic that checks if Casey is present, which causes some additional dialogue to occur. Line, como nós estavam fazendo antes. Embora esta seja uma solução de força bruta, e trabalhar com as cenas no Unity linha por linha às vezes pode ser contra-intuitivo, ela nos durou ao longo do projeto.

Então, nosso pipeline atual é o seguinte:

1. Criamos uma versão personalizada da tinta compilador, que cria um identificador de linha exclusivo com base no texto da linha, o nó / ponto atual e um identificador exclusivo para o ink arquivo em que a linha está. Em seguida, ele prefixa este identificador de linha exclusivo para a própria linha.

Um pequeno problema divertido com a geração do identificador de linha exclusivo é que se qualquer linha for exatamente igual a outra em uma cena ou nó particular, será gerado com o mesmo id, então temos que adicionar um “diferenciador” ao final deles – uma pequena tag que denota qual das duas linhas ele é.

A screenshot displaying the Unity editor’s Project view, in which there are lots of Timeline asset files - one for each scene - in a folder. The Timeline asset filenames are each 16 letters long - they are hexadecimal representations of the unique 64-bit line identifier.

Outra cena do jogo.

Nosso compilador modificado também gera um arquivo json personalizado, junto com ink arquivo json, que inclui uma lista de todos os tinta L ines , para que possamos processá-los facilmente do lado da Unidade. (Você pode ver todas as nossas modificações semi-hacky na tinta compilador A screenshot displaying the Unity editor’s Project view, in which there are lots of Timeline asset files - one for each scene - in a folder. The Timeline asset filenames are each 16 letters long - they are hexadecimal representations of the unique 64-bit line identifier. em Github .)

2. No Unity, analisamos a tinta História para coletar informações de tag sobre a cena, ou nós dentro da cena, e então usamos o ink Lista de linhas do arquivo json personalizado para gere um ativo de linha do tempo para cada linha.

  • Ativos de linha do tempo gerados para a cena na visualização do projeto do Unity.

    Esses ativos da linha de tempo são configurados com algumas trilhas e clipes padrão:

    uma faixa / clipe LineLength, que determina quanto tempo até o A próxima linha na cena deve ser disparada (a duração de uma linha é inicialmente definida para um valor que é calculado com base na quantidade de caracteres na linha);

  • uma faixa / clipe de Diálogo, que indica nosso VO quando o clipe é acionado, bem como manipula as formas da boca de nossos personagens e o comportamento relacionado à animação falada (incluindo virar a cabeça );
  • uma faixa / clipe de legenda, que é usado para acionar nossos balões de fala e também legendas em potencial quando essa acessibilidade opção está ativada (esses clipes processam a linha através de um sistema de diálogo que lida com o potencial de tradução).

    A screenshot displaying the Unity editor, with the Timeline window at the bottom, open as previously described, plus a ‘Scene Timeline Helper’ window on the left, which allows the user to skip forwards or backwards in the scene, and has many buttons to quickly add clips to the Timeline. On the right is a Property Inspector which is inspecting the currently selected clip, a “Character Direction” clip, which is set up to move the character Ruth to the Nurse’s Station. In the Game view in the middle, we can see a character - Ruth - partway through a movement. 

    3. Finalmente, temos uma ferramenta de direção de cena que existe ao lado da linha do tempo, que nos permite mover facilmente entre as linhas na cena (para trás, para frente ou pular para uma linha específica), bem como exibir um monte de botões úteis que adicionam rapidamente clipes adicionais para a linha do tempo – clipes de mudança de estado de animação, clipes de movimento, clipes de observação da cabeça do personagem e assim por diante.


    Tudo se junta no Unity – este é o nosso projeto no modo Direção.

    O que isto significa fundamentalmente é que, quando partimos de nosso tinta script, através do Unity, a maioria dos dados já está configurada para nós. Os personagens podem não se mover na cena até que uma passagem de direção da cena aconteça, mas eles falarão uns com os outros, as opções de Casey aparecerão na tela quando for necessário, e a cena pode ser reproduzida do início ao fim.

    Isto também significa que, ao fazer a passagem de direção da cena, a maioria dos dados já existe, pronta para ser ajustada. Podemos arrastar rapidamente os clipes LineLength para obter algum comportamento mais interessante (como personagens falando por cima um do outro, ou uma pausa pesada antes de uma resposta), e os únicos dados que precisamos “criar” (além dos dados de movimento ) geralmente é a direção da cena com mais detalhes.

    Existem alguns outros detalhes divertidos que não abordei aqui – por exemplo, como respondemos às edições em nossa cenas após terem sido importadas, ou como vinculamos nossos clipes reproduzíveis a personagens específicos sem usar a funcionalidade de ‘ligação’ da linha do tempo – mas, mesmo que claramente colocaram muito esforço para fazer tudo isso funcionar, ainda parece que uma parte significativa do trabalho pesado está sendo feito pela linha do tempo e ink – certamente não poderíamos ter feito tudo isso, além de construir uma linguagem de script e um sequenciador programável.

    Este pipeline levou anos para nossa pequena equipe, e descrevê-lo me deixou ainda mais orgulhoso de todo o trabalho que realizamos. Espero compartilhar mais nos próximos meses!

    Fonte

  • Deixe uma resposta

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *