AudioSystemGuide.md 5.5 KB

音频系统设置指南

概述

本文档介绍如何在游戏中集成音乐和音效系统,以及如何通过菜单控制音频音量。

系统架构

核心组件

  1. AudioManager (assets/scripts/Core/AudioManager.ts)

    • 统一管理所有音频播放
    • 提供音乐和音效的播放、停止、音量控制功能
    • 单例模式,全局访问
  2. SoundController (assets/scripts/CombatSystem/MenuSystem/SoundController.ts)

    • 管理菜单中的音频控制UI
    • 处理滑动条和开关按钮的交互
    • 与AudioManager集成,实现音量控制
  3. Audio静态类 (assets/scripts/Core/AudioManager.ts)

    • 提供便捷的静态方法访问音频功能
    • 简化代码调用

设置步骤

1. 创建AudioManager节点

在主场景中创建一个AudioManager节点:

Canvas/
├── AudioManager (添加AudioManager组件)
│   ├── MusicAudioSource (自动创建)
│   └── SFXAudioSource (自动创建)

2. 配置SoundController

在MenuUI节点上添加SoundController组件,并配置以下属性:

  • soundEffectSlider: 音效滑动条组件
  • soundEffectCheckbox: 音效开关按钮
  • soundEffectCheck: 音效勾选标记节点
  • soundEffectProgressBg: 音效进度条背景
  • musicSlider: 音乐滑动条组件
  • musicCheckbox: 音乐开关按钮
  • musicCheck: 音乐勾选标记节点
  • musicProgressBg: 音乐进度条背景
  • greenProgressSprite: 绿色进度条材质

3. 准备音频资源

将音频文件放置在resources目录下:

assets/resources/
├── audio/
│   ├── music/
│   │   ├── background_music.mp3
│   │   └── menu_music.mp3
│   └── sfx/
│       ├── button_click.mp3
│       ├── weapon_fire.mp3
│       └── explosion.mp3

4. 在代码中使用音频系统

播放背景音乐

import { Audio } from '../Core/AudioManager';

// 播放背景音乐
Audio.playMusic('audio/music/background_music');

// 停止音乐
Audio.stopMusic();

// 暂停/恢复音乐
Audio.pauseMusic();
Audio.resumeMusic();

播放音效

// 播放音效
Audio.playSFX('audio/sfx/button_click');

// 播放音效并指定音量
Audio.playSFX('audio/sfx/explosion', 0.8);

控制音量

// 设置音乐音量 (0-1)
Audio.setMusicVolume(0.7);

// 设置音效音量 (0-1)
Audio.setSFXVolume(0.8);

菜单音频控制功能

滑动条功能

  • 音效滑动条: 控制所有音效的音量大小
  • 音乐滑动条: 控制背景音乐的音量大小
  • 绿色进度条: 跟随滑动条Handle的进度实时更新

开关按钮功能

  • 勾选状态: 音频正常播放,显示勾选标记
  • 取消勾选:
    • 记录当前音量设置
    • 将滑动条移到最左侧(音量为0)
    • 隐藏勾选标记
  • 重新勾选:
    • 恢复之前记录的音量设置
    • 滑动条回到之前的位置
    • 显示勾选标记

数据持久化

音频设置会自动保存到本地存储,包括:

  • 音效开关状态
  • 音乐开关状态
  • 音效音量值
  • 音乐音量值

集成示例

在武器系统中添加音效

// 在武器发射时播放音效
export class WeaponController {
    private fireWeapon() {
        // 武器发射逻辑...
        
        // 播放发射音效
        Audio.playSFX('audio/sfx/weapon_fire');
    }
}

在UI按钮中添加点击音效

// 在按钮点击事件中添加音效
export class ButtonController {
    private onButtonClick() {
        // 播放按钮点击音效
        Audio.playSFX('audio/sfx/button_click', 0.6);
        
        // 按钮逻辑...
    }
}

在游戏状态切换时控制音乐

// 在游戏管理器中控制背景音乐
export class GameManager {
    private startGame() {
        // 播放游戏背景音乐
        Audio.playMusic('audio/music/background_music');
    }
    
    private pauseGame() {
        // 暂停背景音乐
        Audio.pauseMusic();
    }
    
    private resumeGame() {
        // 恢复背景音乐
        Audio.resumeMusic();
    }
    
    private gameOver() {
        // 停止背景音乐
        Audio.stopMusic();
        
        // 播放游戏结束音效
        Audio.playSFX('audio/sfx/game_over');
    }
}

注意事项

  1. 音频格式: 推荐使用MP3或OGG格式的音频文件
  2. 文件大小: 控制音频文件大小,避免影响游戏加载速度
  3. 音量平衡: 确保不同音效之间的音量平衡
  4. 性能优化: 避免同时播放过多音效
  5. 资源管理: 及时释放不再使用的音频资源

扩展功能

音频淡入淡出

可以扩展AudioManager添加淡入淡出功能:

// 音乐淡入
public fadeInMusic(musicPath: string, duration: number = 2.0) {
    // 实现音乐淡入逻辑
}

// 音乐淡出
public fadeOutMusic(duration: number = 2.0) {
    // 实现音乐淡出逻辑
}

音效池管理

对于频繁播放的音效,可以实现音效池:

// 预加载常用音效
public preloadSFX(sfxPaths: string[]) {
    // 预加载音效到内存池
}

3D音效

对于需要空间音效的场景,可以扩展支持3D音效:

// 播放3D音效
public play3DSFX(sfxPath: string, position: Vec3) {
    // 实现3D音效播放
}

这个音频系统为游戏提供了完整的音频解决方案,支持菜单控制和代码调用,可以根据具体需求进行扩展和定制。