Auto-publish.

This commit is contained in:
nebulaliu 2026-04-07 19:54:56 +08:00
parent dd763bcb06
commit d179eb7782
174 changed files with 711 additions and 320 deletions

View File

@ -9,156 +9,191 @@ namespace WeChatWASM
{
/// <summary>
/// PC高性能小游戏构建预处理器
/// 负责在构建前向首场景注入 WXPCHPInitScript
///
/// 注入策略(优先级从高到低):
/// 1. 开发者已在场景中手动挂载 WXPCHPInitScript → 跳过注入
/// 2. WX_PCHP_ENABLED 宏已定义 → RuntimeInitializeOnLoadMethod 会自动创建,无需注入
/// 3. 走转换工具链但未手动挂载 → 兜底注入到首场景路径A 兼容)
///
/// 触发条件:
/// - 仅 Standalone (Windows/macOS) 构建时生效
/// - 未定义 WX_PCHP_ENABLED 时自动添加宏到 ScriptingDefineSymbols
/// </summary>
public class PCHPBuildPreProcessor : IPreprocessBuildWithReport
{
// SDK 脚本名称常量
private const string SDK_CLASS_NAME = "WeChatWASM.WXPCHPInitScript";
private const string SDK_GAMEOBJECT_NAME = "WXPCHPInitScript";
private const string PCHP_DEFINE_SYMBOL = "WX_PCHP_ENABLED";
public int callbackOrder => 0;
public void OnPreprocessBuild(BuildReport report)
{
Debug.Log("========================================");
Debug.Log("[PC高性能小游戏] PCHPBuildPreProcessor.OnPreprocessBuild 被调用");
Debug.Log("========================================");
// 只处理 Windows/Mac Standalone 构建
var buildTarget = report.summary.platform;
if (buildTarget != BuildTarget.StandaloneWindows64 &&
// 只处理 Standalone 构建
if (buildTarget != BuildTarget.StandaloneWindows64 &&
buildTarget != BuildTarget.StandaloneOSX)
{
Debug.LogWarning($"[PC高性能小游戏] 当前平台 {buildTarget} 不是 Windows/Mac跳过预处理");
return;
}
Debug.Log("[PC高性能小游戏] 开始预处理构建...");
Debug.Log("[PC高性能模式] PCHPBuildPreProcessor 开始预处理");
// 确保 WX_PCHP_ENABLED 宏已定义
EnsurePCHPDefineSymbol();
// 检查 SDK 脚本是否存在
var sdkType = FindTypeInAllAssemblies(SDK_CLASS_NAME);
if (sdkType == null)
{
Debug.LogWarning("[PC高性能模式] 未找到 WXPCHPInitScript 类型,跳过注入(可能需要重新编译)");
return;
}
// 检查首场景是否已有 WXPCHPInitScript 组件
if (IsSDKAlreadyInFirstScene())
{
Debug.Log("[PC高性能模式] 首场景中已存在 WXPCHPInitScript跳过注入");
return;
}
// RuntimeInitializeOnLoadMethod 会自动创建实例仅在路径A兼容模式下才注入
// 判断依据如果当前是从微信小游戏转换工具链触发的构建build target 此前是 WebGL/WeixinMiniGame
if (WXPCHPBuildHelper.IsPCHighPerformanceEnabled())
{
Debug.Log("[PC高性能模式] 转换工具链模式,兜底注入首场景");
InjectSDKToFirstScene(sdkType);
}
else
{
Debug.Log("[PC高性能模式] 非转换工具链模式,依赖 RuntimeInitializeOnLoadMethod 自动初始化");
}
}
/// <summary>
/// 确保 Standalone 平台的 ScriptingDefineSymbols 包含 WX_PCHP_ENABLED
/// </summary>
private void EnsurePCHPDefineSymbol()
{
var targetGroup = BuildTargetGroup.Standalone;
#if UNITY_2023_1_OR_NEWER
var namedTarget = UnityEditor.Build.NamedBuildTarget.Standalone;
var defines = PlayerSettings.GetScriptingDefineSymbols(namedTarget);
#else
var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup);
#endif
if (!defines.Contains(PCHP_DEFINE_SYMBOL))
{
var newDefines = string.IsNullOrEmpty(defines)
? PCHP_DEFINE_SYMBOL
: defines + ";" + PCHP_DEFINE_SYMBOL;
#if UNITY_2023_1_OR_NEWER
PlayerSettings.SetScriptingDefineSymbols(namedTarget, newDefines);
#else
PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, newDefines);
#endif
Debug.Log($"[PC高性能模式] 已自动添加 {PCHP_DEFINE_SYMBOL} 到 Standalone ScriptingDefineSymbols");
}
}
/// <summary>
/// 检查首场景是否已包含 WXPCHPInitScript 组件
/// </summary>
private bool IsSDKAlreadyInFirstScene()
{
var firstScenePath = GetFirstEnabledScene();
if (string.IsNullOrEmpty(firstScenePath)) return false;
var currentScenes = EditorSceneManager.GetSceneManagerSetup();
try
{
Debug.Log("[PC高性能小游戏] → 步骤1: 检查 WXPCHPInitScript 脚本是否存在");
EnsureSDKScriptExists();
var scene = EditorSceneManager.OpenScene(firstScenePath, OpenSceneMode.Single);
var existing = GameObject.Find(SDK_GAMEOBJECT_NAME);
Debug.Log("[PC高性能小游戏] → 步骤2: 向首场景注入 SDK GameObject");
InjectSDKToFirstScene();
Debug.Log("[PC高性能小游戏] ✅ 预处理完成!");
}
catch (System.Exception e)
{
Debug.LogError("========================================");
Debug.LogError($"[PC高性能小游戏] ❌ 预处理失败: {e.Message}\n{e.StackTrace}");
Debug.LogError("========================================");
throw;
}
}
/// <summary>
/// 在所有程序集中查找类型
/// </summary>
private System.Type FindTypeInAllAssemblies(string typeName)
{
foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(typeName);
if (type != null)
if (existing != null)
{
return type;
// 检查是否真的挂载了正确的组件
var sdkType = FindTypeInAllAssemblies(SDK_CLASS_NAME);
if (sdkType != null && existing.GetComponent(sdkType) != null)
{
return true;
}
}
}
return null;
}
/// <summary>
/// 确保 WXPCHPInitScript 脚本存在
/// </summary>
private void EnsureSDKScriptExists()
{
var sdkType = FindTypeInAllAssemblies(SDK_CLASS_NAME);
if (sdkType != null)
return false;
}
finally
{
Debug.Log($"[PC高性能小游戏] ✅ WXPCHPInitScript 脚本已加载 (程序集: {sdkType.Assembly.GetName().Name})");
return;
RestoreScenes(currentScenes);
}
// 脚本应该在 SDK Runtime 目录,如果找不到说明 SDK 安装有问题
Debug.LogError("[PC高性能小游戏] ❌ 找不到 WXPCHPInitScript 类型");
Debug.LogError("[PC高性能小游戏] 请确保 WX-WASM-SDK-V2 已正确安装");
throw new BuildFailedException("[PC高性能小游戏] 缺少 WXPCHPInitScript 脚本,请检查 SDK 安装");
}
/// <summary>
/// 向第一个启用的场景注入 SDK GameObject
/// 向首场景注入 SDK兜底方式
/// </summary>
private void InjectSDKToFirstScene()
private void InjectSDKToFirstScene(System.Type sdkType)
{
var firstScenePath = GetFirstEnabledScene();
if (string.IsNullOrEmpty(firstScenePath))
{
Debug.LogWarning("[PC高性能小游戏] 没有找到启用的场景,跳过注入");
Debug.LogWarning("[PC高性能模式] 没有启用的场景,跳过注入");
return;
}
var currentScenes = EditorSceneManager.GetSceneManagerSetup();
var scene = EditorSceneManager.OpenScene(firstScenePath, OpenSceneMode.Single);
// 删除旧的对象(兼容从 EmbeddedAppletSDK 迁移)
// 清理旧对象(兼容迁移)
var oldSDK = GameObject.Find("EmbeddedAppletSDK");
if (oldSDK != null)
{
Debug.Log("[PC高性能小游戏] 删除旧的 EmbeddedAppletSDK 对象");
Debug.Log("[PC高性能模式] 删除旧的 EmbeddedAppletSDK 对象");
GameObject.DestroyImmediate(oldSDK);
}
// 检查是否已存在新的 SDK 对象
// 删除已存在的同名对象
var existingSDK = GameObject.Find(SDK_GAMEOBJECT_NAME);
if (existingSDK != null)
{
Debug.Log($"[PC高性能小游戏] 场景中已存在 {SDK_GAMEOBJECT_NAME},重新创建");
GameObject.DestroyImmediate(existingSDK);
}
// 创建 GameObject 并添加组件
// 创建并挂载
var assemblyName = sdkType.Assembly.GetName().Name;
if (assemblyName.Contains("Editor"))
{
Debug.LogError("[PC高性能模式] WXPCHPInitScript 在 Editor 程序集中,无法用于 Runtime");
throw new BuildFailedException("[PC高性能模式] WXPCHPInitScript 必须在 Runtime 程序集");
}
var sdkObject = new GameObject(SDK_GAMEOBJECT_NAME);
var sdkType = FindTypeInAllAssemblies(SDK_CLASS_NAME);
if (sdkType != null)
{
var assemblyName = sdkType.Assembly.GetName().Name;
Debug.Log($"[PC高性能小游戏] 找到 WXPCHPInitScript程序集: {assemblyName}");
if (assemblyName.Contains("Editor"))
{
Debug.LogError("[PC高性能小游戏] ❌ WXPCHPInitScript 在 Editor 程序集中!");
GameObject.DestroyImmediate(sdkObject);
throw new BuildFailedException("[PC高性能小游戏] WXPCHPInitScript 必须在 Runtime 程序集");
}
sdkObject.AddComponent(sdkType);
Debug.Log($"[PC高性能小游戏] ✅ 已在 {scene.name} 中创建 {SDK_GAMEOBJECT_NAME} 并添加组件");
}
else
{
Debug.LogError("[PC高性能小游戏] ❌ 找不到 WXPCHPInitScript 类型");
GameObject.DestroyImmediate(sdkObject);
throw new BuildFailedException("[PC高性能小游戏] 无法找到 WXPCHPInitScript 组件");
}
sdkObject.AddComponent(sdkType);
Debug.Log($"[PC高性能模式] ✅ 已在 [{scene.name}] 注入 {SDK_GAMEOBJECT_NAME}");
EditorSceneManager.MarkSceneDirty(scene);
EditorSceneManager.SaveScene(scene);
RestoreScenes(currentScenes);
}
private System.Type FindTypeInAllAssemblies(string typeName)
{
foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(typeName);
if (type != null) return type;
}
return null;
}
private string GetFirstEnabledScene()
{
foreach (var scene in EditorBuildSettings.scenes)
{
if (scene.enabled)
{
return scene.path;
}
if (scene.enabled) return scene.path;
}
return null;
}

View File

@ -0,0 +1,286 @@
# PC 高性能小游戏开发指南
## 目录
- [架构概览](#架构概览)
- [两条接入路径](#两条接入路径)
- [文件结构](#文件结构)
- [宏开关机制](#宏开关机制)
- [初始化机制](#初始化机制)
- [构建流程](#构建流程)
- [通信协议](#通信协议)
- [问题排查](#问题排查)
- [调试工具](#调试工具)
- [更新日志](#更新日志)
---
## 架构概览
```
C# (Unity) ←→ direct_applet_sdk.dll ←→ 微信内核 ←→ 基础库
```
| 模块 | 职责 |
|------|------|
| `WXPCHPInitScript` | MonoBehaviour运行时核心——DLL P/Invoke、消息收发、回调调度 |
| `WXPCHighPerformanceManager` | 门面类,提供类似 `wx.xxx()` 的上层 API |
| `PCHPBuildPreProcessor` | 构建预处理器,自动管理宏定义和场景注入(兜底) |
| `WXPCHPBuildHelper` | 路径A 构建配置助手(转换工具链集成) |
| `WXPCHPWindow` | Editor 窗口 UI + 宏开关菜单 |
| `WXPCSettingHelper` | 路径B 构建设置管理(独立窗口) |
| `WXApkgPacker` | wxapkg 打包工具 |
---
## 两条接入路径
```
路径 A: "转换工具链" ← 走 WX-WASM-SDK 转换面板,项目本身是小游戏工程
路径 B: "原生接入" ← 项目本身就是 Standalone只想接 PC 高性能能力
```
| 维度 | 路径 A转换工具链 | 路径 B原生接入 |
|------|---------------------|-------------------|
| **宏定义** | 转换工具/PreProcessor 自动添加 `WX_PCHP_ENABLED` | 开发者通过菜单一键开启,或手动添加 |
| **Build Target** | WebGL/WeixinMiniGame → 临时切 Standalone → 切回 | 始终 Standalone不切换 |
| **初始化方式** | `RuntimeInitializeOnLoadMethod` 自动 + PreProcessor 兜底注入 | `RuntimeInitializeOnLoadMethod` 自动,或开发者手动挂载 |
| **Editor 入口** | "微信小游戏 → 生成并转换" 面板 | "微信小游戏 → 转换PC高性能模式" 独立窗口 |
| **构建后** | `RestoreToMiniGamePlatform()` 恢复平台 | 不恢复,保持 Standalone |
| **多平台兼容** | `WX_PCHP_ENABLED` 不在 WebGL 下定义,无干扰 | `WX_PCHP_ENABLED` 只在 Standalone 下定义Android/iOS 不受影响 |
---
## 文件结构
```
WX-WASM-SDK-V2/
├── Editor/PCHighPerformance/
│ ├── PCHPBuildPreProcessor.cs # 构建预处理器(宏管理 + 兜底注入)
│ ├── WXPCHPBuildHelper.cs # 路径A 构建配置助手
│ ├── WXPCHPWindow.cs # 编辑器窗口 + WX_PCHP_ENABLED 宏开关菜单
│ ├── WXPCSettingHelper.cs # 路径B 构建设置管理
│ └── WXApkgPacker.cs # wxapkg 打包
└── Runtime/
└── WXPCHPInitScript.cs # SDK 运行时脚本(整文件 #if WX_PCHP_ENABLED
```
---
## 宏开关机制
### `WX_PCHP_ENABLED` — 总开关
**作用**:控制 `WXPCHPInitScript.cs``WXPCHighPerformanceManager` 是否参与编译。
**未定义时**Runtime 脚本整文件跳过编译Android/iOS/WebGL 等平台完全无干扰。
**定义方式**(三选一):
| 方式 | 适用场景 |
|------|---------|
| Editor 菜单:`微信小游戏 → PC高性能模式宏开关` | 路径B一键切换 |
| `PCHPBuildPreProcessor` 自动添加 | 路径A/BStandalone 构建时自动 |
| 手动:`Player Settings → Scripting Define Symbols` 添加 `WX_PCHP_ENABLED` | 任何路径 |
### `UNITY_STANDALONE_WIN` — 平台细分
`user32.dll``GetActiveWindow`、`MessageBox`)的 P/Invoke 声明被 `#if UNITY_STANDALONE_WIN` 包裹macOS 构建时不会引入。
---
## 初始化机制
### 三级策略(优先级从高到低)
| 优先级 | 方式 | 说明 |
|--------|------|------|
| 1 | **开发者手动挂载** | 场景中已存在 `WXPCHPInitScript` 组件 → `AutoInitialize` 检测到 `Instance != null`,跳过 |
| 2 | **`RuntimeInitializeOnLoadMethod`** | 场景加载后自动创建 GameObject 并挂载,零侵入不修改任何场景文件 |
| 3 | **构建时注入(兜底)** | `PCHPBuildPreProcessor` 在路径A 转换工具链模式下注入首场景 |
### 运行时初始化流程
`WXPCHPInitScript.Initialize()``Awake` 时触发5 步串行:
```
InitEmbeddedGameSDK() → 加载 DLL初始化底层 SDK
RegisterAsyncMsgHandler() → 注册 C# 静态回调到 DLL防 GC 回收)
EstablishConnection() → 建立 Mojo IPC 连接
GetActiveWindow() → Windows: 获取 HWND / macOS: IntPtr.ZeroDLL 内部处理)
InitGameWindow(hwnd) → 把窗口句柄传给内核,绑定渲染窗口
```
任何一步失败整个链路中断Windows 平台会弹 `MessageBox` 提示具体步骤。
---
## 构建流程
### PCHPBuildPreProcessor构建预处理器
**触发条件**:任何 Standalone (Windows/macOS) 构建
**流程**
```
构建开始
① 确保 WX_PCHP_ENABLED 宏已添加到 Standalone ScriptingDefineSymbols
② 检查 WXPCHPInitScript 类型是否存在
├─ 未找到 → 跳过(可能需要宏生效后重新编译)
└─ 找到 → 继续
③ 检查首场景是否已有 WXPCHPInitScript 组件
├─ 已有 → 跳过注入(开发者手动挂载的)
└─ 没有 → 检查是否为转换工具链模式
├─ 是 → 兜底注入到首场景
└─ 否 → 依赖 RuntimeInitializeOnLoadMethod 自动初始化
```
### 路径A — 转换工具链构建WXPCHPBuildHelper
`WXConvertCore` 在小游戏构建完成后调用,额外步骤:
- 构建产物打包为 wxapkg 格式
- 构建完成后调用 `RestoreToMiniGamePlatform()` 恢复到 WebGL/WeixinMiniGame
### 路径B — 独立窗口构建WXPCSettingHelper
通过 `微信小游戏 → 转换PC高性能模式` 菜单打开,特点:
- 自动确保 `WX_PCHP_ENABLED` 宏已定义
- 不强制注入场景(依赖 `RuntimeInitializeOnLoadMethod`
- 构建完成后 **不恢复平台**,保持 Standalone
---
## 通信协议
### 消息方向
| type | 方向 | 用途 |
|------|------|------|
| `"request"` | C# → 内核 | 调用 wx APIshowToast、login 等) |
| `"event_register"` | C# → 内核 | 订阅事件onShow、onHide 等) |
| `"event_unregister"` | C# → 内核 | 取消事件订阅 |
| `"response"` | 内核 → C# | API 回调success / fail / complete |
| `"event"` | 内核 → C# | 事件推送 |
### 线程模型
DLL 回调在非主线程,通过 `ConcurrentQueue` 转到主线程 `Update` 中处理:
```
DLL 线程: HandleAsyncMessage → 反序列化 → _messageQueue.Enqueue()
主线程: Update → ProcessMessageQueue → ProcessResponse → 触发回调
```
---
## 问题排查
### 快速检查清单
- [ ] `Player Settings → Scripting Define Symbols` 包含 `WX_PCHP_ENABLED`
- [ ] Build Settings 中有至少一个启用的场景
- [ ] 导出目录包含 `.exe``direct_applet_sdk.dll`(同级)
- [ ] 运行 .exe 后 Player.log 有 `[WXPCHPInitScript]` 日志
### 问题 1Android/iOS 构建时报 DLL 相关编译错误
**原因**`WX_PCHP_ENABLED` 宏被错误添加到了非 Standalone 平台
**解决**:在 `Player Settings → Scripting Define Symbols` 中,确保只有 Standalone 平台定义了 `WX_PCHP_ENABLED`。或通过菜单 `微信小游戏 → PC高性能模式宏开关` 关闭。
### 问题 2DLL 加载失败(~90% 的运行时问题)
**症状**:运行 .exe 后没有弹窗,日志报 `DllNotFoundException`
**验证导出目录结构**
```
导出路径/
├── YourGame.exe
├── direct_applet_sdk.dll ← 必须存在
└── YourGame_Data/
```
**解决**:确保 `direct_applet_sdk.dll``.exe` 同级
### 问题 3GetActiveWindow 返回空句柄
**原因**:窗口尚未创建时调用了初始化
**解决**:检查 Unity Player Settings确保非后台启动或考虑延迟初始化
**注意**macOS 平台会传 `IntPtr.Zero`,由 DLL 内部获取窗口句柄,这是正常行为。
### 问题 4宏添加后代码未生效
**原因**:修改 `ScriptingDefineSymbols` 后需要 Unity 重新编译脚本
**解决**:等待 Unity 编译完成(底部进度条),或手动 `Assets → Reimport All`
### 错误代码速查
| 错误信息 | 原因 | 解决 |
|----------|------|------|
| `DllNotFoundException` | DLL 不在 .exe 同级目录 | 复制 DLL 到 .exe 目录 |
| `EntryPointNotFoundException` | DLL 版本不匹配 | 更新 `direct_applet_sdk.dll` |
| `找不到 WXPCHPInitScript 类型` | SDK 未安装或宏未生效 | 重新导入 SDK 或等待编译 |
| `GetActiveWindow 返回空句柄` | 窗口未创建(仅 Windows | 延迟初始化或检查 Player Settings |
| `WXPCHPInitScript 必须在 Runtime 程序集` | 脚本放在了 Editor 目录 | 移到 Runtime 目录 |
---
## 调试工具
### 日志查看
**Player.log 位置**
- Windows: `%APPDATA%\..\LocalLow\<CompanyName>\<ProductName>\Player.log`
- macOS: `~/Library/Logs/<CompanyName>/<ProductName>/Player.log`
**搜索关键字**`[WXPCHPInitScript]`、`DllNotFoundException`、`InitEmbeddedGameSDK`
**正常日志示例**
```
[WXPCHPInitScript] 通过 RuntimeInitializeOnLoadMethod 自动创建
[WXPCHPInitScript] ========== Awake 被调用 ==========
[WXPCHPInitScript] ========== 开始初始化 ==========
[WXPCHPInitScript] Step 1: 调用 InitEmbeddedGameSDK
...
[WXPCHPInitScript] ========== 初始化完成 ==========
```
### Editor 菜单
| 菜单项 | 功能 |
|--------|------|
| 微信小游戏 → 转换PC高性能模式 | 打开路径B独立构建窗口 |
| 微信小游戏 → PC高性能模式宏开关 | 一键启用/禁用 `WX_PCHP_ENABLED` 宏 |
---
## 更新日志
### v2.0.0 (2026-04-07)
- **双路径架构**:支持"转换工具链"和"原生接入"两条路径
- **`WX_PCHP_ENABLED` 宏**总开关整文件条件编译Android/iOS 零干扰
- **`RuntimeInitializeOnLoadMethod`**:零侵入自动初始化,不再强制修改场景
- **`user32.dll` 平台隔离**`#if UNITY_STANDALONE_WIN` 包裹macOS 兼容
- **`RestoreToMiniGamePlatform` 解耦**:从 `BuildPCHighPerformance` 的 finally 移到调用方
- **Editor 宏开关菜单**`微信小游戏 → PC高性能模式宏开关`
### v1.1.0 (2026-03-02)
- 重命名 `EmbeddedAppletSDK``WXPCHPInitScript`
- 迁移脚本到 Runtime 目录
- 添加 `WeChatWASM` 命名空间
### v1.0.0 (2026-03-02)
- 实现自动注入 EmbeddedAppletSDK GameObject
- 智能检测并复制模板脚本
- 兼容 Windows 和 macOS 构建

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 44fbca8f9bf00174bea1068f569c4488
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -170,18 +170,14 @@ namespace WeChatWASM
Debug.LogException(e);
return false;
}
finally
{
// 恢复到小游戏构建目标,确保微信小游戏转换工具能正常加载
RestoreToMiniGamePlatform();
}
}
/// <summary>
/// 恢复到小游戏平台
/// 恢复到小游戏平台仅路径A——转换工具链——需要调用
/// 路径B原生 Standalone 接入)不应调用此方法
/// 团结引擎使用 WeixinMiniGameUnity 使用 WebGL
/// </summary>
private static void RestoreToMiniGamePlatform()
public static void RestoreToMiniGamePlatform()
{
#if TUANJIE_2022_3_OR_NEWER
// 团结引擎:切换到 WeixinMiniGame 平台

View File

@ -79,9 +79,10 @@ namespace WeChatWASM
// 提示信息
EditorGUILayout.HelpBox(
"点击「生成并转换」将执行以下操作:\n" +
"1. 向首场景注入 WXPCHPInitScript 脚本\n" +
"1. 自动添加 WX_PCHP_ENABLED 宏到 Standalone 平台\n" +
"2. 构建 Standalone 可执行文件\n" +
"3. SDK 初始化时会弹窗展示各步骤进度",
"3. 运行时通过 RuntimeInitializeOnLoadMethod 自动初始化 SDK\n\n" +
"提示:开发者也可以手动在场景中挂载 WXPCHPInitScript 来精确控制初始化时机",
MessageType.Info);
EditorGUILayout.EndScrollView();
@ -161,11 +162,15 @@ namespace WeChatWASM
try
{
// Step 1: 注入 WXPCHPInitScript 到首场景
EditorUtility.DisplayProgressBar("PC高性能模式", "正在向首场景注入 SDK 脚本...", 0.1f);
InjectSDKToFirstScene();
// Step 1: 确保 WX_PCHP_ENABLED 宏已定义
EditorUtility.DisplayProgressBar("PC高性能模式", "正在检查 WX_PCHP_ENABLED 宏...", 0.05f);
EnsurePCHPDefineSymbol();
// Step 2: 切换构建目标
// Step 2: 检查首场景是否已有 SDK有则跳过注入依赖 RuntimeInitializeOnLoadMethod
EditorUtility.DisplayProgressBar("PC高性能模式", "正在检查 SDK 注入状态...", 0.1f);
CheckAndOptionallyInjectSDK();
// Step 3: 切换构建目标
EditorUtility.DisplayProgressBar("PC高性能模式", "正在切换构建目标...", 0.2f);
var originalTarget = EditorUserBuildSettings.activeBuildTarget;
if (originalTarget != buildTarget)
@ -174,11 +179,11 @@ namespace WeChatWASM
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, buildTarget);
}
// Step 3: 配置 Player Settings
// Step 4: 配置 Player Settings
EditorUtility.DisplayProgressBar("PC高性能模式", "正在配置 Player Settings...", 0.3f);
ConfigurePlayerSettings();
// Step 4: 准备输出目录
// Step 5: 准备输出目录
if (!Directory.Exists(fullExportPath))
{
Directory.CreateDirectory(fullExportPath);
@ -191,7 +196,7 @@ namespace WeChatWASM
? Path.Combine(fullExportPath, $"{productName}.app")
: Path.Combine(fullExportPath, $"{productName}.exe");
// Step 5: 获取场景列表
// Step 6: 获取场景列表
var scenes = GetEnabledScenes();
if (scenes.Length == 0)
{
@ -200,7 +205,7 @@ namespace WeChatWASM
return;
}
// Step 6: 执行构建
// Step 7: 执行构建
EditorUtility.DisplayProgressBar("PC高性能模式", "正在构建 Standalone...", 0.5f);
Debug.Log($"[PC高性能模式] 开始构建,输出: {executablePath}");
@ -224,6 +229,7 @@ namespace WeChatWASM
Debug.LogError($"[PC高性能模式] 构建失败: {report.summary.result}");
EditorUtility.DisplayDialog("构建失败", $"构建失败: {report.summary.result}\n\n请查看 Console 获取详细错误信息", "确定");
}
// 注意路径B 不调用 RestoreToMiniGamePlatform(),保持 Standalone 平台
}
catch (System.Exception e)
{
@ -233,71 +239,86 @@ namespace WeChatWASM
}
}
#region Scene Injection
/// <summary>
/// 确保 WX_PCHP_ENABLED 宏已定义
/// </summary>
private void EnsurePCHPDefineSymbol()
{
var targetGroup = BuildTargetGroup.Standalone;
#if UNITY_2023_1_OR_NEWER
var namedTarget = UnityEditor.Build.NamedBuildTarget.Standalone;
var defines = PlayerSettings.GetScriptingDefineSymbols(namedTarget);
#else
var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup);
#endif
if (!defines.Contains("WX_PCHP_ENABLED"))
{
var newDefines = string.IsNullOrEmpty(defines)
? "WX_PCHP_ENABLED"
: defines + ";WX_PCHP_ENABLED";
#if UNITY_2023_1_OR_NEWER
PlayerSettings.SetScriptingDefineSymbols(namedTarget, newDefines);
#else
PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, newDefines);
#endif
Debug.Log("[PC高性能模式] 已自动添加 WX_PCHP_ENABLED 宏");
}
}
/// <summary>
/// 向首场景注入 WXPCHPInitScript
/// 检查首场景是否已有 SDK 组件,没有时可选注入
/// 有 RuntimeInitializeOnLoadMethod 兜底,场景注入不再是必须
/// </summary>
private void InjectSDKToFirstScene()
private void CheckAndOptionallyInjectSDK()
{
// 查找脚本类型
var sdkType = FindTypeInAllAssemblies(SDK_CLASS_NAME);
if (sdkType == null)
{
throw new System.Exception($"找不到 {SDK_CLASS_NAME} 类型,请确保 WX-WASM-SDK-V2 已正确安装");
Debug.LogWarning($"[PC高性能模式] 未找到 {SDK_CLASS_NAME},可能需要等待宏生效后重新编译");
return;
}
var assemblyName = sdkType.Assembly.GetName().Name;
Debug.Log($"[PC高性能模式] 找到 WXPCHPInitScript程序集: {assemblyName}");
if (assemblyName.Contains("Editor"))
{
throw new System.Exception("WXPCHPInitScript 在 Editor 程序集中,无法用于 Runtime 构建!请确保脚本放在 Runtime 目录下");
}
// 获取首场景
// 检查首场景
var firstScenePath = GetFirstEnabledScenePath();
if (string.IsNullOrEmpty(firstScenePath))
{
throw new System.Exception("没有启用的场景,请在 Build Settings 中添加场景");
}
if (string.IsNullOrEmpty(firstScenePath)) return;
// 打开首场景
var currentScenes = EditorSceneManager.GetSceneManagerSetup();
var scene = EditorSceneManager.OpenScene(firstScenePath, OpenSceneMode.Single);
// 清理旧对象
var oldSDK = GameObject.Find("EmbeddedAppletSDK");
if (oldSDK != null)
try
{
Debug.Log("[PC高性能模式] 删除旧的 EmbeddedAppletSDK 对象");
GameObject.DestroyImmediate(oldSDK);
var scene = EditorSceneManager.OpenScene(firstScenePath, OpenSceneMode.Single);
var existing = GameObject.Find(SDK_GAMEOBJECT_NAME);
if (existing != null && existing.GetComponent(sdkType) != null)
{
Debug.Log("[PC高性能模式] 首场景已有 WXPCHPInitScript跳过注入");
return;
}
// 清理旧对象
var oldSDK = GameObject.Find("EmbeddedAppletSDK");
if (oldSDK != null)
{
GameObject.DestroyImmediate(oldSDK);
}
// 场景中没有,但 RuntimeInitializeOnLoadMethod 会自动创建
Debug.Log("[PC高性能模式] 首场景无 SDK 组件,将依赖 RuntimeInitializeOnLoadMethod 自动初始化");
EditorSceneManager.SaveScene(scene);
}
// 删除已存在的同名对象(避免重复)
var existingSDK = GameObject.Find(SDK_GAMEOBJECT_NAME);
if (existingSDK != null)
finally
{
Debug.Log($"[PC高性能模式] 删除已存在的 {SDK_GAMEOBJECT_NAME},重新创建");
GameObject.DestroyImmediate(existingSDK);
}
// 创建新的 GameObject 并添加 WXPCHPInitScript
var sdkObject = new GameObject(SDK_GAMEOBJECT_NAME);
sdkObject.AddComponent(sdkType);
Debug.Log($"[PC高性能模式] ✅ 已在场景 [{scene.name}] 创建 {SDK_GAMEOBJECT_NAME} 并挂载 WXPCHPInitScript");
// 保存场景
EditorSceneManager.MarkSceneDirty(scene);
EditorSceneManager.SaveScene(scene);
// 恢复场景状态
if (currentScenes != null && currentScenes.Length > 0)
{
EditorSceneManager.RestoreSceneManagerSetup(currentScenes);
if (currentScenes != null && currentScenes.Length > 0)
{
EditorSceneManager.RestoreSceneManagerSetup(currentScenes);
}
}
}
#region Scene Helpers
/// <summary>
/// 在所有程序集中查找类型
/// </summary>

View File

@ -291,6 +291,9 @@ namespace WeChatWASM
{
Debug.Log("[微信小游戏] PC高性能版本构建完成!");
}
// 路径A转换工具链构建完成后恢复到小游戏平台
WXPCHPBuildHelper.RestoreToMiniGamePlatform();
}
return WXExportError.SUCCEED;

View File

@ -2,7 +2,7 @@ namespace WeChatWASM
{
public class WXPluginVersion
{
public static string pluginVersion = "202604020915"; // 这一行不要改他,导出的时候会自动替换
public static string pluginVersion = "202604071154"; // 这一行不要改他,导出的时候会自动替换
}
public class WXPluginConf

Binary file not shown.

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0f3c8e4abc7778dcf7afb3f801eedac6
guid: 5f88e66ea4282864644e2e5e1011730e
DefaultImporter:
externalObjects: {}
userData:

Binary file not shown.

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3c4e132ea08f5e5a107ea8baf0cbf5ff
guid: c2c222cb01cc594e2ae3d7616f478e87
DefaultImporter:
externalObjects: {}
userData:

Binary file not shown.

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3899a1b75c5ff784f41feb320b463939
guid: 9edae08cb16314fba8a9122b418d450e
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1216,15 +1216,22 @@ namespace WeChatWASM
/// });
/// }
/// </example>
#if WX_PCHP_ENABLED
public static WXPCHighPerformanceManager GetPCHighPerformanceManager()
{
#if UNITY_STANDALONE_WIN
return WXPCHighPerformanceManager.GetInstance();
#else
Debug.LogWarning("[WX] GetPCHighPerformanceManager 仅在 Windows 平台可用");
return null;
#endif
}
#else
/// <summary>
/// PC高性能模式管理器需启用 WX_PCHP_ENABLED 宏)
/// 未启用时返回 null
/// </summary>
public static object GetPCHighPerformanceManager()
{
Debug.LogWarning("[WX] GetPCHighPerformanceManager 需要启用 WX_PCHP_ENABLED 宏(仅 Standalone 平台可用)");
return null;
}
#endif
#endregion
}
}

View File

@ -1,3 +1,7 @@
// WX_PCHP_ENABLED: PC高性能模式总开关
// 路径A转换工具链: 由转换工具自动添加到 ScriptingDefineSymbols
// 路径B原生接入: 开发者手动添加,或通过 Editor 菜单一键开启
#if WX_PCHP_ENABLED
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
@ -172,13 +176,15 @@ namespace WeChatWASM
[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern bool Cleanup();
// 获取当前活动窗口句柄
// 获取当前活动窗口句柄Windows 专属)
#if UNITY_STANDALONE_WIN
[DllImport("user32.dll")]
private static extern IntPtr GetActiveWindow();
// Windows MessageBox
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);
#endif
#endregion
@ -248,6 +254,25 @@ namespace WeChatWASM
#endregion
#region Auto Initialize
/// <summary>
/// 自动初始化入口(零侵入)
/// 通过 RuntimeInitializeOnLoadMethod 在场景加载后自动创建
/// 如果开发者已手动在场景中挂载,则跳过
/// </summary>
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void AutoInitialize()
{
if (Instance != null) return;
var go = new GameObject("[WXPCHPInitScript]");
go.AddComponent<WXPCHPInitScript>();
Debug.Log("[WXPCHPInitScript] 通过 RuntimeInitializeOnLoadMethod 自动创建");
}
#endregion
#region Unity Lifecycle
private void Awake()
@ -346,11 +371,21 @@ namespace WeChatWASM
// 4. 获取窗口句柄并初始化游戏窗口
Debug.Log("[WXPCHPInitScript] Step 4: 获取窗口句柄");
ShowStepInfo("步骤 4/5 - GetActiveWindow", "正在获取游戏窗口句柄...");
#if UNITY_STANDALONE_WIN
WindowHandle = GetActiveWindow();
#else
// macOS: 暂不通过 P/Invoke 获取窗口句柄,传 0 由 DLL 内部处理
WindowHandle = IntPtr.Zero;
Debug.Log("[WXPCHPInitScript] macOS 平台,窗口句柄由 DLL 内部获取");
#endif
if (WindowHandle == IntPtr.Zero)
{
#if UNITY_STANDALONE_WIN
ShowError("GetActiveWindow 返回空句柄");
return;
#else
Debug.Log("[WXPCHPInitScript] macOS 平台,使用 IntPtr.Zero 作为窗口句柄");
#endif
}
Debug.Log($"获取窗口句柄成功: 0x{WindowHandle.ToInt64():X}");
ShowStepInfo("步骤 4/5 - GetActiveWindow ✅", $"窗口句柄获取成功: 0x{WindowHandle.ToInt64():X}");
@ -970,3 +1005,4 @@ namespace WeChatWASM
}
}
}
#endif // WX_PCHP_ENABLED

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4d94f319aa622b03849c8e69a8c7cba9
guid: 8424f563af07202539b47962b1171f45
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d2fcde627429d4818f85e18d2a1263f9
guid: 2bcf0e5ef117b0329e722c48d23cd3bd
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b2af85219bfaf6a05bd3bd6bc6d03829
guid: a60de89d65363da065ce30620be7d2a2
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: bdf3bca45f7097b129e204847282cd24
guid: 46325971494ef32de72eade3581bf639
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 82604dd9fc856ac2a8ba9c065b3f0f74
guid: c65b01109226ec978f02beb8df8d697f
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 848a462a23628985852dc620380dc698
guid: c77407f41c24b13ce5a1335dcb92a601
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1cd8e103dc8cb7c406056cbc19a0da7e
guid: e1427aadb307f0b99a7b1082841ebde7
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6852f18e86c0b0f9d687cd12e757be11
guid: b6d168fabe430b6a51312e609b6c31bb
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 92e78cafb9ee3bb507bb5f1d2d464323
guid: e5b9314324b387266cafe4b4c1a5abfc
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6f8a3fb7d545a9c2f4cb6d3c911e01f8
guid: 90396dde59d19dfe33617dcfba68b0ea
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 900b8f09ecdfa2e72a70b84c1eebb774
guid: e9d80f40f6aae296a333ab2777f02b22
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6755f00877ecd893631231910933d4ed
guid: d5f290134f725d60a83f883d9c85e475
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 27270731c7e1bdae791f9a891df08bca
guid: e28532aae9f4800ec1f6d58fc29441f1
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 05dff728b56a6788b0002a35db638ab3
guid: 1c9df8ca05b022c3bef83f3aa4108e28
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 94baa1b07b72979942f824d3fa4316b8
guid: 8957408231f54b05653df2654b2bc07b
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 33aecb9421d7577bff6a9cee399fc62f
guid: 638a98aafa5612e663a0713d7bff62bc
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c09a5b303d2369195c430976d5111957
guid: fb657b779a8fd12e736343e2e4f1b623
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 94afe4cf34619ee7284672597deadbdb
guid: a6cbd06ef5eac91de4f0a08755634c80
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f9f0235dd51f1b0c9efca63315546955
guid: 42cc0d09b6bf4f22e9f51867d2c8cba2
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b7d881fe3f7853c0fc3b0372496327ec
guid: 85804c7ad8ee88f334f40deb3a31e5d6
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 85bc5ab7146f11bd3745c05213267810
guid: bfe0d0083aa7aec2918f0a22171a33da
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c63d44cff96fed99b29285d650215e5b
guid: fa4180654bae24e2e529217ca74fbc14
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 748964f432130d20018c31e8ccf94765
guid: 384b974d85c643cc7a7618439b8ae81e
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 669b1053fadcb602f4808ba75e5cb3eb
guid: 623475344aea1a10ae7024f102995d58
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 132bf65501259226e755ef658860ce7c
guid: a0bd8131465fe83884270013588236a6
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f2e77f03fa4132105e406e7b4e920986
guid: c027021f07b77c92778905e05ba13cf1
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: cfd0447c19143ba4c424d510171c4749
guid: daf468fdbbe326f9de1767a27e3fbfab
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: de5d6956a4f8c950b00f2975a06c31b8
guid: 8e927238e52d845fdc26c7924db9d88c
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4cd850965eb65ecb2add3c82a65c7636
guid: 7a8cfb837c388b6e4bd87b8d48410617
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3b95c88fdcefc84eff7698ef331072d5
guid: cde824c5fbdd03d655eccc6daa2363fd
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1599136c65ba399a0736ed477cd3f9be
guid: df0ac0963ba42d6a27c62ec53cea34ad
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 465f79e042f08f54238942e70a8ed88e
guid: 69655f37a48ceb0953e638c726976a26
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: cce28cd7abeb995a7ba56195e81169ba
guid: df0535f823adde07414614ca2c5c2188
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 5359d80250e657a8a992b76900a885f9
guid: cae8f141c91a33a3b6b8558100483734
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b79c7144b7ef9c8be6c4acb2a21c1c1d
guid: c8cf97cd6379d1edc46fb09670c310d4
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d07f88297badc254af33d46394906cda
guid: 65c5a014d8638aaeac8e1bfc7cf88582
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: dd6f9000617f9b2eca85bc6d599f1dd9
guid: 6034018ade466dcd864ed79c2640517c
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f6327ad840f6a9069dd66ae83074db0b
guid: 0392e336004c42d47bca8b9f87bb5800
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b7bf48e81d891374a332b739fd1c40f7
guid: f92a3ce9f6dedda588257b3ecce257c5
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 741288a35af3a4b2c223537a51b417a6
guid: b40720710e0dba053bf6caa55b8833e7
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 80c89ead5349646ae66ee700308752a5
guid: 3ae06336bbc2775edd35b12a2e14549e
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b1460f620a984af813434501139116dc
guid: 0acfabfece9e7763872b79b904d53582
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 76b847977e20e6da3636dbc85053ad63
guid: d556fc04afb0615a38079f70b8cc500b
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4c6345b052ef553a44d6ac3caa7f728b
guid: ffff1f42ad00b76875fd8033f50e6b44
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0fca09d72894fe57b36058f861fc0358
guid: 07036b3d18cbebea435da00ecbe42595
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 21ce6c9ad9c1f25f1edabfca8fdd815e
guid: 2c0e86a91b6c21559926932d56f51f21
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 02d787436f30a761a6576c6ac6342009
guid: 622be5a365b2e9a04c89c93d56a83cc8
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: fc7566ad1398845fc6a2e47416b0d8a8
guid: b09c77db145ce82695009a7739a97a3f
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: baa810234733b35571eae2421bbf9827
guid: 8a60744e1e76615c704e053b3aa1906d
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6d4e09752bc145ec949170babf1e3ad6
guid: b3720b1382f446ebfd0158f34aad8ea9
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6776648588f5283cef236aab3010cc97
guid: 8fce9fbe32413c7b5e913331250be992
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d3bf5af8a6c0a24dbe3f005cae269b3f
guid: 6e199f0bf4fa878631e1fefb2db994ea
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 57fd82a56e3a9dba280254cacafb06c1
guid: 90fc0325cf2f6227cf135d27057b0938
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: edf0a9a1546e0e70e1d8f3ccf6ce3f83
guid: 980c83d7fc6d04fdbd8d8756de7cf525
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: dae4cb4ecc6068f06c542ff84c6bd0e7
guid: a8b5b373fe7c6b247531b9da8f29c2c2
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2c0452e405b404a968d147b3853d9427
guid: 8e5605b45c9823649a1f3d19f7349d93
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 9fb16bd225561e6021d61508ac89f731
guid: 17819975331ba3a2f42109027c820c4c
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e9b49edc671d3713d68f76cca4583f2b
guid: b49bac036c5b14ed286bdccc63f5b430
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4e16ff1a8624dff18d20295a4e8d4441
guid: 4630f342112f3567329ec02a971fdd83
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 753e849f445689c7a3b964b271405451
guid: 987c9ae98f032f731665a0e842e38db6
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 58e440fe59f49a8b4d50db4b4d66803c
guid: 47978bab2ebcc81b53d196fc65132350
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c3cee16857cb4ecf47b34993780c7854
guid: e75e2b4d84ba34abdde047d08379789a
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 19fdc70a4fb20e875bb2d97a0c593225
guid: 17f875a3d952c9daa974ff374db6bd44
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 9795cee09e7fb8721ded3f3bc9731fd7
guid: 4806d289bc80d3506b807335fa33fd5b
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c1c2d57b345ad7106801b4a82839f91c
guid: c9cd7513f95945d7a65724abf1f4a6f9
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 453707e476646856dd5bd0e66137166c
guid: 2b4f5fd51f2aeff537f3673de4c2fd75
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 272557131fc9049c4239ad3a9692462d
guid: 4cbbf7278c69f5ca9e24c1184527a602
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 9e4d2ace703f22091167280977581e33
guid: 2840fe87346a58bb65db3c010fd3f4ee
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: fd4d798f8f8c23f76172ae483a36cf71
guid: e880670e39743b71b36b8038276b5ca2
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 21b143cea670ce892f9d285c056a6136
guid: 3f1ec9aab91c0b17d6adbf08b520f593
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 33c723c5dfb6e5dd50ef97273ace5fc9
guid: 0d791b5c3b2ed6c9a2727f2373fbff6d
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 31d270a90d730e386bb83a81aacae398
guid: 2fc8c25c9090ec6670b70e71a02be4cb
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 5145382ec9f44fd2685eed8c7a41330d
guid: 4a13e019764bc7a0df6fc6c81f10f866
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 51122850591c3b6bbb3539758424008e
guid: fc44551262dafd86b726650bac3e6e80
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6c1962cc2a1d7fc136c4260c175bd5cc
guid: 4a862f77dde3af6fd936b6a55a5770a2
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0d8e3b3e06a076b1e98a9b9c04029028
guid: 2cab313813b6439d257b7ed09d61e1bc
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 060ec75eb840f1a78fcd772bbeeb0920
guid: 55ecba2f616a873830fb499d0f3c0976
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 762b4822bbcbc0ce54c72022c373c568
guid: cfab9370b2c78ffc9d7b0ba0968f69f8
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ed94e81a5e7e3d4dde5f5c0f9de0e881
guid: 74c74b4eb0f29b9c2e213765cc491118
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2f11726c21d6bdd1cb5b3a72b583a3fc
guid: 4d5ea17ba0fb0ef28b1e799942359ff6
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 178b8e93dec252a3ccc82714264f88f5
guid: f3a051f274bae1a7ec8122d8c9d9177c
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 69153dbc7179ce029da32bcd58ced069
guid: b81f97f4093939cfccc265a7d9ade4ed
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a07253156709799c32dd1b2719a1da0b
guid: 67cfab09225213884234aa541c0c3987
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 05a24460db7e3d42ec790884d16d0a9a
guid: 099fa4b751a2d0681b721edec7b8a951
folderAsset: yes
DefaultImporter:
externalObjects: {}

Some files were not shown because too many files have changed in this diff Show More