Como sincronizar um jogo com música

10

Você pode estar familiarizado com jogos de ritmo como Dancing Line , Geometry Dash ou até Guitar Hero . Eles têm algo em comum: cada ação do jogo é sincronizada com a música. Meu objetivo é criar um jogo como o Geometry Dash, em que o jogador deve executar algumas ações no ritmo, enquanto o personagem rola automaticamente no nível. Eu tenho algumas perguntas sobre esse tipo de jogo:

  • Preciso manter meu FPS constante, pois ele deve estar sempre sincronizado com a música?
  • Como posso criar meus níveis com uma música em mente para garantir que ela seja sincronizada?

Estou trabalhando no Unity usando C #.

Shashimee
fonte

Respostas:

18

Não recomendo usar o Time.deltaTime para acompanhar o progresso da reprodução da música, conforme descrito em outra resposta.

É ótimo para efeitos de suavização e interpolação para tocar em tempo real, mas quando você quiser combinar o tempo da música, pergunte a ela.

No Unity, você pode medir o progresso de uma fonte de áudio reproduzindo uma faixa diretamente usando AudioSource.timeou AudioSource.timeSamplespara obter a posição precisa do cabeçote. (Observe que o último mede em amostras, que podem variar na taxa por segundo, dependendo de como você compactou sua faixa)

Dessa forma, você não precisa executar seu próprio cronômetro separado e torcer para que eles fiquem sincronizados. Você pode conectar gatilhos de efeitos de batida para fugir da própria linha do tempo da música.

Para sons de jogabilidade em camadas na música, você pode usar o AudioSource.PlayScheduled para garantir que seus sons caiam exatamente na batida, pois até uma pequena incompatibilidade pode ser notada

DMGregory
fonte
Alguma idéia de como sincronizar gráficos com o AudioSource? Fe Eu quero mostrar uma explosão ou colisão conectada à música. Quero mostrar exatamente quando o som é reproduzido.
syabro
É disso que trata todas as respostas aqui. Você encontrou algum problema ao colocar as sugestões nessas respostas em prática, @syabro?
DMGregory
2

Como alternativa, se você estiver bem em não trabalhar do zero.

Já existem recursos prontos (em Extensões / Áudio do editor, como https://www.assetstore.unity3d.com/en/#!/content/54639 (pago) ou https://www.assetstore.unity3d.com/en / #! / content / 39835 (gratuito)) onde você pode sincronizar faixas de música para o evento. Nesse exemplo, a arma está disparando na batida da música.

Se você quiser aprender como eles funcionam, tente 1-2 dos gratuitos e consulte a fonte.

Zibelas
fonte
Vi uma apresentação dos desenvolvedores do Koreographer há pouco tempo - parecia uma ótima peça de tecnologia! Naquele momento, seus recursos de análise de áudio eram limitados, mas se você conhecesse antecipadamente a faixa com a qual está trabalhando, poderia usar a tecnologia para agendar com precisão eventos do jogo para batidas / momentos específicos da música. Não sei se eles adicionaram a capacidade de fazer mais análises automaticamente desde a demonstração.
DMGregory
1

O Unity já dissocia a jogabilidade da taxa de quadros. Se você se lembrar de sempre usar Time.deltaTimeas funções de atualização, a taxa de quadros real dos gráficos não deve afetar a velocidade do jogo. Portanto, quando você inicia o jogo e a faixa de áudio ao mesmo tempo, eles devem permanecer sincronizados.

Em relação ao design de níveis em torno da música, há duas abordagens:

  • A abordagem manual. Crie meticulosamente os níveis manuais em torno de faixas de áudio específicas. Ter as partituras originais em mãos pode ajudar, mas também é possível fazê-lo apenas de ouvido.
  • A abordagem processual. Use algoritmos de análise de áudio para gerar automaticamente níveis em torno das trilhas de áudio. O mais simples é procurar picos de volume. Isso já deve permitir que você identifique batidas de bateria em muitas músicas e crie obstáculos de acordo. Um passo adiante é detectar mudanças de volume separadamente em diferentes espectros de frequência. Isso torna a detecção de batidas mais confiável e permite gerar diferentes obstáculos para diferentes arremessos. Mas isso ainda está arranhando a superfície. A análise de áudio é um campo muito amplo e interessante. As pessoas escreveram muita literatura científica sobre isso.

    A profundidade em que você precisa mergulhar nesse campo depende de sua ambição. Alguns jogos estão satisfeitos em apenas detectar as batidas e gerar aleatoriamente todo o restante do design de níveis ( Crypt of the Necrodancer ). Outros tentam colocar tantos aspectos do design de níveis sob o controle do áudio quanto possível ( Audiosurf ).

Muitos jogos de ritmo usam uma abordagem híbrida. Você gera um primeiro rascunho do nível usando um gerador e o ajusta manualmente para torná-lo mais jogável.

Philipp
fonte
Obrigado pela sua resposta, vou dar uma olhada! O Time.deltaTime é realmente preciso e não haverá nenhum intervalo de tempo criado com músicas longas?
Shashimee 01/08/19
@Shashimee Deve ser preciso o suficiente. Se você quiser ter certeza de não perder nada com as diferenças de arredondamento, use-o Time.time.
Philipp
Eu recomendaria uma abordagem processual, pois abre muito mais possibilidades para o desenvolvimento do jogo. Os jogadores podem adicionar suas próprias faixas, você pode mudar a malha e todas as outras coisas ao ritmo, como partículas. Além disso, você não gastará muito tempo desenvolvendo níveis.
Candid Lua _Max_
11
Infelizmente, o Time.time pode ser ainda mais suscetível à imprecisão se o jogo estiver em execução há um tempo . Como ele mede o tempo de jogo desde a inicialização, e não desde o início da faixa ou o início do nível, depois de reproduzir uma música ou duas, ela perdeu tantos bits de precisão baixos quanto uma ingênua soma de deltas, e o erro pode continue a aumentar se o jogo for deixado em execução / restaurado por sono repetidamente.
DMGregory
0

Muito comum é a abordagem para ter um "mapa de batidas". Qualquer tipo de dado que represente as batidas da música. Pode ser uma textura, arquivo de dados ou qualquer outra coisa que contenha essas informações. Na maioria das vezes, é criado manualmente para criar batidas e combinações diferentes, versões de velocidades para um mapa de áudio.

Porém, ele pode ser gerado procedimentalmente a partir de dados de arquivos de áudio.

Como obter velocidade para combinar com o "ponto de batida"? Quando gerar um objeto?

Speed = Distance / Time.

Distance = Distância entre os pontos de criação do GameObject e do "beat point".

Time =A duração do áudio e o mapa de batida construído devem ser suficientes. Com essas informações, você pode analisar os dados do áudio / mapa para prever quando um objeto deve ser gerado para atingir o ponto exato. Agora tudo depende de quando você deseja gerar esse objeto, se você quer que seja muito rápido após a geração, então você gera mais tarde com grande velocidade. Se você deseja que ele esteja a uma velocidade normal - será necessário tempo para alcançar o player e o áudio precisa de tempo para tocar no momento certo.

Você pode até gerar um novo mapa com carimbos de data / hora para gerar objetos de batida para determinado mapa de áudio. Você tem que fazer algumas previsões em algum momento para poder corresponder à batida, para o estilo mais popular, eu diria, prever whengerar o objeto para que ele se mova com certeza speed. Esses podem ser feitos em tempo de execução, ou lidos em alguns arquivos calculados anteriormente ou salvos na RAM ...

Eu suponho que jogos como Osuesse não têm isso Distance, eles apenas têm o tempo de círculos encolhendo, bpm ... Os mapas geralmente são feitos sob medida. Portanto, a abordagem para calcular recursos visuais depende do estilo do jogo que você está criando também.

Então, para resumir tudo, os valores são interdependentes. Depende de quantas batidas você tem, da distância entre o ponto de reprodução e o jogador, e algumas vezes depende dos dados fornecidos [alguns jogos têm a velocidade de cada batida e sua aparência codificada em algum arquivo de dados que é criado manualmente]. Se você estiver fazendo isso de maneira processual, poderá calcular tudo basicamente usando dados de áudio.

Lua Espontânea _Max_
fonte