### **方案一：主工程（LauncherForUnity）架构**

#### **核心目标**

- 作为空壳启动器，仅包含基础框架和动态加载逻辑。
- 核心功能通过 UPM 包管理，便于复用和版本控制。
- 动态加载美术团队提供的合规资源（AssetBundle）。

#### **目录结构**

```markdown
LauncherForUnity/
├── Assets/                 # 主工程资源（极简）
│   ├── App/                # 启动器的应用层逻辑
│   │   ├── Bootstrap.cs    # 启动器初始化逻辑
│   │   ├── Config/         # 本地配置文件（AB下载地址、密钥等）
│   │   └── UI/             # 启动器的基础UI（如加载界面）
│   ├── Scenes/             # 启动器场景（仅包含核心场景）
│   │   └── Launcher.unity
│   └── Resources/          # 内置资源（如启动器图标、占位图等）
│       └── DefaultLogo.png
│
├── Packages/               # UPM包目录（自动生成，勿手动管理）
│
├── InternalPackages/       # 本地开发的核心包源码
│   ├── com.inkzen.vrtheater.core/       # 核心包
│   │   ├── package.json                 # 核心包描述文件
│   │   ├── Runtime/                     # 核心运行时逻辑
│   │   │   ├── Managers/                # 核心管理器（如事件、任务）
│   │   │   └── Utilities/               # 核心工具类
│   │   ├── Editor/                      # 核心编辑器扩展
│   │   ├── Tests/                       # 核心包测试
│   │   └── Documentation~/              # 核心包文档
│   ├── com.inkzen.vrtheater.narrative/  # 叙事系统包
│   ├── com.inkzen.vrtheater.navigation/ # 导航包
│   └── com.inkzen.vrtheater.sdk/        # SDK包
│       ├── package.json
│       ├── Runtime/
│       │   ├── ResourceManager.cs       # 资源加载与校验逻辑
│       │   ├── AddressablesHelper.cs    # Addressables 封装
│       │   └── Protocols/               # 与美术工程的协议定义
│       ├── Tests/
│       │   └── ResourceManagerTests.cs  # 资源加载单元测试
│       └── Documentation~/              # SDK包文档
│
├── CI/                     # 持续集成
│   ├── build_launcher.sh   # 构建启动器脚本
│   ├── deploy_launcher.py  # 部署启动器到分发平台脚本
│   └── test_launcher.sh    # 运行启动器测试脚本
│
├── ThirdParty/             # 直接依赖的非 UPM 插件（仅限必要时使用）
│   └── MyLegacyPlugin/     # 示例：无法通过 UPM 管理的旧插件
│
├── Tests/                  # 启动器工程的测试代码（非包内部测试）
│   ├── PlayMode/           # 运行时测试（模拟启动器流程）
│   ├── EditMode/           # 编辑器测试（检查配置、编辑器逻辑）
│   └── TestUtils/          # 通用测试工具
│
├── manifest.json           # 包依赖配置
├── project-settings.asset  # Unity 项目设置（版本控制）
└── README.md               # 工程说明文档
```

#### **关键设计点**

1. **包依赖管理**
    
    - 在 `manifest.json` 中声明所有核心包，包括本地开发和私有注册表来源：
        
        ```json
        {
          "dependencies": {
            "com.inkzen.vrtheater.core": "file:../InternalPackages/com.inkzen.vrtheater.core",
            "com.inkzen.vrtheater.sdk": "file:../InternalPackages/com.inkzen.vrtheater.sdk",
            "com.unity.addressables": "1.19.19"  // 使用Addressables管理AB
          },
          "scopedRegistries": [
            {
              "name": "InkZen Internal",
              "url": "https://registry.inkzen.com",
              "scopes": ["com.inkzen"]
            }
          ]
        }
        ```
        
2. **动态资源加载流程**
    
    - **SDK 包职责**：
        - 提供 `ResourceManager` 类，通过 Addressables 或自定义逻辑下载并加载AB包。
        - 集成资源校验工具（如MD5校验），确保AB包完整性。
        - 定义与美术工程的协议（如AB包命名规则、元数据格式）。
3. **启动器最小化**
    
    - 启动器仅包含：
        - 初始化逻辑（加载配置、检查更新）。
        - 资源下载模块（调用SDK包）。
        - 空场景占位，动态加载美术资源后跳转至主场景。

### **1. Assets 文件夹：主工程资源最小化**

- **现状**：启动器的职责是最小化，保持工程资源尽量少。
- **优化点**：
    - 将美术素材、动态资源全部放到 AssetBundle（通过 Addressables 管理），`Assets` 文件夹仅保留启动器必须的资源。
    - **新增**：
        - `Scenes/` 文件夹：存储启动器的场景（如 `Launcher.unity`）。
        - `Resources/` 文件夹：存储启动器的本地静态资源，例如加载界面的 Logo 占位图。
        - `UI/` 子文件夹：存储启动器的基础 UI 逻辑（如 "加载中" 界面）。

---

### **2. InternalPackages 文件夹：模块化包设计**

- **现状**：你已经将核心逻辑拆分为多个本地包，设计良好。
- **优化点**：
    - **目录结构细化**：为每个包增加标准化的子目录，如 `Runtime/`、`Editor/`、`Tests/` 和 `Documentation~/`，符合 Unity Package 的规范。
        
    - **示例：SDK 包内部结构**：
        
        reasonml
        
        复制
        
        ```
        com.inkzen.vrtheater.sdk/
        ├── package.json
        ├── Runtime/
        │   ├── ResourceManager.cs        # 核心资源管理逻辑
        │   ├── AddressablesHelper.cs     # 封装 Addressables 的工具类
        │   ├── Protocols/                # 定义与美术团队的协议
        │   │   └── AssetBundleRules.cs
        │   └── Utilities/                # SDK 工具类
        ├── Editor/
        │   ├── SDKSettingsEditor.cs      # 编辑器扩展（如配置面板）
        │   └── SDKTools.cs               # SDK 调试工具
        ├── Tests/
        │   ├── Runtime/
        │   │   └── ResourceManagerTests.cs
        │   └── Editor/
        │       └── SDKSettingsEditorTests.cs
        └── Documentation~/
            └── README.md
        ```
        
    - **新增建议**：
        
        - **`Documentation~/`**：为每个包提供独立文档，帮助团队快速理解包的功能。
        - **测试模块化**：统一在 `Tests/Runtime/` 和 `Tests/Editor/` 下组织测试代码，便于测试覆盖率统计。

---

### **3. CI 文件夹：持续集成优化**

- **现状**：已有构建和部署脚本。
- **优化点**：
    - **新增测试脚本**：添加 `test_launcher.sh`，在构建和部署之前运行自动化测试。
    - **示例脚本内容**：
        
        bash
        
        复制
        
        ```
        #!/bin/bash
        echo "Running Launcher tests..."
        /Applications/Unity/Hub/Editor/2022.3.0f1/Unity.app/Contents/MacOS/Unity \
            -batchmode -nographics -projectPath "$(pwd)" \
            -runTests -testResults ./CI/TestResults.xml \
            -quit
        ```
        
    - **自动化流程**：
        - **测试 → 构建 → 部署** 三步流程，确保稳定性。
        - 使用测试结果（如 `TestResults.xml`）生成报告。

---

### **4. 引入 ThirdParty 文件夹（仅限必要时使用）**

- **现状**：未提到如何处理无法通过 UPM 管理的旧插件。
- **新增建议**：
    - 添加 `ThirdParty/` 文件夹，用于存放无法通过 UPM 管理的插件或工具。
    - **目录示例**：
        
        复制
        
        ```
        ThirdParty/
        ├── MyLegacyPlugin/
        │   ├── Scripts/
        │   ├── Editor/
        │   └── LICENSE.txt
        ```
        
    - **注意事项**：
        - 尽量减少使用 `ThirdParty` 文件夹，优先使用 UPM 包。
        - 在 `README.md` 中记录插件的来源、版本和用途。

---

### **5. 测试文件夹：独立测试工程**

- **现状**：缺少独立的测试文件夹。
- **优化点**：
    - 在主工程添加 `Tests/` 文件夹，用于存放启动器的整体测试代码。
    - **新增目录**：
        
        复制
        
        ```
        Tests/
        ├── PlayMode/           # 模拟启动器运行的测试
        │   └── TestLauncherFlow.cs
        ├── EditMode/           # 启动器配置的编辑器测试
        │   └── TestLauncherConfig.cs
        ├── TestUtils/          # 通用测试工具
        │   └── MockNetwork.cs  # 模拟网络工具
        ```
        

---

## **总结**

1. **模块化包设计**：
    - 细化 `InternalPackages/` 下每个包的目录结构，符合 Unity Package 规范，便于扩展和测试。
2. **启动器资源最小化**：
    - 将美术资源动态加载，`Assets` 文件夹仅保留启动器所需的基础资源。
3. **持续集成优化**：
    - 新增测试脚本，确保构建和部署前的稳定性。
4. **处理旧插件**：
    - 引入 `ThirdParty/` 文件夹，作为非 UPM 插件的容器，避免污染主工程。