O Unity tem suporte existente para linhas do tempo?

13

Estou planejando o desenvolvimento de um jogo no Unity3D e tentando chegar a um acordo com o que o mecanismo já forneceu e com o que devo me codificar.

O jogo em si será um jogo de ritmo, o que significa sincronizar eventos gráficos e de áudio para que eles sempre joguem quando deveriam. O que estou procurando evitar é um cenário potencial de atraso, em que o áudio ou os gráficos começam a progredir mais rapidamente que o outro.

Quando discutimos esse tipo de sistema de coordenação em minha aula de design de jogos na universidade, meu professor chamou esse tipo de design de classe "Linha do tempo". A ideia é que você pode instanciar um ou mais deles para progredir em taxas diferentes, agendar coisas para acontecer no futuro e sincronizar eventos periódicos. No entanto, chamar isso de classe "Linha do tempo" parece ter sido limitado ao meu professor, como pesquisar se uma determinada API apresenta a funcionalidade "Linha do tempo" foi um esforço infrutífero.

Existe algum nome mais comum para esse tipo de funcionalidade? O Unity possui algum método preexistente para coordenar o agendamento de eventos como esse ou esse é o tipo de coisa que precisa ser incorporada ao mecanismo? E se assim for, eu gostaria de ser apontado para alguns tutoriais!

Sonhador Corvo
fonte
Também usei classes semelhantes da linha do tempo (elas até tinham o mesmo nome). Um nome mais comum para o padrão é desconhecido para mim, mas provavelmente é implementado por meio de programação funcional-reativa, corotinas ou outros conceitos assíncronos.
Interphx

Respostas:

10

Embora essa funcionalidade não esteja disponível no Unity, uma implementação básica dessa linha do tempo não deve ser muito difícil de fazer.

Aqui está como eu faria isso:

  • Sua classe Timeline internamente usa uma fila de prioridade como estrutura de dados para armazenar eventos.
  • Um evento pode ser apenas um horário e um retorno de chamada. Assim, a adição de eventos para a linha do tempo seria tão simples como: timeline.AddEvent(0.25f, MyCallback).
  • A cada Updateclasse, a classe da linha do tempo:

    1. Incremente a reprodução (um simples float) pelo tempo decorrido
    2. Verifique o cabeçalho da fila de prioridade e remova e chame o retorno de chamada de todos os eventos que têm uma prioridade (por exemplo, horário) menor ou igual ao indicador de reprodução atual.

Se você precisar de algum tipo de retrocesso ou reprodução funcionalidade , seria óbvio remover todos os eventos da fila (o que significa que você precisaria adicioná-los novamente quando rebobinar). Em vez disso, você também pode usar uma matriz que armazena seus eventos . Um evento consistiria em um Timee Callback. Você precisaria manter sua matriz classificada por Time.

Em vez de remover os itens da matriz, você acompanharia o índice de matriz atual e, a cada atualização, buscasse com antecedência esse índice e executaria todos os retornos de chamada Playhead >= Timeenquanto aumentava o índice de acordo.

A implementação de uma velocidade de reprodução mais rápida funciona com ambas as implementações e seria tão simples quanto:

Playhead += Time.deltaTime * playbackSpeed
bummzack
fonte
2
"Incremente a reprodução (um simples float) pelo tempo decorrido" - Se você fizer isso, obterá erros agregados de ponto flutuante. Você deve usar Time.time (o tempo desde o início do jogo) .
BlueRaja - Danny Pflughoeft 31/01
4

Não, o Unity3D não possui essa API pronta para uso.

No entanto, ele suporta corotinas e eu sugiro que você as examine. As corotinas geralmente facilitam a programação e a sincronização de eventos.

deixa pra lá
fonte
1

Não tenho certeza se isso é novo desde as respostas em 2012, mas o Unity realmente tem suporte para o controle da linha do tempo por meio do Editor de animação (legado) .

Embora esse recurso seja destinado principalmente à animação de parâmetros de objetos com curvas, ele inclui a capacidade de disparar scripts nos Eventos de Animação . Esses scripts podem direcionar seus gráficos e áudio.

DMGregory
fonte