Física & Áudio
Integre simulação de física e áudio em Bevy - colliders, corpos rígidos e gatilhos de som.
Receita
// Física (estilo conceitual Avian/Rapier):
// commands.spawn((
// RigidBody::Dynamic,
// Collider::sphere(0.5),
// Transform::default(),
// ));
// Áudio:
fn play_jump(asset_server: Res<AssetServer>, mut commands: Commands) {
commands.spawn((
AudioPlayer::new(asset_server.load("audio/jump.ogg")),
PlaybackSettings::DESPAWN,
));
}Quando usar isso:
- Plataformas e jogos 3D que precisam de colisão
- Quebra-cabeças com empilhamento realista ou gatilhos
- Jogos de ação com SFX responsivos e camadas de música
- Títulos VR/desktop com dicas de áudio espacial
Exemplo de Trabalho
Áudio baseado em eventos ao pular:
use bevy::prelude::*;
#[derive(Event)]
struct JumpEvent;
fn play_jump_sfx(
mut events: EventReader<JumpEvent>,
asset_server: Res<AssetServer>,
mut commands: Commands,
) {
for _ in events.read() {
commands.spawn((
AudioPlayer::new(asset_server.load("audio/jump.ogg")),
PlaybackSettings::DESPAWN,
));
}
}O que isso demonstra:
- Entidade de áudio one-shot é destruída após a reprodução
- Lógica de pulo desacoplada dispara evento; sistema de áudio escuta
- Caminho do asset consistente com a pasta
assets/audio/
Mergulho Profundo
Como Funciona
- Plugin de Física avança a simulação no schedule
FixedUpdate. - Colliders geram eventos de contato para jogabilidade (dano, passos).
- Áudio mistura streams;
AudioPlayerinicia a reprodução ao ser gerado. - Listener (componente na câmera) afeta pan/volume 3D.
Pontos de Integração
| Sistema | Schedule |
|---|---|
| Passo da Física | FixedUpdate |
| Spawn de SFX | Update em eventos |
| Loop de Música | Entidade persistente com PlaybackSettings::LOOP |
Armadilhas
- Física no
Updatevariável - tunneling em alta velocidade. Correção: integre apenas emFixedUpdate. - Colisor de malha incompatível com sprite - acertos injustos. Correção: desenhe colliders para depuração em builds de desenvolvimento.
- Muitas vozes simultâneas - clipping do mixer. Correção: agrupe canais de SFX; sistema de prioridade.
- WAV grande não comprimido - travamento ao carregar. Correção: assets comprimidos OGG/Vorbis.
- Esquecer a entidade listener - áudio 3D plano. Correção: anexe
AudioListenerà câmera ativa.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Colisão AABB customizada | Jogo de tiles simples | Muitos corpos dinâmicos |
| FMOD/Wwise via FFI | Ferramentas de áudio AAA | Escopo indie pequeno |
| Colisão manual em grade 2D | Movimento em grade retrô | Realismo físico necessário |
| Sem áudio | Protótipo silencioso | Lançar para jogadores |
FAQs
Qual crate de física?
avian (ecossistema Bevy 0.14+) ou bevy_rapier3d/2d - escolha um por projeto e fixe a versão na release do Bevy.
Cinemático vs dinâmico?
Cinemático para controle do jogador que empurra física; dinâmico para caixas e ragdolls.
Camadas de colisão?
Grupos/máscaras de colisão filtram o que interage - defina na configuração do plugin para reduzir o trabalho.
Crossfade de música?
Duas entidades AudioPlayer; ajuste volumes em 1-2 segundos na mudança de estado.
Pausar áudio?
Recurso de volume global ou pausar todos os players quando GameState::Paused.
Eventos de física?
Eventos CollisionStarted/Ended do plugin mapeados para sons de dano ou passos.
Determinismo?
Timestep fixo ajuda; determinismo de rede completo requer ponto fixo e ordenação controlada.
Performance?
Corpos adormecidos, colliders simplificados, ajuste de broadphase - veja a página de performance.
Timing?
Game Loops & Timing para a fiação do FixedUpdate.
Assets?
Assets & Scenes para organização de arquivos de áudio.
Relacionado
- Game Loops & Timing - passo fixo
- Input & Events - disparar eventos
- Bevy Engine - schedules
- Assets & Scenes - carregar áudio
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.