> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wanyouxi.online/llms.txt
> Use this file to discover all available pages before exploring further.

# 动态音乐系统 (Adaptive Music System)

> **摘要**：本文聚焦「动态音乐系统 (Adaptive Music System)」，梳理核心概念、关键方法与落地实践。

> **研究归属**: Project Vampirefall - Audio\
> **创建日期**: 2025-12-04\
> **优先级**: ⭐⭐⭐ (中)

## 📑 目录

1. [理论基础 (Theoretical Basis)](#-1-理论基础-theoretical-basis)

2. [实践应用 (Practical Implementation)](#️-2-实践应用-practical-implementation)

3. [业界优秀案例 (Industry Best Practices)](#-3-业界优秀案例-industry-best-practices)

4. [参考资料 (References)](#-4-参考资料-references)

***

## 📚 1. 理论基础 (Theoretical Basis)

### 1.1 核心定义

**动态音乐 (Adaptive Music)** 指随游戏状态（战斗强度、剧情进展、玩家位置）实时变化的背景音乐。它打破了传统"循环播放一首曲子"的模式，使听觉体验与玩家的情绪曲线同步。

两大核心技术：

1. **Vertical Layering (垂直分层)**: 多条音轨同步播放，通过调整各轨道的音量（Volume Automation）来改变音乐的丰富度。
   * *例子*: 探索时只有鼓点，战斗时加入吉他，高潮时加入人声。
2. **Horizontal Resequencing (水平重排)**: 根据状态跳转到乐曲的不同段落（Intro, Loop A, Loop B, Outro）。

   * *例子*: Boss 进入二阶段，音乐无缝切换到更激昂的变奏。

### 1.2 设计心理学

#### 📈 强度曲线 (Intensity Curve)

音乐必须匹配塔防的波次节奏：

* **Build Phase (建造阶段)**: 舒缓、神秘、低频为主（思考时间）。
* **Combat Phase (战斗阶段)**: 节奏加快、打击乐增强（紧张感）。
* **Climax (波次高潮)**: 全配器演奏、高频旋律（释放感）。

***

## 🛠️ 2. 实践应用 (Practical Implementation)

### 2.1 Vampirefall 音乐架构

我们采用 **垂直分层为主，水平切换为辅** 的混合架构。

#### 🎹 轨道设计 (Stems)

对于每一首战斗曲，我们需要作曲家提供 4 个同步轨道：

| 轨道                  | 内容             | 触发条件                 |
| :------------------ | :------------- | :------------------- |
| **Layer 1: Base**   | 氛围 Pad、低音 Bass | 始终播放 (建造阶段)          |
| **Layer 2: Rhythm** | 鼓组、打击乐         | 战斗开始 (第一只怪刷出)        |
| **Layer 3: Melody** | 主旋律 (弦乐/合成器)   | 怪物数量 > 20 或 精英怪出现    |
| **Layer 4: Hype**   | 高潮乐器 (电吉他/人声)  | Boss 战 或 基地血量 \< 30% |

### 2.2 核心逻辑实现 (Unity Native)

虽然 Wwise/FMOD 很强大，但对于独立游戏，Unity 原生 AudioSource 配合简单的管理器已足够。

```csharp theme={"theme":{"light":"github-light","dark":"github-dark"}}
public class MusicManager : MonoBehaviour
{
    [Header("Audio Sources")]
    public AudioSource layerBase;
    public AudioSource layerRhythm;
    public AudioSource layerMelody;
    public AudioSource layerHype;
    
    [Header("Settings")]
    public float fadeSpeed = 2.0f;
    
    // 目标音量 (0 或 1)
    private float[] targetVolumes = new float[4];
    
    void Update()
    {
        // 1. 获取当前游戏强度 (0-100)
        float intensity = GameDirector.Instance.GetCombatIntensity();
        
        // 2. 决定各轨道开关
        targetVolumes[0] = 1.0f; // Base 始终开启
        targetVolumes[1] = intensity > 0 ? 1.0f : 0.0f;
        targetVolumes[2] = intensity > 40 ? 1.0f : 0.0f;
        targetVolumes[3] = intensity > 80 ? 1.0f : 0.0f;
        
        // 3. 平滑过渡音量
        layerBase.volume = Mathf.Lerp(layerBase.volume, targetVolumes[0], Time.deltaTime * fadeSpeed);
        layerRhythm.volume = Mathf.Lerp(layerRhythm.volume, targetVolumes[1], Time.deltaTime * fadeSpeed);
        layerMelody.volume = Mathf.Lerp(layerMelody.volume, targetVolumes[2], Time.deltaTime * fadeSpeed);
        layerHype.volume = Mathf.Lerp(layerHype.volume, targetVolumes[3], Time.deltaTime * fadeSpeed);
    }
    
    // 确保所有轨道完全同步播放
    public void PlayTrack(MusicTrack track)
    {
        double dspTime = AudioSettings.dspTime + 0.1; // 稍微延迟以保证同步
        
        layerBase.clip = track.stemBase;
        layerRhythm.clip = track.stemRhythm;
        // ... 赋值其他轨道
        
        layerBase.PlayScheduled(dspTime);
        layerRhythm.PlayScheduled(dspTime);
        // ... 播放其他轨道
    }
}
```

### 2.3 音乐同步 (Music Sync)

为了让视觉特效（如屏幕震动、UI跳动）踩在点上，我们需要简单的 **BPM 系统**。

```csharp theme={"theme":{"light":"github-light","dark":"github-dark"}}
public class BeatSynchronizer : MonoBehaviour
{
    public float bpm = 120f;
    private float secondsPerBeat;
    private float nextBeatTime;
    
    public event Action OnBeat; // 节拍事件
    
    void Start()
    {
        secondsPerBeat = 60f / bpm;
        nextBeatTime = AudioSettings.dspTime + secondsPerBeat;
    }
    
    void Update()
    {
        if (AudioSettings.dspTime >= nextBeatTime)
        {
            OnBeat?.Invoke();
            nextBeatTime += secondsPerBeat;
        }
    }
}
```

***

## 🌟 3. 业界优秀案例 (Industry Best Practices)

### 3.1 DOOM Eternal (Mick Gordon)

#### ✅ 核心机制：暴力美学同步

* **机制**: 音乐与 Glory Kill (处决) 完美同步。处决时会触发特殊的短音效（Stinger），并无缝切回主旋律。
* **技术**: 极其复杂的水平重排系统，根据玩家动作（射击、移动、处决）实时混音。

#### 🎯 Vampirefall 借鉴点

* **Stinger**: 当玩家释放大招或塔防核心被攻击时，播放一个覆盖在背景音乐之上的高优先级短乐句，强调冲击力。

### 3.2 Hades (Darren Korb)

#### ✅ 核心机制：乐器剥离

* **机制**: 每一首曲子都有 "No Percussion" (无打击乐) 版本，用于战斗结束后的对话和选奖励环节。
* **风格**: 摇滚与地中海民乐的结合，乐器本身就带有强烈的叙事色彩。

#### 🎯 Vampirefall 借鉴点

* **无缝切换**: 战斗结束瞬间，立即 Mute 掉 Rhythm 和 Hype 轨道，只保留 Base 和 Melody，营造"尘埃落定"的松弛感。

### 3.3 Nier: Automata (Keiichi Okabe)

#### ✅ 核心机制：人声层

* **机制**: 只有在特定剧情高潮或 Boss 战关键阶段，才会淡入人声（Vocal）轨道。人声的加入通常标志着情感的升华。

#### 🎯 Vampirefall 借鉴点

* **Boss 狂暴**: Boss 血量低于 30% 进入狂暴状态时，淡入合唱团（Choir）人声轨道，营造史诗感和压迫感。

***

## 🔗 4. 参考资料 (References)

### 📄 必读文章

1. **"Vertical Layering vs Horizontal Resequencing"**
   * 来源: Audiokinetic Blog (Wwise)
   * 重点: 两种核心技术的优缺点对比。

2. **"The Music of DOOM"**

   * 来源: GDC Talk
   * 重点: 如何让音乐听起来像是在"回应"玩家的操作。

### 📺 视频分析

1. **"How Adaptive Music Works in Games"**
   * 频道: Scruffy
   * 链接: [YouTube](https://www.youtube.com/watch?v=2j3x0d8h0jU)

2. **"Mick Gordon on Composing for DOOM"**

   * 频道: GDC
   * 重点: 动态混音技术。

### 🛠️ 工具与资源

1. **FMOD Studio / Wwise**
   * 行业标准中间件（如果项目预算允许，建议使用）。

2. **Unity Audio Mixer**

   * Unity 内置的混音器，支持 Ducking (侧链压缩) 和 Snapshots (快照)，是实现动态混音的基础。

***

## 📊 总结

### 🎯 Vampirefall 实施建议

1. **4轨标准**: 向外包作曲家提需求时，明确要求提供 4 个同步分轨（Base, Rhythm, Melody, Hype）。

2. **强度检测**: 编写 `CombatIntensityEvaluator`，根据屏幕内怪物数量、精英怪权重、玩家血量计算一个 0-100 的强度值。

3. **侧链压缩**: 当重要音效（如爆炸、对话）播放时，自动压低背景音乐音量 (Auto-Ducking)，保证听感清晰。

***

**文档版本**: v1.0\
**最后更新**: 2025-12-04\
**维护者**: Vampirefall Audio Team
