|
|
@@ -1,6 +1,7 @@
|
|
|
-import { _decorator, Component, AudioClip, AudioSource, resources, Node, find, director } from 'cc';
|
|
|
+import { _decorator, Component, AudioClip, AudioSource, resources, Node, find, director, sys } from 'cc';
|
|
|
import { GameManager } from '../LevelSystem/GameManager';
|
|
|
import { BundleLoader } from '../Core/BundleLoader';
|
|
|
+import { SaveDataManager } from '../LevelSystem/SaveDataManager';
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
|
|
@ccclass('AudioManager')
|
|
|
@@ -54,6 +55,8 @@ export class AudioManager extends Component {
|
|
|
|
|
|
this.bundleLoader = BundleLoader.getInstance();
|
|
|
this.initializeAudioSources();
|
|
|
+ // 初始化后尝试应用存档中的音频设置
|
|
|
+ this.applyPersistedSettings();
|
|
|
}
|
|
|
|
|
|
public static getInstance(): AudioManager {
|
|
|
@@ -109,6 +112,60 @@ export class AudioManager extends Component {
|
|
|
// 设置初始音量
|
|
|
this.updateAllVolumes();
|
|
|
}
|
|
|
+
|
|
|
+ // 从存档或本地 audioSettings 恢复音量与开关状态
|
|
|
+ private applyPersistedSettings() {
|
|
|
+ try {
|
|
|
+ const sdm = SaveDataManager.getInstance();
|
|
|
+ let musicEnabled: boolean | undefined = undefined;
|
|
|
+ let soundEnabled: boolean | undefined = undefined;
|
|
|
+ let musicVolume: number | undefined = undefined;
|
|
|
+ let soundVolume: number | undefined = undefined;
|
|
|
+
|
|
|
+ if (sdm && typeof sdm.getSetting === 'function') {
|
|
|
+ musicEnabled = sdm.getSetting('musicEnabled');
|
|
|
+ soundEnabled = sdm.getSetting('soundEnabled');
|
|
|
+ musicVolume = sdm.getSetting('musicVolume');
|
|
|
+ soundVolume = sdm.getSetting('soundVolume');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 兼容旧的本地键 audioSettings(如果存档未初始化或缺值)
|
|
|
+ if (musicEnabled === undefined || soundEnabled === undefined || musicVolume === undefined || soundVolume === undefined) {
|
|
|
+ const raw = sys?.localStorage?.getItem('audioSettings');
|
|
|
+ if (raw) {
|
|
|
+ try {
|
|
|
+ const parsed = JSON.parse(raw);
|
|
|
+ musicEnabled = musicEnabled ?? parsed?.musicEnabled;
|
|
|
+ soundEnabled = soundEnabled ?? parsed?.soundEffectEnabled;
|
|
|
+ musicVolume = musicVolume ?? parsed?.musicVolume;
|
|
|
+ soundVolume = soundVolume ?? parsed?.soundEffectVolume;
|
|
|
+ } catch (e) {
|
|
|
+ // 无需处理解析错误
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 默认值与裁剪
|
|
|
+ const finalMusicEnabled = musicEnabled !== false;
|
|
|
+ const finalSoundEnabled = soundEnabled !== false;
|
|
|
+ const finalMusicVolume = typeof musicVolume === 'number' ? Math.max(0, Math.min(1, musicVolume)) : this.musicVolume;
|
|
|
+ const finalSoundVolume = typeof soundVolume === 'number' ? Math.max(0, Math.min(1, soundVolume)) : this.soundEffectVolume;
|
|
|
+
|
|
|
+ // 应用到管理器内部状态
|
|
|
+ this.musicVolume = finalMusicEnabled ? finalMusicVolume : 0;
|
|
|
+ this.soundEffectVolume = finalSoundEnabled ? finalSoundVolume : 0;
|
|
|
+ this.uiSoundVolume = this.soundEffectVolume;
|
|
|
+ this.enemySoundVolume = this.soundEffectVolume;
|
|
|
+ this.environmentSoundVolume = this.soundEffectVolume;
|
|
|
+ this.weaponSoundVolume = this.soundEffectVolume;
|
|
|
+
|
|
|
+ this.updateAllVolumes();
|
|
|
+ console.log(`[AudioManager] 从存档恢复音量:music=${this.musicVolume}, sfx=${this.soundEffectVolume}`);
|
|
|
+ } catch (err) {
|
|
|
+ // 安静失败,不影响后续逻辑
|
|
|
+ console.warn('[AudioManager] 恢复音频设置失败,使用默认值');
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
public async playMusic(musicPath: string, loop: boolean = true) {
|
|
|
if (!this.musicAudioSource) {
|
|
|
@@ -591,15 +648,14 @@ export class Audio {
|
|
|
isInGame = !!(gameUI && (gameUI as Node).activeInHierarchy);
|
|
|
}
|
|
|
|
|
|
- Audio.stopMusic();
|
|
|
- Audio.setMusicVolume(0.8);
|
|
|
- if (isInGame) {
|
|
|
- Audio.playMusic('data/弹球音效/fight bgm', true);
|
|
|
- console.log('[Audio] 切换到游戏战斗音乐');
|
|
|
- } else {
|
|
|
- Audio.playMusic('data/弹球音效/ui bgm', true);
|
|
|
- console.log('[Audio] 切换到主界面背景音乐');
|
|
|
- }
|
|
|
+ // 保持用户设置的音量,不重置为固定值
|
|
|
+ Audio.setMusicVolume(manager.getMusicVolume());
|
|
|
+
|
|
|
+ // 仅当目标曲目与当前不同或未播放时才切换;
|
|
|
+ // playMusic 内部已防重,若同曲且正在播放会直接忽略。
|
|
|
+ const targetPath = isInGame ? 'data/弹球音效/fight bgm' : 'data/弹球音效/ui bgm';
|
|
|
+ Audio.playMusic(targetPath, true);
|
|
|
+ console.log(isInGame ? '[Audio] 维持/切换到游戏战斗音乐' : '[Audio] 维持/切换到主界面背景音乐');
|
|
|
} catch (err) {
|
|
|
console.error('[Audio] updateBGMByTopUI 失败:', err);
|
|
|
}
|