Como programar música no Roblox usando Lua
Você precisa de um script que toque áudio no seu jogo e provavelmente já tentou arrastar um Sound para o workspace e esperar que funcione. Na maioria das vezes, funciona. Só que quando o jogo cresce, as coisas começam a falhar de formas estranhas. Vou explicar como fazer isso funcionar direito desde o começo.
codes music for roblox
O sistema de áudio do Roblox se baseia em objetos da classe Sound dentro do Service de áudio ou na pasta SoundService. Você define um SoundId com o link de um áudio hospedado no Roblox ou um ID numérico, e usa um script para controlar a reprodução. O jeito mais direto é criar um LocalScript no StarterPlayerScripts que referencia o Sound e chama Play(). No meu primeiro projeto com música, eu coloquei um Sound dentro de um modelo dentro do Workspace e tentei tocar via servidor. O áudio só começava a reproduzir depois que o jogador se aproximava demais do objeto. Isso aconteceu porque eu estava usando um Sound comum sem configurar o RollOffMode adequado. Mudei para SoundService, defini o RollOffMode como Never, e configurei o Looped como true para música de fundo. A partir daí, o som tocava uniformemente para todos os jogadores sem depender da distância.
O código básico para trilha sonora fica assim: LocalScript em StarterPlayerScripts:
local soundService = game:GetService("SoundService") local bgm = Instance.new("Sound")
bgm.SoundId = "rbxassetid://SEU_ID_AQUI" bgm.Volume = 0.5
bgm.Looped = true bgm.RollOffMode = Enum.RollOffMode.Never
bgm:Play() Se você precisa que o som toque em um momento específico do jogo, como uma cutscene ou evento, use um ServerScript no ServerScriptService com game.Players.PlayerAdded para detectar quando alguém entra e disparar o áudio. O problema aí é que scripts de servidor não têm acesso direto a LocalScript. Se o áudio precisa ser ouvido apenas pelo cliente, use RemoteEvent para comunicar o momento certo de tocar.
Configurações importantes que muita gente esquece: Pitch afeta a velocidade e o tom ao mesmo tempo. Se você baixar o pitch para deixar a música mais lenta, o tempo de duração aumenta proporcionalmente. Isso quebra sincronia com animações ou eventos de jogo que dependem do beat. Para manter a duração original enquanto ajusta o tom, use um plugin ou exporte o áudio já processado. Outra coisa que dá problema é o volume. O Roblox tem um sistema de ducking automático que reduz o volume de Sound objects quando o player fala no chat de voz. Se sua música de fundo está em 0.6 e o ducking atua em cima, o volume cai para cerca de 0.3 durante o chat. A solução é subir o volume base para 0.8 ou mais, ou desativar o chat de voz se não for essencial para o seu jogo.
Para múltiplas faixas alternando aleatoriamente, crie uma tabela com os IDs e use um loop simples com Wait() ou um Timer personalizado. Evite usar task.wait com valores muito pequenos porque o scheduler do Roblox tem limitações de precisão. Valores abaixo de 0.1 segundos ficam arredondados e causam inconsistência na transição entre músicas. Se o seu jogo precisa de música sincronizada com gameplay, considere usar AudioController nativo do Roblox em vez de Sound objects. O AudioController permite crossfade entre faixas e controle de volume por camada, mas tem uma limitação: ele só funciona com áudio hospedado na nuvem do Roblox. Se você quer usar assets próprios de fora, fica restrito ao método tradicional de Sound.
Aqui vai um exemplo mais completo de sistema de playlist: Script no ServerScriptService:
local sounds = { ["track1"] = "rbxassetid://ID_1",
["track2"] = "rbxassetid://ID_2", ["track3"] = "rbxassetid://ID_3"
👉 Clique no botão abaixo para saber mais sobre o assunto!
} local currentTrack = 1
local soundService = game:GetService("SoundService") local function playNext()
local keys = {} for k in pairs(sounds) do table.insert(keys, k) end
local track = keys[currentTrack] currentTrack = (currentTrack % #keys) + 1
local s = Instance.new("Sound") s.SoundId = sounds[track]
s.Volume = 0.7 s.Parent = soundService
s.PlaybackSpeed = 1 s.Ended:Connect(function() s:Destroy() end)
s:Play() task.delay(s.TimeLength, playNext)
end playNext()
Esse sistema reinicia automaticamente a playlist quando termina a última faixa. Se quiser aleatoriedade, embaralhe a tabela antes de iniciar usando um shuffle simples. Problema que encontrei na prática: ao testar em dispositivo móvel, o áudio começava a falhar intermitentemente depois de alguns minutos. Descobri que o problema era o GC do Roblox coletando objetos Sound que estavam sendo criados e destruídos repetidamente. A solução foi reutilizar um único objeto Sound e apenas trocar o SoundId entre as faixas, em vez de criar novos a cada transição. Isso eliminou os travamentos completamente.
Para quem quer evitar depender de hosts externos, o Roblox tem o Asset Manager onde você pode fazer upload de arquivos de áudio diretamente. Formatos suportados são MP3 e WAV, com limite de 10MB por arquivo. Áudios maiores precisam ser divididos ou comprimidos antes do upload. Se seu jogo tem várias áreas com música diferente, use um sistema de zonas baseado em Region3 ou BoundaryParts. Cada zona dispara um evento quando o jogador entra e sai, e o script troca a faixa correspondente. O detalhe importante aqui é implementar um fade-out e fade-in para evitar cortes bruscos. Um fade de 2 segundos com Volume variando de 1 para 0 usando LinearInterpolation ou TweenService resolve isso.
Uma dica que pouca gente menciona: use PlayOnRemove = false em conjunto com um Manual play para ter controle total sobre quando o som inicia. Isso evita que o áudio toque automaticamente assim que o objeto é criado e o jogador aparece no jogo. Se você precisa de sincronia precisa com animações ou lógica de jogo, considere usar o sistema de AudioQueue do Roblox, disponível a partir de certain API versions. Ele permite enfileirar múltiplos sons com timestamps exatos, mas tem suporte limitado em dispositivos antigos e pode não funcionar em algumas builds mais velhas do engine.
O código final depende muito do que seu jogo precisa. Trilha sonora de fundo pede um loop contínuo com volume baixo. Efeitos sonoros pontuais precisam de prioridade alta e cutoff rápido. Eventos especiais merecem uma camada separada de áudio para não conflitar com a música principal. Separar esses canais em volumes diferentes no SoundService facilita o mix e evita que sons competam entre si. Sempre teste em pelo menos três plataformas diferentes antes de publicar. O que funciona no PC pode ter comportamento completamente diferente no celular ou console devido às limitações de hardware e ao processamento de áudio de cada plataforma.