Compare commits

...

2 Commits

Author SHA1 Message Date
8f553a5591 增加热更代码混淆 2026-06-12 23:35:09 +08:00
333a146a0e 修复线上阻断 2026-06-12 17:56:35 +08:00
42 changed files with 801221 additions and 263 deletions

1
.gitignore vendored
View File

@ -46,6 +46,7 @@ obj/
/Temp
/Tools/MongoDB
Publish/
/Pack/
*/Temp/
*/TestResults/
/.claude

View File

@ -0,0 +1,94 @@
# 空引用异常
- 分类blocking
- Issue 数1
- `0.7.3f` 最近一天次数1
- 设备数合计1
- 报告生成2026-06-12 11:47:43
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [be8ba33741c7c959e4bff388decf5877](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/be8ba33741c7c959e4bff388decf5877?pid=10) | NullReferenceException | 1 | 1 | 2026-06-12 08:18:49 | Object reference not set to an instance of an object. |
## 设备上下文
### be8ba33741c7c959e4bff388decf5877
- 样本 CrashId`7997bf30a7de4592ba275e94beb9aa2c`
- 样本 DeviceId`fc-5c-ee-24-76-6f`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 08:18:49 | be8ba33741c7c959e4bff388decf5877 | | |
| 2026-06-12 08:18:49 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 08:12:46 | 9b415b4bbb546c66eba3a6b67f916d35 | | |
| 2026-06-11 20:55:53 | 6ff1f0f506a936917fe66abad560829d | | |
| 2026-06-11 18:42:48 | 01eaa6aefd9162eccc930c2450a63779 | | |
| 2026-06-10 20:18:08 | bb81bce180d8672f500aa9f2021ec9f8 | | |
| 2026-06-10 20:03:53 | bb81bce180d8672f500aa9f2021ec9f8 | | |
| 2026-06-10 19:59:22 | 9b415b4bbb546c66eba3a6b67f916d35 | | |
## 代码位置
- 第三方崩溃栈入口:`Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:244``OnDisable()` 根据 `DisableAction` 进入 `Stop()`
- 第三方停止链路:`Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:571` -> `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerLayer.cs:785` -> `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:356`
- 第三方空引用读点:`Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:561``NormalizedTime` 读取 `Length/Time` 时触发最终 `NullReferenceException`
- 项目侧候选触发入口:所有“播放 FadeOut 后 `SetActive(false)`/销毁挂 Animancer 的 UI 对象”的路径,优先看 `Unity/Assets/Scripts/TH1_UI/View/Base/View.cs:148``Unity/Assets/Scripts/TH1_UI/Core/CommonUI.cs:70``Unity/Assets/Scripts/TH1_UI/View/Common/UIConfirmPopupMono.cs:58`
- 同设备同秒伴随症状:`Releasing render texture that is set as Camera.targetTexture!`。项目中可见的目标纹理绑定在 `Unity/Assets/BundleResources/Prefab/UI/Info/UIInfoGridInfo.prefab:2284``:6909`,快速开关入口在 `Unity/Assets/Scripts/TH1_UI/View/Info/UIInfoGridInfoView.cs:302``:563`。这条目前只能作为伴随症状,不能直接证明为 Animancer NRE 根因。
## 解码结论
- OPS 反混淆命中为 0因为这条栈没有项目混淆符号CrashSight 已显示完整第三方 Animancer 调用链。
- 崩溃家族归并为“Animancer 组件禁用时 Stop 链路空引用”Unity 禁用某个挂有 `AnimancerComponent` 的对象时进入 `AnimancerComponent.OnDisable()`,默认 `DisableAction.Stop` 调用 `Stop()`,随后逐层停止 `AnimancerLayer/AnimancerState`,最终在 `AnimancerState.NormalizedTime` 读时间/长度时空引用。
- 设备上下文只暴露最终上报和同设备 ERROR 序列,`hasLogFile=false`,缺少完整 Unity 日志。因此本报告能确认“禁用/销毁 Animancer 对象触发第三方 Stop 链路 NRE”但不能唯一定位是哪一个 UI 实例触发。
- 同设备同一秒还有高频 `Releasing render texture that is set as Camera.targetTexture!`,说明该玩家当时也发生了预览相机/RenderTexture 生命周期问题;它和本 NRE 可能同属 UI/资源关闭时序问题,但当前样本不能证明二者有直接因果关系。
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先复现“打开/关闭带 Animancer 淡入淡出的弹窗或视图时立刻切换页面、销毁视图、退出场景”的路径;重点检查 UI 关闭时是否在 Animancer 内部仍有无效 state/playable 时触发 `OnDisable Stop`。若要修复,建议先在项目侧统一封装 UI 关闭前的 Animancer 停止/解绑策略,避免直接改第三方 Animancer 源码。

View File

@ -0,0 +1,42 @@
# 0.7.3f 最近一天建议关注文件
采集窗口2026-06-12 11:47:43CrashSight `last_1_day`,版本 `0.7.3f`
## Blocking 优先
| 文件 | 原因 |
|---|---|
| `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:244` | 崩溃栈进入点:`OnDisable()` 触发 `DisableAction.Stop`。第三方源码,建议只用于定位,不直接修改。 |
| `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerLayer.cs:785` | `Stop()` 遍历所有 state进入具体 `AnimancerState.Stop()`。 |
| `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:356` | `Stop()``Time = 0`,随后栈中读取 `NormalizedTime`。 |
| `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:561` | CrashSight 顶层空引用位置:`NormalizedTime`。 |
| `Unity/Assets/Scripts/TH1_UI/View/Base/View.cs:148` | 通用 View 关闭流程FadeOut 结束后 `SetActive(false)`,会触发挂载对象上的 `AnimancerComponent.OnDisable()`。 |
| `Unity/Assets/Scripts/TH1_UI/Core/CommonUI.cs:70` | 通用 UI Hide 流程,定时 `SetActive(false)`。 |
| `Unity/Assets/Scripts/TH1_UI/View/Common/UIConfirmPopupMono.cs:58` | 弹窗关闭动画结束后直接 `SetActive(false)`。 |
| `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideLibraryMusicPanelMono.cs:230` | 关闭/切换音乐库面板时显式 `Animancer.Stop()``SetActive(false)`,属于同类生命周期高风险路径。 |
## 同秒伴随症状
| 文件 | 原因 |
|---|---|
| `Unity/Assets/BundleResources/Prefab/UI/Info/UIInfoGridInfo.prefab:2284` | 预览相机绑定 `TileMapPreview.renderTexture`,对应高频 `Releasing render texture that is set as Camera.targetTexture!`。 |
| `Unity/Assets/BundleResources/Prefab/UI/Info/UIInfoGridInfo.prefab:6909` | 同上,第二个预览相机 targetTexture 绑定。 |
| `Unity/Assets/Materials/TileMapPreview.renderTexture` | 被预览相机引用的 RenderTexture 资源。 |
| `Unity/Assets/Scripts/TH1_UI/View/Info/UIInfoGridInfoView.cs:302` | Grid 预览相机快速启用后 0.001 秒关闭。 |
| `Unity/Assets/Scripts/TH1_UI/View/Info/UIInfoGridInfoView.cs:563` | City 预览相机快速启用后 0.001 秒关闭。 |
## 高频 LogError 后续排查
| 文件 | 原因 |
|---|---|
| `Unity/Assets/Scripts/TH1_Logic/AI/AIActionBase.cs:528` | `死循环了`8 次2 台设备。 |
| `Unity/Assets/Scripts/TH1_Logic/AI/AILogic.cs:179` | AI 死循环记录点补充日志。 |
| `Unity/Assets/Scripts/TH1_Logic/AI/AILogic.cs:230` | `存在相似action`,同一设备出现 1 次。 |
| `Unity/Assets/Scripts/TH1_Logic/Steam/SimpleP2P.cs:480` | `Connection failed - Reason: 1000`4 次3 台设备。 |
| `Unity/Assets/Scripts/TH1_Logic/Steam/SimpleP2P.cs:505` | `应用层拒绝连接 - 错误码: 1000`2 次2 台设备。 |
| `Unity/Assets/Scripts/TH1_AOT/ResourceLoader.cs:84` | `YooAssets.LoadAssetSync<MultilingualData>("Assets/BundleResources/Export/Multilingual")``GetAssetObject<MultilingualData>()` 返回 nullIssue: `949458f51e04d6cf3f4ff9ee18b7e160``f5aa9c0a1411b1f09fd13146d745090d``b176950b03c8f954ad35f9520da10d23`。 |
| `Unity/Assets/Scripts/TH1_Logic/Multilingual/MultilingualManager.cs:263` | `RefreshMultilingualData()` 懒加载 `_multilingualData`,调用栈来自 `UIOutsideWikiView.OnDispose()` 清理子物体时触发的 `MultilingualTextMono.OnEnable()`。 |
| `Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideWikiView.cs:589` | `DetachAndDestroy()``SetParent(null)``Destroy(go)`,该过程会让待销毁的多语言文本组件触发 `OnEnable()`,从而暴露多语言资源加载为空。 |
| `Unity/Assets/Scripts/TH1_Logic/Action/ActionLogic.cs:1215` | `CompleteExecute Player 不一致`1 次。 |
| `Unity/Assets/Scripts/TH1_Logic/Action/ActionLogic.cs:1397` | `UnitRendererMismatchBeforeAction` 数据层/渲染层 Unit 不一致3 次。 |
| `Unity/Assets/Scripts/TH1_Logic/Unit/UnitLogic.cs:683` | `Origin Player is null`1 次。 |

View File

@ -0,0 +1,38 @@
# CrashSight 0.7.3f 最近一天 ERROR 分析
- 捕获时间2026-06-12 11:47:43
- 筛选范围:`0.7.3f``last_1_day`ERROR未处理/处理中
- CrashSight numFound14
- 去重 Issue14
- blocking1 个 Issue1 次
- logerror13 个 Issue45 次
- 原始数据:`Temp\CrashSight\Daily_2026-06-12_0.7.3f`
## 阻断家族
| 家族 | Issue 数 | 次数 | 报告 |
|---|---:|---:|---|
| 空引用异常 | 1 | 1 | [blocking/001_null-reference.md](blocking/001_null-reference.md) |
## 非阻断高频
| 类别 | Issue 数 | 次数 |
|---|---:|---:|
| 其他项目诊断日志 | 4 | 25 |
| AI 计算死循环保护 | 1 | 8 |
| P2P/大厅连接失败诊断 | 2 | 6 |
| 多语言资源加载为空 | 3 | 3 |
| Origin Player 为空诊断 | 1 | 1 |
| 相似 Action 重复诊断 | 1 | 1 |
| 行动执行玩家不一致 | 1 | 1 |
## 报告
- [LogError Summary](logerror_summary.md)
- [空引用异常](blocking/001_null-reference.md)
- [建议关注文件清单](files_to_check.md)
## 说明
blocking 的判定只认真实异常类型、异常对象或调用栈;纯 `LogSystem.LogError` 业务状态诊断归入 logerror。
本次通过 CrashSight OpenAPI 抓取样本详情和同设备最近 ERROR 上报序列;若样本 `hasLogFile=false`,文档会明确标记上下文限制。

View File

@ -0,0 +1,36 @@
# LogError Summary
- 筛选范围:`0.7.3f``last_1_day`ERRORstatus `0,2`
- 捕获时间2026-06-12 11:47:43
- 非阻断 Issue13
- 非阻断次数45
## 分类汇总
| 类别 | Issue 数 | 次数 | 设备数 | 代码位置 | 示例 Issue |
|---|---:|---:|---:|---|---|
| 其他项目诊断日志 | 4 | 25 | 14 | RenderTexture 伴随日志可查 `Unity/Assets/BundleResources/Prefab/UI/Info/UIInfoGridInfo.prefab:2284``:6909``Unity/Assets/Scripts/TH1_UI/View/Info/UIInfoGridInfoView.cs:302``:563`Unit 渲染不一致可查 `Unity/Assets/Scripts/TH1_Logic/Action/ActionLogic.cs:1397` | 3b1873b47fcdc15a0284798ea83be004, 3734a997ed6d691a08e092e56913c40a, a63d7c50108ffe49f2c02217f3d8eee8 |
| AI 计算死循环保护 | 1 | 8 | 2 | Unity/Assets/Scripts\TH1_Logic\AI\AIActionBase.cs:528: LogSystem.LogError($"死循环了");<br>Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:179: LogSystem.LogError($"死循环了,最终记录点为:{MainEditor.Instance.BTNodeId}"); | 3e65a3369290cfa41e540f0612aefad5 |
| P2P/大厅连接失败诊断 | 2 | 6 | 5 | Unity/Assets/Scripts\TH1_Logic\Steam\SimpleP2P.cs:480: LogSystem.LogError($"Connection failed - Reason: {endReason}"); | 03e368c38bf498c0ede3d3d6b1a4ba9, 5bf29273f5c83382e8a559c3a51c64b1 |
| 多语言资源加载为空 | 3 | 3 | 1 | `Unity/Assets/Scripts/TH1_AOT/ResourceLoader.cs:84` 加载 `Assets/BundleResources/Export/Multilingual``GetAssetObject<MultilingualData>()` 返回 null调用点在 `Unity/Assets/Scripts/TH1_Logic/Multilingual/MultilingualManager.cs:263` | 949458f51e04d6cf3f4ff9ee18b7e160, f5aa9c0a1411b1f09fd13146d745090d, b176950b03c8f954ad35f9520da10d23 |
| Origin Player 为空诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:683: LogSystem.LogError($"Origin Player is null target.id:{target.Id}");<br>Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:738: LogSystem.LogError($"RecoverHealth Origin Player is null target.id:{target.Id}"); | 76c4a73c625af53a1601bc284e2e3013 |
| 相似 Action 重复诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:230: if(_sameCount > 5) LogSystem.LogError($"存在相似action ,记录点为:{MainEditor.Instance.BTNodeId} ," + | f1c119ee9f0c60b7f3a383def5491cd6 |
| 行动执行玩家不一致 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1215: LogSystem.LogError($"CompleteExecute Player 不一致 {ActionId.GetStringLog()}"); | 217a8eace225fadbb28fe9c001b38d7c |
## 明细
| Issue | 类别 | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---|---:|---:|---|---|
| [3b1873b47fcdc15a0284798ea83be004](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3b1873b47fcdc15a0284798ea83be004?pid=10) | 其他项目诊断日志 | UnityLogError | 22 | 11 | 2026-06-12 11:32:04 | Releasing render texture that is set as Camera.targetTexture! |
| [3e65a3369290cfa41e540f0612aefad5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3e65a3369290cfa41e540f0612aefad5?pid=10) | AI 计算死循环保护 | UnityLogError | 8 | 2 | 2026-06-12 10:59:12 | 死循环了 |
| [03e368c38bf498c0ede3d3d6b1a4ba9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/03e368c38bf498c0ede3d3d6b1a4ba9?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 4 | 3 | 2026-06-12 11:36:58 | Connection failed - Reason: 1000 |
| [5bf29273f5c83382e8a559c3a51c64b1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5bf29273f5c83382e8a559c3a51c64b1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 11:32:04 | 应用层拒绝连接 - 错误码: 1000可能原因1.对方未创建监听套接字 2.对方主动拒绝 3.对方游戏未运行 |
| [217a8eace225fadbb28fe9c001b38d7c](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/217a8eace225fadbb28fe9c001b38d7c?pid=10) | 行动执行玩家不一致 | UnityLogError | 1 | 1 | 2026-06-12 11:33:23 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : ThirdHero |
| [3734a997ed6d691a08e092e56913c40a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3734a997ed6d691a08e092e56913c40a?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:02 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=437, DataUnits=33, RenderUnits=34, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[436]: Version=436, MapHash=a2d84780acdfeabc1a2702f510a3ffa4 Action : Build Wonder : None Resource : Mine Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitA… |
| [76c4a73c625af53a1601bc284e2e3013](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/76c4a73c625af53a1601bc284e2e3013?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 08:27:06 | Origin Player is null target.id:430 |
| [949458f51e04d6cf3f4ff9ee18b7e160](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/949458f51e04d6cf3f4ff9ee18b7e160?pid=10) | 多语言资源加载为空 | UnityLogError | 1 | 1 | 2026-06-12 08:00:04 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [a63d7c50108ffe49f2c02217f3d8eee8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a63d7c50108ffe49f2c02217f3d8eee8?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:00 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=429, DataUnits=34, RenderUnits=35, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[428]: Version=428, MapHash=be3b9dab92fa24c2de8ac5f6baab80c1 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None … |
| [b176950b03c8f954ad35f9520da10d23](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b176950b03c8f954ad35f9520da10d23?pid=10) | 多语言资源加载为空 | UnityLogError | 1 | 1 | 2026-06-12 07:55:21 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [e0e8d47df59e68e38968a6d05ed1a882](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e0e8d47df59e68e38968a6d05ed1a882?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 07:48:53 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2242826177, ActionIndex=3149, DataUnits=61, RenderUnits=62, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3148]: Version=3148, MapHash=0ceb6f1746ddba5ef68843f17bc7ad60 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation… |
| [f1c119ee9f0c60b7f3a383def5491cd6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f1c119ee9f0c60b7f3a383def5491cd6?pid=10) | 相似 Action 重复诊断 | UnityLogError | 1 | 1 | 2026-06-12 10:59:09 | 存在相似action ,记录点为:771 ,Action为:Action : LearnTech Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : Trade PlayerAction : None AIParam : AllClear Tech : Trade CultureCardType : None 重复次数 :6 |
| [f5aa9c0a1411b1f09fd13146d745090d](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f5aa9c0a1411b1f09fd13146d745090d?pid=10) | 多语言资源加载为空 | UnityLogError | 1 | 1 | 2026-06-12 08:00:04 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |

View File

@ -0,0 +1,124 @@
{
"date": "2026-06-12",
"version": "0.7.3f",
"capture": {
"capturedAtUtc": "2026-06-12T03:47:43+00:00",
"capturedAtLocal": "2026-06-12 11:47:43",
"rawDir": "Temp\\CrashSight\\Daily_2026-06-12_0.7.3f",
"reportDir": "MD\\CrashSight_2026-06-12_0.7.3f_1day"
},
"filter": {
"version": "0.7.3f",
"date": "last_1_day",
"status": "0,2",
"exceptionCategoryList": "ERROR",
"sortField": "uploadTime",
"sortOrder": "desc",
"rows": 100
},
"totalIssues": 14,
"blockingIssues": 1,
"blockingOccurrences": 1,
"logerrorIssues": 13,
"logerrorOccurrences": 45,
"blockingReports": [
{
"categoryId": "null-reference",
"title": "空引用异常",
"issueCount": 1,
"occurrences": 1,
"path": "blocking/001_null-reference.md",
"issues": [
"be8ba33741c7c959e4bff388decf5877"
]
}
],
"categories": [
{
"id": "other-logerror",
"title": "其他项目诊断日志",
"class": "logerror",
"issueCount": 4,
"occurrences": 25,
"issues": [
"3b1873b47fcdc15a0284798ea83be004",
"3734a997ed6d691a08e092e56913c40a",
"a63d7c50108ffe49f2c02217f3d8eee8",
"e0e8d47df59e68e38968a6d05ed1a882"
]
},
{
"id": "ai-loop-guard",
"title": "AI 计算死循环保护",
"class": "logerror",
"issueCount": 1,
"occurrences": 8,
"issues": [
"3e65a3369290cfa41e540f0612aefad5"
]
},
{
"id": "p2p-lobby-connection-failure",
"title": "P2P/大厅连接失败诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 6,
"issues": [
"03e368c38bf498c0ede3d3d6b1a4ba9",
"5bf29273f5c83382e8a559c3a51c64b1"
]
},
{
"id": "multilingual-empty-id",
"title": "多语言资源加载为空",
"class": "logerror",
"issueCount": 3,
"occurrences": 3,
"issues": [
"949458f51e04d6cf3f4ff9ee18b7e160",
"f5aa9c0a1411b1f09fd13146d745090d",
"b176950b03c8f954ad35f9520da10d23"
]
},
{
"id": "origin-player-null-diagnostic",
"title": "Origin Player 为空诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"76c4a73c625af53a1601bc284e2e3013"
]
},
{
"id": "duplicate-similar-action",
"title": "相似 Action 重复诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"f1c119ee9f0c60b7f3a383def5491cd6"
]
},
{
"id": "null-reference",
"title": "空引用异常",
"class": "blocking",
"issueCount": 1,
"occurrences": 1,
"issues": [
"be8ba33741c7c959e4bff388decf5877"
]
},
{
"id": "action-completeexecute-player-mismatch",
"title": "行动执行玩家不一致",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"217a8eace225fadbb28fe9c001b38d7c"
]
}
]
}

View File

@ -0,0 +1,184 @@
# 空引用异常
- 分类blocking
- Issue 数4
- `0.7.3f` 最近一天次数13
- 设备数合计11
- 报告生成2026-06-12 16:25:01
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [dc1340f866d020b4b560a92559c89a21](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/dc1340f866d020b4b560a92559c89a21?pid=10) | NullReferenceException | 6 | 4 | 2026-06-12 16:03:14 | Object reference not set to an instance of an object. |
| [0b41041d271c3ca1128d6f10e46b27b2](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0b41041d271c3ca1128d6f10e46b27b2?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:31:04 | Object reference not set to an instance of an object. |
| [be8ba33741c7c959e4bff388decf5877](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/be8ba33741c7c959e4bff388decf5877?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:14:07 | Object reference not set to an instance of an object. |
| [0c808432af82e7b66883205719dbb199](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0c808432af82e7b66883205719dbb199?pid=10) | NullReferenceException | 1 | 1 | 2026-06-12 12:42:42 | Object reference not set to an instance of an object. |
## 设备上下文
### dc1340f866d020b4b560a92559c89a21
- 样本 CrashId`9d358b3dfdfd4f7190a195db17919deb`
- 样本 DeviceId`10-a5-1d-d7-c8-a9`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 16:19:06 | 17ad3797303c790702e726900b44d7a1 | | |
| 2026-06-12 16:18:37 | 6df319596397f5671ef968efb898f881 | | |
| 2026-06-12 16:18:37 | 7e0a6be9e06fe532cdb7190689ec4278 | | |
| 2026-06-12 16:18:36 | 294ddb9ea1ed79f4f9685b30604d29d1 | | |
| 2026-06-12 16:18:36 | bf8f3431f83bdb17e88844103a9457b5 | | |
| 2026-06-12 16:18:36 | 0fb8e72617856627c8e9fe73dad72806 | | |
| 2026-06-12 16:18:35 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 16:18:35 | bd5cfa8f38ec18d109c8d9687f4a6f2a | | |
### 0b41041d271c3ca1128d6f10e46b27b2
- 样本 CrashId`5ad98ebcb8f44bc39580417051d745bb`
- 样本 DeviceId`00-ff-fb-5d-e8-e7`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 16:21:58 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 16:21:15 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 16:21:15 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 16:21:14 | ed493d4b6926c3bb5efe569a5db211e3 | | |
| 2026-06-12 16:21:14 | 5506094b5e9df26bc4d5fd90349178cb | | |
| 2026-06-12 16:00:01 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:59:59 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:38:25 | 115622af2c5f78d14b4e6b900ba1d151 | | |
### be8ba33741c7c959e4bff388decf5877
- 样本 CrashId`7cc68a71c55b4abbab7c7cdb370d6a46`
- 样本 DeviceId`d4-93-90-2e-72-b4`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 16:11:35 | f5aa9c0a1411b1f09fd13146d745090d | | |
| 2026-06-12 15:54:43 | b176950b03c8f954ad35f9520da10d23 | | |
| 2026-06-12 15:54:43 | bae1cbeda505602c5dbbc984c0fa1d88 | | |
| 2026-06-12 15:54:42 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:14:07 | be8ba33741c7c959e4bff388decf5877 | | |
| 2026-06-12 15:14:06 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 15:10:32 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:05:27 | 3b1873b47fcdc15a0284798ea83be004 | | |
## 代码位置
- 未通过固定文本直接定位;需要结合解码栈继续追。
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,75 @@
# 重大事件公告 UI 空引用
- 分类blocking
- Issue 数1
- `0.7.3f` 最近一天次数1
- 设备数合计1
- 报告生成2026-06-12 16:25:01
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [fe24c7bf54531228f55d73530508a9fa](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/fe24c7bf54531228f55d73530508a9fa?pid=10) | UnityLogError | 1 | 1 | 2026-06-12 15:02:34 | EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object. at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0 at TH… |
## 设备上下文
### fe24c7bf54531228f55d73530508a9fa
- 样本 CrashId`18ce090edbf0448097312f6fd79db8d6`
- 样本 DeviceId`80-fa-5b-68-87-2b`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
UnityLogError
EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object.
at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Announce.UIAnnounceMajorEventController.OnOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TrueOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._OnViewStart () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TryOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].Open () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].OpenWithParam (System.Object param) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Presentation.Sequencer.Task.UISequencerTask.Execute (System.Action onComplete) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.TryProcessNext () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.EnqueueTask (TH1_Presentation.Sequencer.Task.ISequencerTask task, System.Boolean viewNextFrame) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Events.UIEventManagerBinder.HandleShowUIAnnounceMajorEvent (TH1_Core.Events.ShowUIAnnounceMajorEvent evt) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.EventManager.Publish[T] (T eventData) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main+<>c.<NetStartGame>b__50_0 () [0x00000] in <00000000000000000000000000000000>:0
at Timer.Update () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main.Update () [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.Debug.LogError(Object)
Logic.CrashSight.LogSystem.LogError(String, Object)
TH1_Core.Managers.EventManager.Pub
...
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:50:53 | 16bd34f1b4756ad8655c843c0f9da506 | | |
| 2026-06-12 15:50:52 | ed7645351344dd651c0a27dfc3573b10 | | |
| 2026-06-12 15:34:56 | 26e2c7ab0fb8fdb0d95355ae254b4995 | | |
| 2026-06-12 15:34:41 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:02:34 | fe24c7bf54531228f55d73530508a9fa | | |
| 2026-06-12 15:02:25 | 96f415d89f78f0ac31e19174e23246ba | | |
| 2026-06-12 15:02:25 | 29ea271af8759bbf7e679bf751ef6373 | | |
| 2026-06-12 15:02:24 | 519eac5f561dfb99ea775c5294065411 | | |
## 代码位置
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:16: public class UIAnnounceMajorEventView : Base.View`
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:63: LogSystem.LogError("UIAnnounceMajorEventView.SetContent(): Title or Content or Image or Image is null");`
- `Unity/Assets/Scripts\TH1_UI\Controller\Announce\UIAnnounceMajorEventController.cs:15: public class UIAnnounceMajorEventController : ViewController<UIAnnounceMajorEventView>, IEscClosable // 泛型参数是对应的View脚本`
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,261 @@
# 0.7.3f blocking 修复方案
数据来源:`MD/CrashSight_2026-06-12_0.7.3f_blocking_root_1624/blocking_root_causes.md`
## 修复优先级
1. P0`UIAnnounceMajorEventView.SetContent(StartGame)` 读取空 `Main.MapData`
2. P1UI Animancer 在 Disable 时执行 `Stop()` 导致空引用。
3. P1TMP 子网格在 UI Disable/Mask 刷新期间执行 `UpdateMaterial()` 导致空引用。
## 1. 开局重大事件公告空引用
### 问题
CrashSight 栈:
```text
Main+<>c.<NetStartGame>b__50_0()
EventManager.Publish<ShowUIAnnounceMajorEvent>()
UIAnnounceMajorEventView.SetContent(StartGame)
```
当前代码问题:
- `Main.NetStartGame()``Unity/Assets/Scripts/TH1_Logic/Core/Main.cs:617` 注册 `Main_CenterMessage_Anim`1.5 秒后发布 `StartGame` 公告。
- 公告事件进入 `PresentationManager.EnqueueTask()`,不保证马上打开 UI。
- UI 真正打开时,`Unity/Assets/Scripts/TH1_UI/View/Announce/UIAnnounceMajorEventView.cs:76` 直接读取 `Main.MapData.PlayerMap.SelfPlayerData`
- 同设备 9 秒前已经有 `OnGridInfoAction Error: Main.MapData is null`,说明这个窗口期里 `Main.MapData` 可能已经为空或被切走。
### 首选修复
做两层保护定时器入队前过滤旧任务View 打开时再次校验。
1. 在 `Main` 里把开局公告注册收敛成一个方法,三处注册点都调用它:
```csharp
private const string StartGameAnnouncementTimer = "Main_CenterMessage_Anim";
private void RegisterStartGameAnnouncement(MapData expectedMap)
{
Timer.Instance?.CancelByMessage(StartGameAnnouncementTimer);
Timer.Instance?.TimerRegister(this, () =>
{
if (!IsValidStartGameAnnouncementMap(expectedMap)) return;
if (!ReferenceEquals(MapData, expectedMap)) return;
EventManager.Publish(new ShowUIAnnounceMajorEvent
{
EventType = UIAnnounceMajorEventType.StartGame,
Map = expectedMap,
});
}, 1.5f, StartGameAnnouncementTimer);
}
private static bool IsValidStartGameAnnouncementMap(MapData map)
{
return map?.PlayerMap?.SelfPlayerData != null;
}
```
2. 给 `ShowUIAnnounceMajorEvent` 增加可选 `MapData Map` 字段。`UIEvents.cs` 当前已经引用了 `RuntimeData.MapData`,这是本地 UI 事件,不涉及网络序列化。
3. `UIAnnounceMajorEventController.OnOpen()` 不要只传 `EventType/Param1/Param2`,改成把整个事件传给 View。View 侧用 `evt.Map ?? Main.MapData`,并且如果是 `StartGame`,要求 `ReferenceEquals(Main.MapData, evt.Map)`
4. 把 `UIAnnounceMajorEventView.SetContent(...)` 改成返回 `bool` 或新增 `TrySetContent(...)`。如果 map/player/table 数据无效,返回 `false`Controller 立刻 `Close()`,避免空面板卡住演出队列。
5. 在会清空地图的路径取消定时器:
- `Main.Clear()`:先 `Timer.Instance?.CancelByMessage(StartGameAnnouncementTimer)`,再 `MapData = null`
- 已有 `AbortHostMultiStart()` 里取消了这个 timer保留。
- `UIManager.Instance.OnMatchEnd()`/`PresentationManager.OnMatchEnd()` 已经会清理演出队列;确保所有返回大厅/结束对局路径都走到它。
### 止血修复
如果先快速发一版,可以先在 `SetContent(StartGame)` 第 76 行前加保护:
```csharp
var map = Main.MapData;
var player = map?.PlayerMap?.SelfPlayerData;
if (player == null)
{
LogSystem.LogWarning("Skip StartGame announcement: Main.MapData or SelfPlayerData is null");
return false;
}
```
这能阻止 blocking但不是完整修复。完整修复仍要处理 stale timer/stale presentation task。
### 验证
- 联机成员进局后 1.5 秒内断线、强制重连、返回大厅,不能再出现 `fe24...`
- 开局公告正常显示时,`StartGame` 文案、领袖图、气泡仍正常。
- CrashSight 不再新增 `EventManager Publish<ShowUIAnnounceMajorEvent> listener failed`
## 2. Animancer OnDisable Stop 空引用
### 问题
CrashSight 栈:
```text
AnimancerComponent.OnDisable()
AnimancerComponent.Stop()
AnimancerState.Stop()
AnimancerState.set_Time()
AnimancerState.get_NormalizedTime()
```
当前代码/资源状态:
- `AnimancerComponent` 默认 `_ActionOnDisable``Stop`
- 很多 UI prefab 里 `_ActionOnDisable: 0`,也就是 `Stop`
- `Stop` 会把动画状态时间归零,过程中访问 `NormalizedTime/Length`。当内部 state/clip/playable 已经无效时,就会 NRE。
### 首选修复
UI 上的 Animancer 不要在 `OnDisable``Stop`,改成 `Pause`
推荐做一个统一 UI 初始化工具,而不是手工改散落 prefab
```csharp
public static void ConfigureUiAnimancers(GameObject root)
{
if (root == null) return;
var animancers = root.GetComponentsInChildren<AnimancerComponent>(true);
foreach (var animancer in animancers)
{
if (animancer == null) continue;
animancer.ActionOnDisable = AnimancerComponent.DisableAction.Pause;
}
}
```
调用点:
- `Unity/Assets/Scripts/TH1_UI/View/Base/View.cs:41` 获取 `_animancer` 后,对当前 View root 下所有 UI Animancer 执行配置。
- `Unity/Assets/Scripts/TH1_UI/Core/CommonUI.cs:30` 获取 `_animancer` 后执行配置。
- 有独立 `public AnimancerComponent Animancer` 的 panel mono也可以在 `Awake/OnEnable/Open` 前统一配置。
### 不建议的修复
- 不建议直接改 `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs` 的默认行为。它会影响非 UI 动画、单位动画、VFX风险比 UI 局部配置大。
- 不建议只改某一个 prefab因为 CrashSight 没有对象名,且 `_ActionOnDisable: 0` 分布很广。
### 验证
- `rg "_ActionOnDisable: 0" Unity/Assets/BundleResources/Prefab/UI`,确认 UI prefab 中默认 `Stop` 已被运行时配置覆盖,或者资源批处理改成 `1`
- 批量打开/关闭常见 UI公告、确认弹窗、BottomBar 弹窗、Outside 菜单、Wiki/图鉴、多人房间。
- CrashSight 不再新增 `be8ba33741c7c959e4bff388decf5877`
## 3. TMP_SubMeshUI.UpdateMaterial 空引用
### 问题
CrashSight 栈:
```text
TMP_SubMeshUI.UpdateMaterial()
TMP_SubMeshUI.SetMaterialDirty()
MaskableGraphic.OnDisable()
TMP_SubMeshUI.OnDisable()
```
或:
```text
TMP_SubMeshUI.UpdateMaterial()
TMP_SubMeshUI.SetMaterialDirty()
MaskUtilities.NotifyStencilStateChanged()
MaskableGraphic.OnDisable()
Image.OnDisable()
```
当前包源码问题:
- `TMP_SubMeshUI.SetMaterialDirty()``Unity/Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Runtime/TMP_SubMeshUI.cs:617` 直接调用 `UpdateMaterial()`
- `UpdateMaterial()` 只检查 `m_sharedMaterial == null`,随后读取 `textComponent.fontSharedMaterial``canvasRenderer`
- Disable/Destroy/Mask 刷新期间,父 `TextMeshProUGUI`、font material、canvas renderer 状态可能已经无效。
### 首选修复
不要直接改 `Library/PackageCache`,这个目录不是稳定源码。稳定方式是把 `com.unity.textmeshpro@3.0.7` embed 到项目 `Packages` 后再补丁。
补丁方向:
```csharp
public override void SetMaterialDirty()
{
m_materialDirty = true;
if (!isActiveAndEnabled)
return;
if (canvasRenderer == null)
return;
UpdateMaterial();
m_OnDirtyMaterialCallback?.Invoke();
}
protected override void UpdateMaterial()
{
if (m_sharedMaterial == null)
return;
var text = textComponent;
if (text == null || text.fontSharedMaterial == null)
return;
if (canvasRenderer == null)
return;
if (m_sharedMaterial.HasProperty(ShaderUtilities.ShaderTag_CullMode))
{
float cullMode = text.fontSharedMaterial.GetFloat(ShaderUtilities.ShaderTag_CullMode);
m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
}
var material = materialForRendering;
if (material == null)
return;
canvasRenderer.materialCount = 1;
canvasRenderer.SetMaterial(material, 0);
}
```
### UI 层补充修复
这个栈通常来自 UI 禁用/销毁时的 TMP 子对象。即使打了 TMP guard也建议修一下高频动态销毁点
- Wiki/图鉴动态列表、描述组、技能/行动 circle 销毁时,先清理回调、停止相关动画,再销毁。
- 对带 TMP 和 Mask 的动态条目,避免同一帧内大量 `SetParent(null)` + `Destroy()` + 立即重建 Layout。必要时延迟一帧重建 Layout或集中到一个安全的 UI 回收工具。
注意:当前 CrashSight 没有对象名,不能证明一定是 WikiWiki 只是从源码看最需要重点压测的动态 TMP 销毁场景。
### 不建议的修复
- 不建议只在业务 View 里包 try/catch。异常发生在 Unity UI/TMP 生命周期里,业务层未必能捕获。
- 不建议只靠“多语言加载修复”来解决这个 blocking。多语言 null 是独立 logerror当前 TMP blocking 栈没有证明它是直接原因。
### 验证
- 批量打开/关闭含 TMP + Mask 的 UIWiki/图鉴、公告、多人房间、提示、弹窗。
- 图鉴里快速切换条目、反复打开关闭、切语言/重载文本。
- CrashSight 不再新增 `dc1340...``0b410...``0c808...`
## 建议发版顺序
1. 先修 `UIAnnounce`:项目代码明确,影响小,能直接消掉 `fe24...`
2. 再做 UI Animancer `ActionOnDisable = Pause` 统一配置:不改第三方包,收益高。
3. 最后处理 TMP优先 embed TMP 包并加 guard同时压测 Wiki/动态 TMP 销毁路径。
## 回归检查
- `dotnet build Unity/Assembly-CSharp.csproj --no-restore`
- Unity Editor 内联机新开局、成员断线重连、返回大厅、重新进局。
- UI 压测公告、Wiki/图鉴、Outside 菜单、多人房间、Bottom 弹窗。
- 下一批 CrashSight 重点看这 5 个 issue 是否停止增长。

View File

@ -0,0 +1,143 @@
# 0.7.3f blocking 根因复核
- 数据来源CrashSight `0.7.3f``last_1_day`2026-06-12 16:24 左右重新抓取。
- 采集结果66 个 issue其中 blocking 5 个logerror 61 个。
- 重要限制5 个 blocking 样本的 `hasLogFile` 都是 `false`。CrashSight 当前能提供未混淆的方法栈、样本设备、同设备 ERROR 上报序列,但没有完整 Unity 日志、GameObject 路径、Prefab 名、UI 层级。
- 本文件只列 blocking。`[TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData` 在本批次是 logerror不在 blocking 列表内;它是独立资源加载问题,不能从当前 blocking 栈证明为这些 blocking 的直接原因。
## 总览
| 根因族 | Issue | 次数 | 设备口径 | 当前能定位到哪里 |
|---|---:|---:|---:|---|
| TMP 子网格 UI 在禁用/遮罩刷新期间空引用 | 3 | 10 | 8 | `TMP_SubMeshUI.UpdateMaterial()` |
| Animancer 组件禁用时 Stop 路径空引用 | 1 | 3 | 3 | `AnimancerComponent.OnDisable()` -> `AnimancerState.Stop()` |
| 开局重大事件公告读取空 `Main.MapData` | 1 | 1 | 1 | `UIAnnounceMajorEventView.SetContent(StartGame)` |
## 1. TMP_SubMeshUI.UpdateMaterial 空引用
相关 issue
- `dc1340f866d020b4b560a92559c89a21`6 次4 设备,最近 2026-06-12 16:03:14。
- `0b41041d271c3ca1128d6f10e46b27b2`3 次3 设备,最近 2026-06-12 15:31:04。
- `0c808432af82e7b66883205719dbb199`1 次1 设备,最近 2026-06-12 12:42:42。
CrashSight 明确栈:
```text
TMPro.TMP_SubMeshUI.UpdateMaterial()
TMPro.TMP_SubMeshUI.SetMaterialDirty()
UnityEngine.UI.MaskableGraphic.OnDisable()
TMPro.TMP_SubMeshUI.OnDisable()
```
另一个同族栈:
```text
TMPro.TMP_SubMeshUI.UpdateMaterial()
TMPro.TMP_SubMeshUI.SetMaterialDirty()
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged(Component mask)
UnityEngine.UI.MaskableGraphic.OnDisable()
UnityEngine.UI.Image.OnDisable()
```
源码落点:
- `Unity/Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Runtime/TMP_SubMeshUI.cs:608``SetMaterialDirty()` 直接调用 `UpdateMaterial()`
- `Unity/Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Runtime/TMP_SubMeshUI.cs:698``UpdateMaterial()`
- `Unity/Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Runtime/TMP_SubMeshUI.cs:710`:读取 `textComponent.fontSharedMaterial.GetFloat(...)`
- `Unity/Library/PackageCache/com.unity.textmeshpro@3.0.7/Scripts/Runtime/TMP_SubMeshUI.cs:714`:写 `canvasRenderer.materialCount`
- `Unity/Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/MaskableGraphic.cs:181``OnDisable()`
- `Unity/Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/MaskableGraphic.cs:185`:禁用时调用 `SetMaterialDirty()`
- `Unity/Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/MaskUtilities.cs:35`:遮罩状态变更通知子节点重新计算 masking。
明确结论:
- 这 3 个 blocking 的直接触发点不是业务代码,而是 UI 对象禁用或遮罩刷新期间TMP 子网格执行材质刷新。
- `TMP_SubMeshUI.UpdateMaterial()` 只检查了 `m_sharedMaterial == null`,随后仍会使用 `textComponent.fontSharedMaterial``canvasRenderer``materialForRendering` 等状态CrashSight 的 NRE 就发生在这个刷新路径内。
- 当前 CrashSight 没有完整日志和 UI 对象名,因此不能明确到具体哪个 View/Prefab。不能把它归因到 Wiki、多语言或 AB除非后续样本带上 GameObject/Prefab 上下文。
## 2. Animancer 禁用 Stop 路径空引用
相关 issue
- `be8ba33741c7c959e4bff388decf5877`3 次3 设备,最近 2026-06-12 15:14:07。
CrashSight 明确栈:
```text
Animancer.AnimancerState.get_NormalizedTime()
Animancer.AnimancerState.set_Time(Single value)
Animancer.AnimancerState.Stop()
Animancer.AnimancerLayer.Stop()
Animancer.AnimancerComponent.Stop()
Animancer.AnimancerComponent.OnDisable()
```
源码落点:
- `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:244``OnDisable()`
- `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:249`:按 `_ActionOnDisable` 分支处理。
- `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:251``DisableAction.Stop`
- `Unity/Assets/Plugins/Animancer/AnimancerComponent.cs:252`:调用 `Stop()`
- `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:356``AnimancerState.Stop()`
- `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:361``Time = 0`
- `Unity/Assets/Plugins/Animancer/Internal/Core/AnimancerState.cs:561``NormalizedTime` getter。
- `Unity/Assets/Plugins/Animancer/Internal/Core/ClipState.cs:52``Length => _Clip.length`
明确结论:
- 这个 blocking 的直接触发点是某个 `AnimancerComponent` 被禁用时执行 `DisableAction.Stop`Stop 路径把 state 时间归零,过程中访问 `NormalizedTime`/`Length` 时内部动画状态已经无效。
- 如果具体 state 是 `ClipState``_Clip.length` 是明显的空引用敏感点;但 CrashSight 栈没有记录 state 类型、GameObject 或 Clip 名,所以这里不能进一步确认具体 prefab 或动画资源。
- 当前能确定的是禁用生命周期里的 Animancer 状态清理问题;不能证明它由多语言/AB 资源加载失败直接引发。
## 3. 开局重大事件公告空引用
相关 issue
- `fe24c7bf54531228f55d73530508a9fa`1 次1 设备2026-06-12 15:02:34。
CrashSight 明确栈:
```text
EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException
TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent(...)
TH1_UI.Controller.Announce.UIAnnounceMajorEventController.OnOpen()
TH1_UI.Controller.Base.ViewController<T>._TrueOpen()
TH1_Presentation.Sequencer.Task.UISequencerTask.Execute(...)
TH1_Core.Managers.PresentationManager.EnqueueTask(...)
TH1_Core.Events.UIEventManagerBinder.HandleShowUIAnnounceMajorEvent(...)
TH1_Core.Managers.EventManager.Publish<T>(...)
TH1_Logic.Core.Main+<>c.<NetStartGame>b__50_0()
Timer.Update()
TH1_Logic.Core.Main.Update()
```
源码落点:
- `Unity/Assets/Scripts/TH1_Logic/Core/Main.cs:431`:联机开局注册 `Main_CenterMessage_Anim` 定时器。
- `Unity/Assets/Scripts/TH1_Logic/Core/Main.cs:434`:创建 `ShowUIAnnounceMajorEvent { EventType = StartGame }`
- `Unity/Assets/Scripts/TH1_Logic/Core/Main.cs:435``EventManager.Publish(announcement)`
- `Unity/Assets/Scripts/TH1_Core/Events/UIEventManagerBinder.cs:232`:处理 `ShowUIAnnounceMajorEvent`
- `Unity/Assets/Scripts/TH1_UI/Controller/Announce/UIAnnounceMajorEventController.cs:46`:读取打开参数。
- `Unity/Assets/Scripts/TH1_UI/Controller/Announce/UIAnnounceMajorEventController.cs:51`:调用 `WindowScript.SetContent(...)`
- `Unity/Assets/Scripts/TH1_UI/View/Announce/UIAnnounceMajorEventView.cs:72`:进入 `StartGame` 分支。
- `Unity/Assets/Scripts/TH1_UI/View/Announce/UIAnnounceMajorEventView.cs:76``player = Main.MapData.PlayerMap.SelfPlayerData;`
同设备关键证据:
- 设备:`80-fa-5b-68-87-2b`
- 2026-06-12 15:02:25同设备同版本先上报 `96f415d89f78f0ac31e19174e23246ba``OnGridInfoAction Error: Main.MapData is null`
- 2026-06-12 15:02:34同设备上报本 blocking`UIAnnounceMajorEventView.SetContent(StartGame)` 空引用。
- `InputLogic.OnGridInfoAction()` 的保护代码在 `Unity/Assets/Scripts/TH1_Logic/Input/InputLogic.cs:407` 明确判断 `Main.MapData == null`,并在 `:409` 输出该错误。
明确结论:
- 这个 blocking 是项目代码问题:`StartGame` 重大事件公告打开时,`UIAnnounceMajorEventView.SetContent()` 在第 76 行无保护读取 `Main.MapData.PlayerMap.SelfPlayerData`
- 同设备 9 秒前已经明确记录 `Main.MapData is null`,所以本次空引用最强证据指向 `Main.MapData` 在公告定时器触发时仍为空或已经被清空。
- 触发来源不是“UI 打开参数为空”,因为栈已经进入 `SetContent(StartGame)`;也不是 Title/Content/Image 为空,因为第 61 行已有保护并会返回。
## 需要分开处理的问题
- 多语言/YooAsset当前批次有 9 个“多语言 ID 为空”logerror issue25 次21 设备,其中多条消息是 `[TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData`。这是明确的资源加载/打包问题,但它没有进入本次 blocking 列表。
- UI/Renderer 空保护诊断:`OnGridInfoAction Error: Main.MapData is null` 是 logerror不是 blocking但它是 `fe24...` 同设备同会话的直接前置证据。
- 第三方 UI/动画栈TMP 和 Animancer blocking 的直接失败点很明确,但当前 CrashSight 缺少对象上下文,无法只靠这批数据确认具体业务页面。

View File

@ -0,0 +1,44 @@
# CrashSight 0.7.3f 最近一天 ERROR 分析
- 捕获时间2026-06-12 16:25:01
- 筛选范围:`0.7.3f``last_1_day`ERROR未处理/处理中
- CrashSight numFound66
- 去重 Issue66
- blocking5 个 Issue14 次
- logerror61 个 Issue249 次
- 原始数据:`Temp\CrashSight\Daily_2026-06-12_0.7.3f_blocking_root_1624`
## 阻断家族
| 家族 | Issue 数 | 次数 | 报告 |
|---|---:|---:|---|
| 空引用异常 | 4 | 13 | [blocking/001_null-reference.md](blocking/001_null-reference.md) |
| 重大事件公告 UI 空引用 | 1 | 1 | [blocking/002_announce-major-event-null.md](blocking/002_announce-major-event-null.md) |
## 非阻断高频
| 类别 | Issue 数 | 次数 |
|---|---:|---:|
| P2P/大厅连接失败诊断 | 5 | 94 |
| 其他项目诊断日志 | 10 | 67 |
| 网络发送失败诊断 | 13 | 26 |
| 多语言 ID 为空 | 9 | 25 |
| AI 计算死循环保护 | 2 | 12 |
| 断线重连/ForceUpdate 诊断 | 4 | 6 |
| 结算卡住兜底诊断 | 5 | 5 |
| STS/OSS 上传失败诊断 | 4 | 4 |
| 行动执行玩家不一致 | 3 | 4 |
| Origin Player 为空诊断 | 2 | 2 |
| MapData 序列化差异诊断 | 1 | 1 |
| UI/Renderer 空保护诊断 | 1 | 1 |
## 报告
- [LogError Summary](logerror_summary.md)
- [空引用异常](blocking/001_null-reference.md)
- [重大事件公告 UI 空引用](blocking/002_announce-major-event-null.md)
## 说明
blocking 的判定只认真实异常类型、异常对象或调用栈;纯 `LogSystem.LogError` 业务状态诊断归入 logerror。
本次通过 CrashSight OpenAPI 抓取样本详情和同设备最近 ERROR 上报序列;若样本 `hasLogFile=false`,文档会明确标记上下文限制。

View File

@ -0,0 +1,91 @@
# LogError Summary
- 筛选范围:`0.7.3f``last_1_day`ERRORstatus `0,2`
- 捕获时间2026-06-12 16:25:01
- 非阻断 Issue61
- 非阻断次数249
## 分类汇总
| 类别 | Issue 数 | 次数 | 设备数 | 代码位置 | 示例 Issue |
|---|---:|---:|---:|---|---|
| P2P/大厅连接失败诊断 | 5 | 94 | 33 | Unity/Assets/Scripts\TH1_Logic\Steam\SimpleP2P.cs:480: LogSystem.LogError($"Connection failed - Reason: {endReason}"); | 03e368c38bf498c0ede3d3d6b1a4ba9, 5bf29273f5c83382e8a559c3a51c64b1, 294ddb9ea1ed79f4f9685b30604d29d1 |
| 其他项目诊断日志 | 10 | 67 | 35 | 未直接定位 | 3b1873b47fcdc15a0284798ea83be004, a406b4110acbc959eb184436ee2ab06e, 5fd467876966dade995de78f0f842730 |
| 网络发送失败诊断 | 13 | 26 | 26 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1258: LogSystem.LogError($"ActionConfirm send failed, abort local execute: {ActionId.GetStringLog()}"); | c07d1e2a7c8d667e4dbc32f514816ce1, b85437ba5b78b111662ebae535a3d6ba, 16bd34f1b4756ad8655c843c0f9da506 |
| 多语言 ID 为空 | 9 | 25 | 21 | Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:176: LogSystem.LogError($"多语言ID为空");<br>Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:200: LogSystem.LogError($"多语言ID为空"); | bae1cbeda505602c5dbbc984c0fa1d88, ed493d4b6926c3bb5efe569a5db211e3, 5506094b5e9df26bc4d5fd90349178cb |
| AI 计算死循环保护 | 2 | 12 | 6 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:179: LogSystem.LogError($"死循环了,最终记录点为:{MainEditor.Instance.BTNodeId}");<br>Unity/Assets/Scripts\TH1_Logic\AI\AIActionBase.cs:528: LogSystem.LogError($"死循环了"); | 3e65a3369290cfa41e540f0612aefad5, b8f5e42d2f8416ec9ab5e4f260a83b24 |
| 断线重连/ForceUpdate 诊断 | 4 | 6 | 6 | Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:418: public void SendRequestForceUpdate()<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:425: LogSystem.LogWarning($"客户端请求重连冷却中: SendRequestForceUpdate, remain={RequestForceUpdateCooldown - (now - _lastRequestForceUpdateTime):F1}s");<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:430: LogSystem.LogError($"客户端请求重连: SendRequestForceUpdate"); | 22fa9e63dc483a12cf3e1db26971c7fd, f5a10ac77528515d144e401c88fd4ae0, 29ea271af8759bbf7e679bf751ef6373 |
| 结算卡住兜底诊断 | 5 | 5 | 5 | Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:328: MatchSettlementStuckGuard.CheckAndRecover(map, info, MatchSettlementType.Normal, kv.Key);<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:424: public static class MatchSettlementStuckGuard<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:484: sb.Append("[MatchSettlementStuck] 触发兜底:"); | 57b4823e12accd4cb391b375ca13b229, bf5719f6215aa6dda0ddcfa334e74300, 87f1839a648cac091754402cae2340f4 |
| STS/OSS 上传失败诊断 | 4 | 4 | 4 | Unity/Assets/Scripts\TH1_Logic\Oss\OssManager.cs:127: LogSystem.LogError($"CollectData upload failed: {ex.Message}"); | 143216953927e092f92ed21f33dae263, ed572337a39c4463d494e47944835c78, 4b3f50847e230a1b123fc4d7b72cc3ce |
| 行动执行玩家不一致 | 3 | 4 | 4 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1231: LogSystem.LogError($"CompleteExecute Player 不一致 {ActionId.GetStringLog()}"); | 0996632913829370bf06b088313d00e7, 217a8eace225fadbb28fe9c001b38d7c, acf75275ad92788914ce511f926df1ad |
| Origin Player 为空诊断 | 2 | 2 | 2 | Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:683: LogSystem.LogError($"Origin Player is null target.id:{target.Id}");<br>Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:738: LogSystem.LogError($"RecoverHealth Origin Player is null target.id:{target.Id}"); | 606d395b63d62132c01a9f712605e0b0, 76c4a73c625af53a1601bc284e2e3013 |
| MapData 序列化差异诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Data\MapData.cs:3028: differences.Add($"{name} differs (serialized data mismatch)"); | 0c1e9e04921cd04a78a5e3faf0eee5bc |
| UI/Renderer 空保护诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:409: Debug.LogError("OnGridInfoAction Error: Main.MapData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:416: Debug.LogError("OnGridInfoAction Error: Main.MapData.PlayerMap?.SelfPlayerData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:427: Debug.LogError("OnGridInfoAction Error: UIManager.Instance?.UIInfoManager is null"); | 96f415d89f78f0ac31e19174e23246ba |
| 相似 Action 重复诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:230: if(_sameCount > 5) LogSystem.LogError($"存在相似action ,记录点为:{MainEditor.Instance.BTNodeId} ," + | f1c119ee9f0c60b7f3a383def5491cd6 |
| 行动同步版本/索引不一致 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Steam\GameNetReceiver.cs:132: LogSystem.LogError($"OnReceivedActionConfirm Version 不一致"); | 2b00525760ae44917da30a3d1cff8fb9 |
## 明细
| Issue | 类别 | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---|---:|---:|---|---|
| [5bf29273f5c83382e8a559c3a51c64b1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5bf29273f5c83382e8a559c3a51c64b1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 58 | 10 | 2026-06-12 16:21:18 | 应用层拒绝连接 - 错误码: 1000可能原因1.对方未创建监听套接字 2.对方主动拒绝 3.对方游戏未运行 |
| [3b1873b47fcdc15a0284798ea83be004](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3b1873b47fcdc15a0284798ea83be004?pid=10) | 其他项目诊断日志 | UnityLogError | 57 | 25 | 2026-06-12 16:24:00 | Releasing render texture that is set as Camera.targetTexture! |
| [03e368c38bf498c0ede3d3d6b1a4ba9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/03e368c38bf498c0ede3d3d6b1a4ba9?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 29 | 18 | 2026-06-12 16:21:58 | Connection failed - Reason: 1000 |
| [3e65a3369290cfa41e540f0612aefad5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3e65a3369290cfa41e540f0612aefad5?pid=10) | AI 计算死循环保护 | UnityLogError | 11 | 5 | 2026-06-12 16:06:13 | 死循环了 |
| [16bd34f1b4756ad8655c843c0f9da506](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/16bd34f1b4756ad8655c843c0f9da506?pid=10) | 网络发送失败诊断 | UnityLogError | 5 | 5 | 2026-06-12 15:50:53 | MemberStateSyncMessage: 房主广播失败 |
| [bae1cbeda505602c5dbbc984c0fa1d88](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bae1cbeda505602c5dbbc984c0fa1d88?pid=10) | 多语言 ID 为空 | UnityLogError | 5 | 5 | 2026-06-12 16:21:19 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [ed7645351344dd651c0a27dfc3573b10](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed7645351344dd651c0a27dfc3573b10?pid=10) | 网络发送失败诊断 | UnityLogError | 5 | 5 | 2026-06-12 15:50:52 | P2P broadcast preflight failed: target=76561199261233300, reason=Target is not a lobby peer: 76561199261233300 |
| [f5aa9c0a1411b1f09fd13146d745090d](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f5aa9c0a1411b1f09fd13146d745090d?pid=10) | 多语言 ID 为空 | UnityLogError | 5 | 5 | 2026-06-12 16:11:35 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [294ddb9ea1ed79f4f9685b30604d29d1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/294ddb9ea1ed79f4f9685b30604d29d1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 4 | 2 | 2026-06-12 16:18:36 | Failed to enter lobby: k_EChatRoomEnterResponseFull |
| [b176950b03c8f954ad35f9520da10d23](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b176950b03c8f954ad35f9520da10d23?pid=10) | 多语言 ID 为空 | UnityLogError | 4 | 4 | 2026-06-12 15:54:43 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [ed493d4b6926c3bb5efe569a5db211e3](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed493d4b6926c3bb5efe569a5db211e3?pid=10) | 多语言 ID 为空 | UnityLogError | 4 | 1 | 2026-06-12 16:21:14 | 多语言ID为空 |
| [442bf5a8e6242beea1cb0ce03556f614](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/442bf5a8e6242beea1cb0ce03556f614?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | MemberStateSyncMessage: 房主广播失败 |
| [ad4750c819ae6ea6a508646025d0eebe](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ad4750c819ae6ea6a508646025d0eebe?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | P2P broadcast preflight failed: target=76561199261233300, reason=No connection to 76561199261233300 |
| [217a8eace225fadbb28fe9c001b38d7c](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/217a8eace225fadbb28fe9c001b38d7c?pid=10) | 行动执行玩家不一致 | UnityLogError | 2 | 2 | 2026-06-12 15:08:50 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : ThirdHero |
| [22fa9e63dc483a12cf3e1db26971c7fd](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/22fa9e63dc483a12cf3e1db26971c7fd?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 2 | 2 | 2026-06-12 16:16:22 | 触发断线重连, 触发原因: OK |
| [26e2c7ab0fb8fdb0d95355ae254b4995](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/26e2c7ab0fb8fdb0d95355ae254b4995?pid=10) | 其他项目诊断日志 | UnityLogError | 2 | 2 | 2026-06-12 15:34:56 | |
| [389b25b597dc2e0bba3e23df41e2c6b8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/389b25b597dc2e0bba3e23df41e2c6b8?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 16:03:13 | 远程超时 - 目标用户网络问题 |
| [519eac5f561dfb99ea775c5294065411](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/519eac5f561dfb99ea775c5294065411?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:02:24 | 客户端请求重连: SendRequestForceUpdate |
| [5506094b5e9df26bc4d5fd90349178cb](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5506094b5e9df26bc4d5fd90349178cb?pid=10) | 多语言 ID 为空 | UnityLogError | 2 | 1 | 2026-06-12 16:21:14 | 多语言ID为空 |
| [949458f51e04d6cf3f4ff9ee18b7e160](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/949458f51e04d6cf3f4ff9ee18b7e160?pid=10) | 多语言 ID 为空 | UnityLogError | 2 | 2 | 2026-06-12 12:42:44 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [ffb81e99d467263e9884a7aec3fcd845](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ffb81e99d467263e9884a7aec3fcd845?pid=10) | 网络发送失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:34:42 | MapConfirmMessage: 房主广播失败 |
| [0996632913829370bf06b088313d00e7](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0996632913829370bf06b088313d00e7?pid=10) | 行动执行玩家不一致 | UnityLogError | 1 | 1 | 2026-06-12 16:17:03 | CompleteExecute Player 不一致 Action : TurnEnd Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : None |
| [0c1e9e04921cd04a78a5e3faf0eee5bc](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0c1e9e04921cd04a78a5e3faf0eee5bc?pid=10) | MapData 序列化差异诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:16:22 | PlayerMap differs (serialized data mismatch) PlayerMap.PlayerDataList differs (serialized data mismatch) UnitMap differs (serialized data mismatch) UnitToGridDict differs (serialized data mismatch) PlayerMap.PlayerDataList[0].PlayerScore: 5390 != 5400 PlayerMap.PlayerDataList[0].Sight.SightGidSet.Count: 121 != 123 UnitMap.UnitList[4].ActionPoint.Count: 1 !=… |
| [115622af2c5f78d14b4e6b900ba1d151](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/115622af2c5f78d14b4e6b900ba1d151?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [12dcc82a69446ab0f1cb4caf44b0579a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/12dcc82a69446ab0f1cb4caf44b0579a?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [143216953927e092f92ed21f33dae263](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/143216953927e092f92ed21f33dae263?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:23:07 | STS request failed: Request timeout, Response: |
| [1d0340f4a74af4a27367b74fdfca40e5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1d0340f4a74af4a27367b74fdfca40e5?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | UpdateLobbyDataMessage: 发送给成员失败 memberId=76561199246777025 |
| [1f51b04a2682e0031ec4b1bdc1e6ac48](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1f51b04a2682e0031ec4b1bdc1e6ac48?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | CollectData upload failed: STS request failed: HTTP/1.1 403 Forbidden |
| [29ea271af8759bbf7e679bf751ef6373](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/29ea271af8759bbf7e679bf751ef6373?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | 触发断线重连, 触发原因: Disconnected |
| [2b00525760ae44917da30a3d1cff8fb9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/2b00525760ae44917da30a3d1cff8fb9?pid=10) | 行动同步版本/索引不一致 | UnityLogError | 1 | 1 | 2026-06-12 16:16:20 | OnReceivedActionExcute MapHash 不一致,拒绝执行 |
| [30622ad1a79c1111188744b6714fa6a4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/30622ad1a79c1111188744b6714fa6a4?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:45 | P2P broadcast preflight failed: target=76561198414473361, reason=Connection to 76561198414473361 is not active for queueing. State: k_ESteamNetworkingConnectionState_ClosedByPeer |
| [3734a997ed6d691a08e092e56913c40a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3734a997ed6d691a08e092e56913c40a?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:02 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=437, DataUnits=33, RenderUnits=34, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[436]: Version=436, MapHash=a2d84780acdfeabc1a2702f510a3ffa4 Action : Build Wonder : None Resource : Mine Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitA… |
| [4b3f50847e230a1b123fc4d7b72cc3ce](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/4b3f50847e230a1b123fc4d7b72cc3ce?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | STS request failed: HTTP/1.1 403 Forbidden, Response: {"error":"Steam verification failed: Steam API 请求失败(重试 2 次): Steam API 请求超时8000ms"} |
| [55f59da02d6a71a429d56dbe65e20f4f](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/55f59da02d6a71a429d56dbe65e20f4f?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:47 | MemberStateSyncMessage: 房主广播失败 |
| [57b4823e12accd4cb391b375ca13b229](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/57b4823e12accd4cb391b375ca13b229?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:03:31 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=28 NetMode=Single PlayerCount=17 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=28 CityCount=20 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsS… |
| [5fd467876966dade995de78f0f842730](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5fd467876966dade995de78f0f842730?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:49:54 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3504, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3503]: Version=3503, MapHash=10d52600eee9a090a6a724a41a6bf4a6 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation … |
| [606d395b63d62132c01a9f712605e0b0](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/606d395b63d62132c01a9f712605e0b0?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:56:22 | Origin Player is null target.id:1278 |
| [7076e90b6a985d264771f26e77281aa6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/7076e90b6a985d264771f26e77281aa6?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:42:08 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3048, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3047]: Version=3047, MapHash=61a57aa2a6e9d87d426c30289da9c789 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [76c4a73c625af53a1601bc284e2e3013](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/76c4a73c625af53a1601bc284e2e3013?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 08:27:06 | Origin Player is null target.id:430 |
| [775b456dd3864ee2fd0e480673d7c1c9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/775b456dd3864ee2fd0e480673d7c1c9?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:34:42 | P2P broadcast preflight failed: target=76561198446408112, reason=No connection to 76561198446408112 |
| [7f6131dac5513c0d941c867c5fdda79b](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/7f6131dac5513c0d941c867c5fdda79b?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:07:44 | Failed to refresh lobby data before joining: 109775243702525678 |
| [82d15ccd49201fabece20edd1853cdda](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/82d15ccd49201fabece20edd1853cdda?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 12:56:27 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2294221302, ActionIndex=2800, DataUnits=75, RenderUnits=76, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2799]: Version=2799, MapHash=808b4dc219c91b84ad23779b57fa27ce Action : UnitMove Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : Non… |
| [87f1839a648cac091754402cae2340f4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/87f1839a648cac091754402cae2340f4?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [881c4ef7885f6fa88ed1f214352fb990](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/881c4ef7885f6fa88ed1f214352fb990?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:32:30 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=2369, DataUnits=76, RenderUnits=77, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2368]: Version=2368, MapHash=110ab1b166ccd6bacb1d56e8db6e8baa Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [8d7cbe77207721b339ce20bf96d27652](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/8d7cbe77207721b339ce20bf96d27652?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | P2P message send failed: target=76561199246777025, reason=Target member is not in lobby: 76561199246777025 |
| [96f415d89f78f0ac31e19174e23246ba](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/96f415d89f78f0ac31e19174e23246ba?pid=10) | UI/Renderer 空保护诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | OnGridInfoAction Error: Main.MapData is null |
| [a406b4110acbc959eb184436ee2ab06e](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a406b4110acbc959eb184436ee2ab06e?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 16:12:32 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=1508949800, ActionIndex=1434, DataUnits=67, RenderUnits=68, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[1433]: Version=1433, MapHash=15dd94fd28e78bea18d8cf314e6fa7ae Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : N… |
| [a63d7c50108ffe49f2c02217f3d8eee8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a63d7c50108ffe49f2c02217f3d8eee8?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:00 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=429, DataUnits=34, RenderUnits=35, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[428]: Version=428, MapHash=be3b9dab92fa24c2de8ac5f6baab80c1 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None … |
| [a92e5105a3a896fb74424242bfbddf0a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a92e5105a3a896fb74424242bfbddf0a?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [acf75275ad92788914ce511f926df1ad](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/acf75275ad92788914ce511f926df1ad?pid=10) | 行动执行玩家不一致 | UnityLogError | 1 | 1 | 2026-06-12 12:39:18 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : MonumentForest |
| [b36fb8882dd4aabcf8618737d0ec5a65](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b36fb8882dd4aabcf8618737d0ec5a65?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [b85437ba5b78b111662ebae535a3d6ba](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b85437ba5b78b111662ebae535a3d6ba?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:21:58 | P2P message send failed: target=76561199198917637, reason=No connection to 76561199198917637 |
| [b8f5e42d2f8416ec9ab5e4f260a83b24](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b8f5e42d2f8416ec9ab5e4f260a83b24?pid=10) | AI 计算死循环保护 | UnityLogError | 1 | 1 | 2026-06-12 13:35:32 | 死循环了,最终记录点为:194 |
| [b9ef15d9ba6eda7d608a9816cef2f41b](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b9ef15d9ba6eda7d608a9816cef2f41b?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:46 | P2P broadcast preflight failed: target=76561198414473361, reason=No connection to 76561198414473361 |
| [bf5719f6215aa6dda0ddcfa334e74300](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bf5719f6215aa6dda0ddcfa334e74300?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [c07d1e2a7c8d667e4dbc32f514816ce1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/c07d1e2a7c8d667e4dbc32f514816ce1?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:21:59 | ChangeCivMessage: 发送给房主失败 |
| [e0e8d47df59e68e38968a6d05ed1a882](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e0e8d47df59e68e38968a6d05ed1a882?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 07:48:53 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2242826177, ActionIndex=3149, DataUnits=61, RenderUnits=62, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3148]: Version=3148, MapHash=0ceb6f1746ddba5ef68843f17bc7ad60 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation… |
| [e571d58f12740545f5a2756a546dc992](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e571d58f12740545f5a2756a546dc992?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [ed572337a39c4463d494e47944835c78](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed572337a39c4463d494e47944835c78?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:23:07 | CollectData upload failed: STS request failed: Request timeout |
| [f1c119ee9f0c60b7f3a383def5491cd6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f1c119ee9f0c60b7f3a383def5491cd6?pid=10) | 相似 Action 重复诊断 | UnityLogError | 1 | 1 | 2026-06-12 10:59:09 | 存在相似action ,记录点为:771 ,Action为:Action : LearnTech Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : Trade PlayerAction : None AIParam : AllClear Tech : Trade CultureCardType : None 重复次数 :6 |
| [f5a10ac77528515d144e401c88fd4ae0](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f5a10ac77528515d144e401c88fd4ae0?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:16:21 | 客户端请求重连: SendRequestForceUpdate |

View File

@ -0,0 +1,261 @@
{
"date": "2026-06-12",
"version": "0.7.3f",
"capture": {
"capturedAtUtc": "2026-06-12T08:25:01+00:00",
"capturedAtLocal": "2026-06-12 16:25:01",
"rawDir": "Temp\\CrashSight\\Daily_2026-06-12_0.7.3f_blocking_root_1624",
"reportDir": "MD\\CrashSight_2026-06-12_0.7.3f_blocking_root_1624"
},
"filter": {
"version": "0.7.3f",
"date": "last_1_day",
"status": "0,2",
"exceptionCategoryList": "ERROR",
"sortField": "uploadTime",
"sortOrder": "desc",
"rows": 500
},
"totalIssues": 66,
"blockingIssues": 5,
"blockingOccurrences": 14,
"logerrorIssues": 61,
"logerrorOccurrences": 249,
"blockingReports": [
{
"categoryId": "null-reference",
"title": "空引用异常",
"issueCount": 4,
"occurrences": 13,
"path": "blocking/001_null-reference.md",
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"categoryId": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"issueCount": 1,
"occurrences": 1,
"path": "blocking/002_announce-major-event-null.md",
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
],
"categories": [
{
"id": "p2p-lobby-connection-failure",
"title": "P2P/大厅连接失败诊断",
"class": "logerror",
"issueCount": 5,
"occurrences": 94,
"issues": [
"03e368c38bf498c0ede3d3d6b1a4ba9",
"5bf29273f5c83382e8a559c3a51c64b1",
"294ddb9ea1ed79f4f9685b30604d29d1",
"7f6131dac5513c0d941c867c5fdda79b",
"389b25b597dc2e0bba3e23df41e2c6b8"
]
},
{
"id": "other-logerror",
"title": "其他项目诊断日志",
"class": "logerror",
"issueCount": 10,
"occurrences": 67,
"issues": [
"3b1873b47fcdc15a0284798ea83be004",
"a406b4110acbc959eb184436ee2ab06e",
"5fd467876966dade995de78f0f842730",
"7076e90b6a985d264771f26e77281aa6",
"26e2c7ab0fb8fdb0d95355ae254b4995",
"881c4ef7885f6fa88ed1f214352fb990",
"82d15ccd49201fabece20edd1853cdda",
"3734a997ed6d691a08e092e56913c40a",
"a63d7c50108ffe49f2c02217f3d8eee8",
"e0e8d47df59e68e38968a6d05ed1a882"
]
},
{
"id": "network-send-failure",
"title": "网络发送失败诊断",
"class": "logerror",
"issueCount": 13,
"occurrences": 26,
"issues": [
"c07d1e2a7c8d667e4dbc32f514816ce1",
"b85437ba5b78b111662ebae535a3d6ba",
"16bd34f1b4756ad8655c843c0f9da506",
"ed7645351344dd651c0a27dfc3573b10",
"1d0340f4a74af4a27367b74fdfca40e5",
"8d7cbe77207721b339ce20bf96d27652",
"775b456dd3864ee2fd0e480673d7c1c9",
"ffb81e99d467263e9884a7aec3fcd845",
"ad4750c819ae6ea6a508646025d0eebe",
"442bf5a8e6242beea1cb0ce03556f614",
"55f59da02d6a71a429d56dbe65e20f4f",
"b9ef15d9ba6eda7d608a9816cef2f41b",
"30622ad1a79c1111188744b6714fa6a4"
]
},
{
"id": "multilingual-empty-id",
"title": "多语言 ID 为空",
"class": "logerror",
"issueCount": 9,
"occurrences": 25,
"issues": [
"bae1cbeda505602c5dbbc984c0fa1d88",
"ed493d4b6926c3bb5efe569a5db211e3",
"5506094b5e9df26bc4d5fd90349178cb",
"f5aa9c0a1411b1f09fd13146d745090d",
"b176950b03c8f954ad35f9520da10d23",
"12dcc82a69446ab0f1cb4caf44b0579a",
"115622af2c5f78d14b4e6b900ba1d151",
"b36fb8882dd4aabcf8618737d0ec5a65",
"949458f51e04d6cf3f4ff9ee18b7e160"
]
},
{
"id": "null-reference",
"title": "空引用异常",
"class": "blocking",
"issueCount": 4,
"occurrences": 13,
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"id": "ai-loop-guard",
"title": "AI 计算死循环保护",
"class": "logerror",
"issueCount": 2,
"occurrences": 12,
"issues": [
"3e65a3369290cfa41e540f0612aefad5",
"b8f5e42d2f8416ec9ab5e4f260a83b24"
]
},
{
"id": "reconnect-forceupdate",
"title": "断线重连/ForceUpdate 诊断",
"class": "logerror",
"issueCount": 4,
"occurrences": 6,
"issues": [
"22fa9e63dc483a12cf3e1db26971c7fd",
"f5a10ac77528515d144e401c88fd4ae0",
"29ea271af8759bbf7e679bf751ef6373",
"519eac5f561dfb99ea775c5294065411"
]
},
{
"id": "match-settlement-stuck-fallback",
"title": "结算卡住兜底诊断",
"class": "logerror",
"issueCount": 5,
"occurrences": 5,
"issues": [
"57b4823e12accd4cb391b375ca13b229",
"bf5719f6215aa6dda0ddcfa334e74300",
"87f1839a648cac091754402cae2340f4",
"e571d58f12740545f5a2756a546dc992",
"a92e5105a3a896fb74424242bfbddf0a"
]
},
{
"id": "sts-upload-failure",
"title": "STS/OSS 上传失败诊断",
"class": "logerror",
"issueCount": 4,
"occurrences": 4,
"issues": [
"143216953927e092f92ed21f33dae263",
"ed572337a39c4463d494e47944835c78",
"4b3f50847e230a1b123fc4d7b72cc3ce",
"1f51b04a2682e0031ec4b1bdc1e6ac48"
]
},
{
"id": "action-completeexecute-player-mismatch",
"title": "行动执行玩家不一致",
"class": "logerror",
"issueCount": 3,
"occurrences": 4,
"issues": [
"0996632913829370bf06b088313d00e7",
"217a8eace225fadbb28fe9c001b38d7c",
"acf75275ad92788914ce511f926df1ad"
]
},
{
"id": "origin-player-null-diagnostic",
"title": "Origin Player 为空诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 2,
"issues": [
"606d395b63d62132c01a9f712605e0b0",
"76c4a73c625af53a1601bc284e2e3013"
]
},
{
"id": "mapdata-diff-diagnostic",
"title": "MapData 序列化差异诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"0c1e9e04921cd04a78a5e3faf0eee5bc"
]
},
{
"id": "ui-renderer-null-guard",
"title": "UI/Renderer 空保护诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"96f415d89f78f0ac31e19174e23246ba"
]
},
{
"id": "duplicate-similar-action",
"title": "相似 Action 重复诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"f1c119ee9f0c60b7f3a383def5491cd6"
]
},
{
"id": "action-sync-version-index",
"title": "行动同步版本/索引不一致",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"2b00525760ae44917da30a3d1cff8fb9"
]
},
{
"id": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"class": "blocking",
"issueCount": 1,
"occurrences": 1,
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
]
}

View File

@ -0,0 +1,184 @@
# 空引用异常
- 分类blocking
- Issue 数4
- `0.7.3f` 最近一天次数13
- 设备数合计11
- 报告生成2026-06-12 16:08:34
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [dc1340f866d020b4b560a92559c89a21](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/dc1340f866d020b4b560a92559c89a21?pid=10) | NullReferenceException | 6 | 4 | 2026-06-12 16:03:14 | Object reference not set to an instance of an object. |
| [0b41041d271c3ca1128d6f10e46b27b2](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0b41041d271c3ca1128d6f10e46b27b2?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:31:04 | Object reference not set to an instance of an object. |
| [be8ba33741c7c959e4bff388decf5877](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/be8ba33741c7c959e4bff388decf5877?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:14:07 | Object reference not set to an instance of an object. |
| [0c808432af82e7b66883205719dbb199](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0c808432af82e7b66883205719dbb199?pid=10) | NullReferenceException | 1 | 1 | 2026-06-12 12:42:42 | Object reference not set to an instance of an object. |
## 设备上下文
### dc1340f866d020b4b560a92559c89a21
- 样本 CrashId`9d358b3dfdfd4f7190a195db17919deb`
- 样本 DeviceId`10-a5-1d-d7-c8-a9`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 16:07:44 | 7f6131dac5513c0d941c867c5fdda79b | | |
| 2026-06-12 16:05:50 | 294ddb9ea1ed79f4f9685b30604d29d1 | | |
| 2026-06-12 16:05:20 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 16:03:14 | dc1340f866d020b4b560a92559c89a21 | | |
| 2026-06-12 16:03:13 | 389b25b597dc2e0bba3e23df41e2c6b8 | | |
| 2026-06-12 15:17:19 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:17:19 | 0b41041d271c3ca1128d6f10e46b27b2 | | |
| 2026-06-12 15:17:19 | dc1340f866d020b4b560a92559c89a21 | | |
### 0b41041d271c3ca1128d6f10e46b27b2
- 样本 CrashId`5ad98ebcb8f44bc39580417051d745bb`
- 样本 DeviceId`00-ff-fb-5d-e8-e7`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 16:00:01 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:59:59 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:38:25 | 115622af2c5f78d14b4e6b900ba1d151 | | |
| 2026-06-12 15:38:25 | 12dcc82a69446ab0f1cb4caf44b0579a | | |
| 2026-06-12 15:38:24 | ed493d4b6926c3bb5efe569a5db211e3 | | |
| 2026-06-12 15:38:24 | 5506094b5e9df26bc4d5fd90349178cb | | |
| 2026-06-12 15:38:24 | b36fb8882dd4aabcf8618737d0ec5a65 | | |
| 2026-06-12 15:31:20 | dc1340f866d020b4b560a92559c89a21 | | |
### be8ba33741c7c959e4bff388decf5877
- 样本 CrashId`7cc68a71c55b4abbab7c7cdb370d6a46`
- 样本 DeviceId`d4-93-90-2e-72-b4`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:54:43 | b176950b03c8f954ad35f9520da10d23 | | |
| 2026-06-12 15:54:43 | bae1cbeda505602c5dbbc984c0fa1d88 | | |
| 2026-06-12 15:54:42 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:14:07 | be8ba33741c7c959e4bff388decf5877 | | |
| 2026-06-12 15:14:06 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 15:10:32 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:05:27 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:05:26 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
## 代码位置
- 未通过固定文本直接定位;需要结合解码栈继续追。
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,75 @@
# 重大事件公告 UI 空引用
- 分类blocking
- Issue 数1
- `0.7.3f` 最近一天次数1
- 设备数合计1
- 报告生成2026-06-12 16:08:34
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [fe24c7bf54531228f55d73530508a9fa](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/fe24c7bf54531228f55d73530508a9fa?pid=10) | UnityLogError | 1 | 1 | 2026-06-12 15:02:34 | EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object. at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0 at TH… |
## 设备上下文
### fe24c7bf54531228f55d73530508a9fa
- 样本 CrashId`18ce090edbf0448097312f6fd79db8d6`
- 样本 DeviceId`80-fa-5b-68-87-2b`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
UnityLogError
EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object.
at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Announce.UIAnnounceMajorEventController.OnOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TrueOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._OnViewStart () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TryOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].Open () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].OpenWithParam (System.Object param) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Presentation.Sequencer.Task.UISequencerTask.Execute (System.Action onComplete) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.TryProcessNext () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.EnqueueTask (TH1_Presentation.Sequencer.Task.ISequencerTask task, System.Boolean viewNextFrame) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Events.UIEventManagerBinder.HandleShowUIAnnounceMajorEvent (TH1_Core.Events.ShowUIAnnounceMajorEvent evt) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.EventManager.Publish[T] (T eventData) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main+<>c.<NetStartGame>b__50_0 () [0x00000] in <00000000000000000000000000000000>:0
at Timer.Update () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main.Update () [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.Debug.LogError(Object)
Logic.CrashSight.LogSystem.LogError(String, Object)
TH1_Core.Managers.EventManager.Pub
...
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:50:53 | 16bd34f1b4756ad8655c843c0f9da506 | | |
| 2026-06-12 15:50:52 | ed7645351344dd651c0a27dfc3573b10 | | |
| 2026-06-12 15:34:56 | 26e2c7ab0fb8fdb0d95355ae254b4995 | | |
| 2026-06-12 15:34:41 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:02:34 | fe24c7bf54531228f55d73530508a9fa | | |
| 2026-06-12 15:02:25 | 96f415d89f78f0ac31e19174e23246ba | | |
| 2026-06-12 15:02:25 | 29ea271af8759bbf7e679bf751ef6373 | | |
| 2026-06-12 15:02:24 | 519eac5f561dfb99ea775c5294065411 | | |
## 代码位置
- `Unity/Assets/Scripts\TH1_UI\Controller\Announce\UIAnnounceMajorEventController.cs:15: public class UIAnnounceMajorEventController : ViewController<UIAnnounceMajorEventView>, IEscClosable // 泛型参数是对应的View脚本`
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:16: public class UIAnnounceMajorEventView : Base.View`
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:63: LogSystem.LogError("UIAnnounceMajorEventView.SetContent(): Title or Content or Image or Image is null");`
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,44 @@
# CrashSight 0.7.3f 最近一天 ERROR 分析
- 捕获时间2026-06-12 16:08:34
- 筛选范围:`0.7.3f``last_1_day`ERROR未处理/处理中
- CrashSight numFound57
- 去重 Issue57
- blocking5 个 Issue14 次
- logerror52 个 Issue210 次
- 原始数据:`Temp\CrashSight\Daily_2026-06-12_0.7.3f_redecode_1608`
## 阻断家族
| 家族 | Issue 数 | 次数 | 报告 |
|---|---:|---:|---|
| 空引用异常 | 4 | 13 | [blocking/001_null-reference.md](blocking/001_null-reference.md) |
| 重大事件公告 UI 空引用 | 1 | 1 | [blocking/002_announce-major-event-null.md](blocking/002_announce-major-event-null.md) |
## 非阻断高频
| 类别 | Issue 数 | 次数 |
|---|---:|---:|
| P2P/大厅连接失败诊断 | 5 | 77 |
| 其他项目诊断日志 | 9 | 61 |
| 网络发送失败诊断 | 11 | 24 |
| 多语言 ID 为空 | 9 | 18 |
| AI 计算死循环保护 | 2 | 12 |
| 结算卡住兜底诊断 | 5 | 5 |
| 断线重连/ForceUpdate 诊断 | 3 | 4 |
| 行动执行玩家不一致 | 2 | 3 |
| Origin Player 为空诊断 | 2 | 2 |
| STS/OSS 上传失败诊断 | 2 | 2 |
| UI/Renderer 空保护诊断 | 1 | 1 |
| 相似 Action 重复诊断 | 1 | 1 |
## 报告
- [LogError Summary](logerror_summary.md)
- [空引用异常](blocking/001_null-reference.md)
- [重大事件公告 UI 空引用](blocking/002_announce-major-event-null.md)
## 说明
blocking 的判定只认真实异常类型、异常对象或调用栈;纯 `LogSystem.LogError` 业务状态诊断归入 logerror。
本次通过 CrashSight OpenAPI 抓取样本详情和同设备最近 ERROR 上报序列;若样本 `hasLogFile=false`,文档会明确标记上下文限制。

View File

@ -0,0 +1,80 @@
# LogError Summary
- 筛选范围:`0.7.3f``last_1_day`ERRORstatus `0,2`
- 捕获时间2026-06-12 16:08:34
- 非阻断 Issue52
- 非阻断次数210
## 分类汇总
| 类别 | Issue 数 | 次数 | 设备数 | 代码位置 | 示例 Issue |
|---|---:|---:|---:|---|---|
| P2P/大厅连接失败诊断 | 5 | 77 | 27 | Unity/Assets/Scripts\TH1_Logic\Steam\SimpleP2P.cs:480: LogSystem.LogError($"Connection failed - Reason: {endReason}"); | 7f6131dac5513c0d941c867c5fdda79b, 294ddb9ea1ed79f4f9685b30604d29d1, 03e368c38bf498c0ede3d3d6b1a4ba9 |
| 其他项目诊断日志 | 9 | 61 | 33 | 未直接定位 | 3b1873b47fcdc15a0284798ea83be004, 5fd467876966dade995de78f0f842730, 7076e90b6a985d264771f26e77281aa6 |
| 网络发送失败诊断 | 11 | 24 | 24 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1258: LogSystem.LogError($"ActionConfirm send failed, abort local execute: {ActionId.GetStringLog()}"); | 16bd34f1b4756ad8655c843c0f9da506, ed7645351344dd651c0a27dfc3573b10, 1d0340f4a74af4a27367b74fdfca40e5 |
| 多语言 ID 为空 | 9 | 18 | 18 | Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:176: LogSystem.LogError($"多语言ID为空");<br>Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:200: LogSystem.LogError($"多语言ID为空"); | f5aa9c0a1411b1f09fd13146d745090d, b176950b03c8f954ad35f9520da10d23, bae1cbeda505602c5dbbc984c0fa1d88 |
| AI 计算死循环保护 | 2 | 12 | 6 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:179: LogSystem.LogError($"死循环了,最终记录点为:{MainEditor.Instance.BTNodeId}");<br>Unity/Assets/Scripts\TH1_Logic\AI\AIActionBase.cs:528: LogSystem.LogError($"死循环了"); | 3e65a3369290cfa41e540f0612aefad5, b8f5e42d2f8416ec9ab5e4f260a83b24 |
| 结算卡住兜底诊断 | 5 | 5 | 5 | Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:328: MatchSettlementStuckGuard.CheckAndRecover(map, info, MatchSettlementType.Normal, kv.Key);<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:424: public static class MatchSettlementStuckGuard<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:484: sb.Append("[MatchSettlementStuck] 触发兜底:"); | 57b4823e12accd4cb391b375ca13b229, bf5719f6215aa6dda0ddcfa334e74300, 87f1839a648cac091754402cae2340f4 |
| 断线重连/ForceUpdate 诊断 | 3 | 4 | 4 | Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:418: public void SendRequestForceUpdate()<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:425: LogSystem.LogWarning($"客户端请求重连冷却中: SendRequestForceUpdate, remain={RequestForceUpdateCooldown - (now - _lastRequestForceUpdateTime):F1}s");<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:430: LogSystem.LogError($"客户端请求重连: SendRequestForceUpdate"); | 29ea271af8759bbf7e679bf751ef6373, 519eac5f561dfb99ea775c5294065411, 22fa9e63dc483a12cf3e1db26971c7fd |
| 行动执行玩家不一致 | 2 | 3 | 3 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1231: LogSystem.LogError($"CompleteExecute Player 不一致 {ActionId.GetStringLog()}"); | 217a8eace225fadbb28fe9c001b38d7c, acf75275ad92788914ce511f926df1ad |
| Origin Player 为空诊断 | 2 | 2 | 2 | Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:683: LogSystem.LogError($"Origin Player is null target.id:{target.Id}");<br>Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:738: LogSystem.LogError($"RecoverHealth Origin Player is null target.id:{target.Id}"); | 606d395b63d62132c01a9f712605e0b0, 76c4a73c625af53a1601bc284e2e3013 |
| STS/OSS 上传失败诊断 | 2 | 2 | 2 | Unity/Assets/Scripts\TH1_Logic\Oss\OssManager.cs:127: LogSystem.LogError($"CollectData upload failed: {ex.Message}"); | 4b3f50847e230a1b123fc4d7b72cc3ce, 1f51b04a2682e0031ec4b1bdc1e6ac48 |
| UI/Renderer 空保护诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:409: Debug.LogError("OnGridInfoAction Error: Main.MapData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:416: Debug.LogError("OnGridInfoAction Error: Main.MapData.PlayerMap?.SelfPlayerData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:427: Debug.LogError("OnGridInfoAction Error: UIManager.Instance?.UIInfoManager is null"); | 96f415d89f78f0ac31e19174e23246ba |
| 相似 Action 重复诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:230: if(_sameCount > 5) LogSystem.LogError($"存在相似action ,记录点为:{MainEditor.Instance.BTNodeId} ," + | f1c119ee9f0c60b7f3a383def5491cd6 |
## 明细
| Issue | 类别 | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---|---:|---:|---|---|
| [3b1873b47fcdc15a0284798ea83be004](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3b1873b47fcdc15a0284798ea83be004?pid=10) | 其他项目诊断日志 | UnityLogError | 52 | 24 | 2026-06-12 16:02:51 | Releasing render texture that is set as Camera.targetTexture! |
| [5bf29273f5c83382e8a559c3a51c64b1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5bf29273f5c83382e8a559c3a51c64b1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 48 | 7 | 2026-06-12 16:03:16 | 应用层拒绝连接 - 错误码: 1000可能原因1.对方未创建监听套接字 2.对方主动拒绝 3.对方游戏未运行 |
| [03e368c38bf498c0ede3d3d6b1a4ba9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/03e368c38bf498c0ede3d3d6b1a4ba9?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 25 | 16 | 2026-06-12 16:05:20 | Connection failed - Reason: 1000 |
| [3e65a3369290cfa41e540f0612aefad5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3e65a3369290cfa41e540f0612aefad5?pid=10) | AI 计算死循环保护 | UnityLogError | 11 | 5 | 2026-06-12 16:06:13 | 死循环了 |
| [16bd34f1b4756ad8655c843c0f9da506](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/16bd34f1b4756ad8655c843c0f9da506?pid=10) | 网络发送失败诊断 | UnityLogError | 5 | 5 | 2026-06-12 15:50:53 | MemberStateSyncMessage: 房主广播失败 |
| [ed7645351344dd651c0a27dfc3573b10](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed7645351344dd651c0a27dfc3573b10?pid=10) | 网络发送失败诊断 | UnityLogError | 5 | 5 | 2026-06-12 15:50:52 | P2P broadcast preflight failed: target=76561199261233300, reason=Target is not a lobby peer: 76561199261233300 |
| [b176950b03c8f954ad35f9520da10d23](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b176950b03c8f954ad35f9520da10d23?pid=10) | 多语言 ID 为空 | UnityLogError | 4 | 4 | 2026-06-12 15:54:43 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [f5aa9c0a1411b1f09fd13146d745090d](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f5aa9c0a1411b1f09fd13146d745090d?pid=10) | 多语言 ID 为空 | UnityLogError | 4 | 4 | 2026-06-12 16:03:16 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [442bf5a8e6242beea1cb0ce03556f614](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/442bf5a8e6242beea1cb0ce03556f614?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | MemberStateSyncMessage: 房主广播失败 |
| [ad4750c819ae6ea6a508646025d0eebe](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ad4750c819ae6ea6a508646025d0eebe?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | P2P broadcast preflight failed: target=76561199261233300, reason=No connection to 76561199261233300 |
| [bae1cbeda505602c5dbbc984c0fa1d88](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bae1cbeda505602c5dbbc984c0fa1d88?pid=10) | 多语言 ID 为空 | UnityLogError | 3 | 3 | 2026-06-12 15:54:43 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [217a8eace225fadbb28fe9c001b38d7c](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/217a8eace225fadbb28fe9c001b38d7c?pid=10) | 行动执行玩家不一致 | UnityLogError | 2 | 2 | 2026-06-12 15:08:50 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : ThirdHero |
| [26e2c7ab0fb8fdb0d95355ae254b4995](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/26e2c7ab0fb8fdb0d95355ae254b4995?pid=10) | 其他项目诊断日志 | UnityLogError | 2 | 2 | 2026-06-12 15:34:56 | |
| [389b25b597dc2e0bba3e23df41e2c6b8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/389b25b597dc2e0bba3e23df41e2c6b8?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 16:03:13 | 远程超时 - 目标用户网络问题 |
| [519eac5f561dfb99ea775c5294065411](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/519eac5f561dfb99ea775c5294065411?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:02:24 | 客户端请求重连: SendRequestForceUpdate |
| [949458f51e04d6cf3f4ff9ee18b7e160](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/949458f51e04d6cf3f4ff9ee18b7e160?pid=10) | 多语言 ID 为空 | UnityLogError | 2 | 2 | 2026-06-12 12:42:44 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [ffb81e99d467263e9884a7aec3fcd845](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ffb81e99d467263e9884a7aec3fcd845?pid=10) | 网络发送失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:34:42 | MapConfirmMessage: 房主广播失败 |
| [115622af2c5f78d14b4e6b900ba1d151](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/115622af2c5f78d14b4e6b900ba1d151?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [12dcc82a69446ab0f1cb4caf44b0579a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/12dcc82a69446ab0f1cb4caf44b0579a?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [1d0340f4a74af4a27367b74fdfca40e5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1d0340f4a74af4a27367b74fdfca40e5?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | UpdateLobbyDataMessage: 发送给成员失败 memberId=76561199246777025 |
| [1f51b04a2682e0031ec4b1bdc1e6ac48](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1f51b04a2682e0031ec4b1bdc1e6ac48?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | CollectData upload failed: STS request failed: HTTP/1.1 403 Forbidden |
| [22fa9e63dc483a12cf3e1db26971c7fd](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/22fa9e63dc483a12cf3e1db26971c7fd?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:26:19 | 触发断线重连, 触发原因: OK |
| [294ddb9ea1ed79f4f9685b30604d29d1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/294ddb9ea1ed79f4f9685b30604d29d1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:05:50 | Failed to enter lobby: k_EChatRoomEnterResponseFull |
| [29ea271af8759bbf7e679bf751ef6373](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/29ea271af8759bbf7e679bf751ef6373?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | 触发断线重连, 触发原因: Disconnected |
| [30622ad1a79c1111188744b6714fa6a4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/30622ad1a79c1111188744b6714fa6a4?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:45 | P2P broadcast preflight failed: target=76561198414473361, reason=Connection to 76561198414473361 is not active for queueing. State: k_ESteamNetworkingConnectionState_ClosedByPeer |
| [3734a997ed6d691a08e092e56913c40a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3734a997ed6d691a08e092e56913c40a?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:02 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=437, DataUnits=33, RenderUnits=34, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[436]: Version=436, MapHash=a2d84780acdfeabc1a2702f510a3ffa4 Action : Build Wonder : None Resource : Mine Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitA… |
| [4b3f50847e230a1b123fc4d7b72cc3ce](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/4b3f50847e230a1b123fc4d7b72cc3ce?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | STS request failed: HTTP/1.1 403 Forbidden, Response: {"error":"Steam verification failed: Steam API 请求失败(重试 2 次): Steam API 请求超时8000ms"} |
| [5506094b5e9df26bc4d5fd90349178cb](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5506094b5e9df26bc4d5fd90349178cb?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [55f59da02d6a71a429d56dbe65e20f4f](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/55f59da02d6a71a429d56dbe65e20f4f?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:47 | MemberStateSyncMessage: 房主广播失败 |
| [57b4823e12accd4cb391b375ca13b229](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/57b4823e12accd4cb391b375ca13b229?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:03:31 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=28 NetMode=Single PlayerCount=17 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=28 CityCount=20 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsS… |
| [5fd467876966dade995de78f0f842730](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5fd467876966dade995de78f0f842730?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:49:54 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3504, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3503]: Version=3503, MapHash=10d52600eee9a090a6a724a41a6bf4a6 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation … |
| [606d395b63d62132c01a9f712605e0b0](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/606d395b63d62132c01a9f712605e0b0?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:56:22 | Origin Player is null target.id:1278 |
| [7076e90b6a985d264771f26e77281aa6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/7076e90b6a985d264771f26e77281aa6?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:42:08 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3048, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3047]: Version=3047, MapHash=61a57aa2a6e9d87d426c30289da9c789 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [76c4a73c625af53a1601bc284e2e3013](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/76c4a73c625af53a1601bc284e2e3013?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 08:27:06 | Origin Player is null target.id:430 |
| [775b456dd3864ee2fd0e480673d7c1c9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/775b456dd3864ee2fd0e480673d7c1c9?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:34:42 | P2P broadcast preflight failed: target=76561198446408112, reason=No connection to 76561198446408112 |
| [7f6131dac5513c0d941c867c5fdda79b](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/7f6131dac5513c0d941c867c5fdda79b?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 16:07:44 | Failed to refresh lobby data before joining: 109775243702525678 |
| [82d15ccd49201fabece20edd1853cdda](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/82d15ccd49201fabece20edd1853cdda?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 12:56:27 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2294221302, ActionIndex=2800, DataUnits=75, RenderUnits=76, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2799]: Version=2799, MapHash=808b4dc219c91b84ad23779b57fa27ce Action : UnitMove Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : Non… |
| [87f1839a648cac091754402cae2340f4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/87f1839a648cac091754402cae2340f4?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [881c4ef7885f6fa88ed1f214352fb990](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/881c4ef7885f6fa88ed1f214352fb990?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:32:30 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=2369, DataUnits=76, RenderUnits=77, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2368]: Version=2368, MapHash=110ab1b166ccd6bacb1d56e8db6e8baa Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [8d7cbe77207721b339ce20bf96d27652](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/8d7cbe77207721b339ce20bf96d27652?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | P2P message send failed: target=76561199246777025, reason=Target member is not in lobby: 76561199246777025 |
| [96f415d89f78f0ac31e19174e23246ba](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/96f415d89f78f0ac31e19174e23246ba?pid=10) | UI/Renderer 空保护诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | OnGridInfoAction Error: Main.MapData is null |
| [a63d7c50108ffe49f2c02217f3d8eee8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a63d7c50108ffe49f2c02217f3d8eee8?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:00 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=429, DataUnits=34, RenderUnits=35, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[428]: Version=428, MapHash=be3b9dab92fa24c2de8ac5f6baab80c1 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None … |
| [a92e5105a3a896fb74424242bfbddf0a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a92e5105a3a896fb74424242bfbddf0a?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [acf75275ad92788914ce511f926df1ad](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/acf75275ad92788914ce511f926df1ad?pid=10) | 行动执行玩家不一致 | UnityLogError | 1 | 1 | 2026-06-12 12:39:18 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : MonumentForest |
| [b36fb8882dd4aabcf8618737d0ec5a65](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b36fb8882dd4aabcf8618737d0ec5a65?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [b8f5e42d2f8416ec9ab5e4f260a83b24](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b8f5e42d2f8416ec9ab5e4f260a83b24?pid=10) | AI 计算死循环保护 | UnityLogError | 1 | 1 | 2026-06-12 13:35:32 | 死循环了,最终记录点为:194 |
| [b9ef15d9ba6eda7d608a9816cef2f41b](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b9ef15d9ba6eda7d608a9816cef2f41b?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:46 | P2P broadcast preflight failed: target=76561198414473361, reason=No connection to 76561198414473361 |
| [bf5719f6215aa6dda0ddcfa334e74300](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bf5719f6215aa6dda0ddcfa334e74300?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [e0e8d47df59e68e38968a6d05ed1a882](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e0e8d47df59e68e38968a6d05ed1a882?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 07:48:53 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2242826177, ActionIndex=3149, DataUnits=61, RenderUnits=62, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3148]: Version=3148, MapHash=0ceb6f1746ddba5ef68843f17bc7ad60 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation… |
| [e571d58f12740545f5a2756a546dc992](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e571d58f12740545f5a2756a546dc992?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [ed493d4b6926c3bb5efe569a5db211e3](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed493d4b6926c3bb5efe569a5db211e3?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [f1c119ee9f0c60b7f3a383def5491cd6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f1c119ee9f0c60b7f3a383def5491cd6?pid=10) | 相似 Action 重复诊断 | UnityLogError | 1 | 1 | 2026-06-12 10:59:09 | 存在相似action ,记录点为:771 ,Action为:Action : LearnTech Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : Trade PlayerAction : None AIParam : AllClear Tech : Trade CultureCardType : None 重复次数 :6 |

View File

@ -0,0 +1,234 @@
{
"date": "2026-06-12",
"version": "0.7.3f",
"capture": {
"capturedAtUtc": "2026-06-12T08:08:34+00:00",
"capturedAtLocal": "2026-06-12 16:08:34",
"rawDir": "Temp\\CrashSight\\Daily_2026-06-12_0.7.3f_redecode_1608",
"reportDir": "MD\\CrashSight_2026-06-12_0.7.3f_redecode_1608"
},
"filter": {
"version": "0.7.3f",
"date": "last_1_day",
"status": "0,2",
"exceptionCategoryList": "ERROR",
"sortField": "uploadTime",
"sortOrder": "desc",
"rows": 500
},
"totalIssues": 57,
"blockingIssues": 5,
"blockingOccurrences": 14,
"logerrorIssues": 52,
"logerrorOccurrences": 210,
"blockingReports": [
{
"categoryId": "null-reference",
"title": "空引用异常",
"issueCount": 4,
"occurrences": 13,
"path": "blocking/001_null-reference.md",
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"categoryId": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"issueCount": 1,
"occurrences": 1,
"path": "blocking/002_announce-major-event-null.md",
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
],
"categories": [
{
"id": "p2p-lobby-connection-failure",
"title": "P2P/大厅连接失败诊断",
"class": "logerror",
"issueCount": 5,
"occurrences": 77,
"issues": [
"7f6131dac5513c0d941c867c5fdda79b",
"294ddb9ea1ed79f4f9685b30604d29d1",
"03e368c38bf498c0ede3d3d6b1a4ba9",
"5bf29273f5c83382e8a559c3a51c64b1",
"389b25b597dc2e0bba3e23df41e2c6b8"
]
},
{
"id": "other-logerror",
"title": "其他项目诊断日志",
"class": "logerror",
"issueCount": 9,
"occurrences": 61,
"issues": [
"3b1873b47fcdc15a0284798ea83be004",
"5fd467876966dade995de78f0f842730",
"7076e90b6a985d264771f26e77281aa6",
"26e2c7ab0fb8fdb0d95355ae254b4995",
"881c4ef7885f6fa88ed1f214352fb990",
"82d15ccd49201fabece20edd1853cdda",
"3734a997ed6d691a08e092e56913c40a",
"a63d7c50108ffe49f2c02217f3d8eee8",
"e0e8d47df59e68e38968a6d05ed1a882"
]
},
{
"id": "network-send-failure",
"title": "网络发送失败诊断",
"class": "logerror",
"issueCount": 11,
"occurrences": 24,
"issues": [
"16bd34f1b4756ad8655c843c0f9da506",
"ed7645351344dd651c0a27dfc3573b10",
"1d0340f4a74af4a27367b74fdfca40e5",
"8d7cbe77207721b339ce20bf96d27652",
"775b456dd3864ee2fd0e480673d7c1c9",
"ffb81e99d467263e9884a7aec3fcd845",
"ad4750c819ae6ea6a508646025d0eebe",
"442bf5a8e6242beea1cb0ce03556f614",
"55f59da02d6a71a429d56dbe65e20f4f",
"b9ef15d9ba6eda7d608a9816cef2f41b",
"30622ad1a79c1111188744b6714fa6a4"
]
},
{
"id": "multilingual-empty-id",
"title": "多语言 ID 为空",
"class": "logerror",
"issueCount": 9,
"occurrences": 18,
"issues": [
"f5aa9c0a1411b1f09fd13146d745090d",
"b176950b03c8f954ad35f9520da10d23",
"bae1cbeda505602c5dbbc984c0fa1d88",
"12dcc82a69446ab0f1cb4caf44b0579a",
"115622af2c5f78d14b4e6b900ba1d151",
"b36fb8882dd4aabcf8618737d0ec5a65",
"5506094b5e9df26bc4d5fd90349178cb",
"ed493d4b6926c3bb5efe569a5db211e3",
"949458f51e04d6cf3f4ff9ee18b7e160"
]
},
{
"id": "null-reference",
"title": "空引用异常",
"class": "blocking",
"issueCount": 4,
"occurrences": 13,
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"id": "ai-loop-guard",
"title": "AI 计算死循环保护",
"class": "logerror",
"issueCount": 2,
"occurrences": 12,
"issues": [
"3e65a3369290cfa41e540f0612aefad5",
"b8f5e42d2f8416ec9ab5e4f260a83b24"
]
},
{
"id": "match-settlement-stuck-fallback",
"title": "结算卡住兜底诊断",
"class": "logerror",
"issueCount": 5,
"occurrences": 5,
"issues": [
"57b4823e12accd4cb391b375ca13b229",
"bf5719f6215aa6dda0ddcfa334e74300",
"87f1839a648cac091754402cae2340f4",
"e571d58f12740545f5a2756a546dc992",
"a92e5105a3a896fb74424242bfbddf0a"
]
},
{
"id": "reconnect-forceupdate",
"title": "断线重连/ForceUpdate 诊断",
"class": "logerror",
"issueCount": 3,
"occurrences": 4,
"issues": [
"29ea271af8759bbf7e679bf751ef6373",
"519eac5f561dfb99ea775c5294065411",
"22fa9e63dc483a12cf3e1db26971c7fd"
]
},
{
"id": "action-completeexecute-player-mismatch",
"title": "行动执行玩家不一致",
"class": "logerror",
"issueCount": 2,
"occurrences": 3,
"issues": [
"217a8eace225fadbb28fe9c001b38d7c",
"acf75275ad92788914ce511f926df1ad"
]
},
{
"id": "origin-player-null-diagnostic",
"title": "Origin Player 为空诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 2,
"issues": [
"606d395b63d62132c01a9f712605e0b0",
"76c4a73c625af53a1601bc284e2e3013"
]
},
{
"id": "sts-upload-failure",
"title": "STS/OSS 上传失败诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 2,
"issues": [
"4b3f50847e230a1b123fc4d7b72cc3ce",
"1f51b04a2682e0031ec4b1bdc1e6ac48"
]
},
{
"id": "ui-renderer-null-guard",
"title": "UI/Renderer 空保护诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"96f415d89f78f0ac31e19174e23246ba"
]
},
{
"id": "duplicate-similar-action",
"title": "相似 Action 重复诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"f1c119ee9f0c60b7f3a383def5491cd6"
]
},
{
"id": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"class": "blocking",
"issueCount": 1,
"occurrences": 1,
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
]
}

View File

@ -0,0 +1,88 @@
# 0.7.3f 下午补抓人工分析
- 抓取时间2026-06-12 15:50:49
- 范围:`0.7.3f``last_1_day`ERROR未处理/处理中
- 早上14 个 Issueblocking 1 个 / 1 次logerror 13 个 / 45 次
- 下午53 个 Issueblocking 5 个 / 13 次logerror 48 个 / 190 次
- 差异:新增 39 个 Issue早上 14 个 Issue 全部仍存在
## P0 / 必须先看
### 1. TMP 子网格禁用时空引用
- Issue`dc1340f866d020b4b560a92559c89a21``0b41041d271c3ca1128d6f10e46b27b2``0c808432af82e7b66883205719dbb199`
- 数量9 次,设备数合计 8
- 栈:`TMPro.TMP_SubMeshUI.UpdateMaterial -> SetMaterialDirty -> MaskableGraphic/Image.OnDisable`
- 判断:崩溃发生在 UI 对象 disable/destroy 期间TMP 子网格刷新材质时内部对象为空。`0c808...` 同设备同一秒还有多语言资源加载为空,说明至少与 UI 销毁/重建、多语言文本刷新处于同一批操作,但当前没有完整 Player.log不能证明多语言 null 是直接原因。
- 建议:优先排查带富文本/TMP 子网格的 UI 销毁、reparent、SetActive 流程;重点看 Wiki/公告/弹窗等含多语言文本且会批量销毁子节点的页面。
### 2. StartGame 重大事件公告 UI 空引用
- Issue`fe24c7bf54531228f55d73530508a9fa`
- 数量1 次,设备数 1
- 栈:`Main.NetStartGame -> EventManager.Publish<ShowUIAnnounceMajorEvent> -> UIAnnounceMajorEventController.OnOpen -> UIAnnounceMajorEventView.SetContent`
- 判断:这是项目代码捕获到的真实 `System.NullReferenceException``SetContent` 已检查 `Title/Content/LeaderImage/WonderImage`,所以更可疑的是 StartGame 分支后续假设对象:`Main.MapData.PlayerMap.SelfPlayerData``GetPlayerInfo` 失败后的 `playerInfo``playerInfo` 字段、多语言、`AudioManager.Instance``ChatBubbleText`
- 建议:给 `UIAnnounceMajorEventView.SetContent(StartGame)` 补显式判空和上下文日志,至少记录 eventType、SelfPlayerData、GetPlayerInfo 结果、关键 UI 字段和 AudioManager 状态。
### 3. Animancer 禁用时 Stop 空引用
- Issue`be8ba33741c7c959e4bff388decf5877`
- 数量3 次,设备数 3
- 栈:`AnimancerState.get_NormalizedTime -> set_Time -> Stop -> AnimancerComponent.OnDisable`
- 判断:早上已有 1 次,下午增长到 3 次。直接问题仍然是对象禁用时 Animancer `Stop()` 内部状态为空;没有证据指向 YooAsset。
- 建议:排查带 Animancer 的 UI/角色对象在 disable/destroy 时是否存在空 Clip/State必要时调整 `_ActionOnDisable` 或在销毁前主动清理状态。
## P1 / 高风险非阻断
### 4. 多语言资源加载为空
- Issue`b176950b03c8f954ad35f9520da10d23``f5aa9c0a1411b1f09fd13146d745090d``949458f51e04d6cf3f4ff9ee18b7e160``bae1cbeda505602c5dbbc984c0fa1d88`
- 数量10 次,单个 issue 设备数 2-3
- 日志:`[TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData`
- 判断:这已经不是早上的单设备孤例。`ResourceLoader` 打出这条日志前已经通过 `CheckLocationValid`,所以不是路径不存在;失败点是 YooAsset handle 里取不到 `MultilingualData` 对象。结合 6 月 10 日资源转 AB、6 月 11 日多语言进 Hotfix仍应按“AB/manifest/Hotfix 程序集组合不一致或本机包对象不可反序列化”处理。
- 建议:发布侧强制全量重打 AB 与 Hotfix同步校验 `PackageManifest``defaultpackage_assets_bundleresources_export` bundle、`TH1.Hotfix.dll` 一致性;运行时给 `Loaded null resource` 增加 handle status / LastError / package version / manifest version / hotfix version。
### 5. 多语言 ID 为空
- Issue`12dcc82a69446ab0f1cb4caf44b0579a``115622af2c5f78d14b4e6b900ba1d151``b36fb8882dd4aabcf8618737d0ec5a65``5506094b5e9df26bc4d5fd90349178cb``ed493d4b6926c3bb5efe569a5db211e3`
- 数量5 次,设备数 5
- 代码:`MultilingualManager.GetMultilingualTextSafe`
- 判断:这是调用方传入空字符串或非法 ID和资源加载为空不是同一个问题。它会造成局部文本缺失但不等同于全局多语言资源加载失败。
- 建议:下一步按 crash context 抓具体调用栈或加调用方上下文日志,记录传入 idString 和调用 UI。
### 6. P2P / 大厅连接失败与网络广播失败
- P2P 连接失败2 个 Issue / 70 次 / 22 设备
- 网络发送失败11 个 Issue / 22 次 / 22 设备
- 断线重连/ForceUpdate3 个 Issue / 4 次 / 4 设备
- 判断:主要集中在 `Connection failed - Reason: 1000`、应用层拒绝连接、目标不在 lobby、目标没有连接、房主广播失败。它们不是崩溃但数量最高说明联机连接状态与 lobby 成员状态之间仍有较大噪声。
- 建议:把 `SimpleP2P` 的连接失败日志从 ERROR 降级或增加聚合限流,同时重点查 `SteamLobbyManager` 广播前成员列表与 SimpleP2P 连接表不同步的问题。
### 7. RenderTexture 正在作为 Camera.targetTexture 时被释放
- Issue`3b1873b47fcdc15a0284798ea83be004`
- 数量46 次22 设备
- 日志:`Releasing render texture that is set as Camera.targetTexture!`
- 判断:这是 Unity 引擎级 ERROR通常表示释放 RenderTexture 前没有先从 Camera.targetTexture 解绑定。数量高但没有项目栈。
- 建议:排查 UI 预览、头像、Wiki/Info 面板、RenderTexture 池化或场景相机目标纹理切换逻辑;释放前统一 `camera.targetTexture = null`
### 8. AI 计算死循环保护
- Issue`3e65a3369290cfa41e540f0612aefad5``b8f5e42d2f8416ec9ab5e4f260a83b24`
- 数量11 次5 设备
- 代码:`AILogic.StartAILogic``AIActionBase`
- 判断:保护日志触发说明 AI 行为树或行动选择仍会进入重复节点/重复 action 场景;不是崩溃,但可能造成回合卡顿或 AI 行为异常。
- 建议:保留 BTNodeId、重复 action、MapHash、PlayerId按最高频节点复现。
### 9. 结算卡住兜底
- Issue5 个 / 5 次 / 5 设备
- 代码:`MatchSettlementStuckGuard.CheckAndRecover`
- 判断:兜底生效代表真实存在 `PlayerSettlementGroup` 没有被翻成 `IsSettlement` 的场景,当前保护避免了卡死,但根因仍在结算状态流转。
- 建议:优先看 `Normal` 结算、`AllSuccessOrFailure`、投降/死亡/胜利任务混合状态。
## P2 / 继续观察
- 行动执行玩家不一致:`BuyCultureCard` 两类3 次 / 3 设备,需要看文化卡购买时 action param 的 PlayerId 与当前执行玩家。
- STS/OSS 上传失败2 次 / 2 设备,后端 Steam verification 超时或 403影响收集数据上传。
- UnitRendererMismatchBeforeAction分散在多个单次 issue说明数据层/渲染层单位数量仍会短暂不一致,当前是诊断日志,需和具体 action 合并分析。

View File

@ -0,0 +1,193 @@
# 空引用异常
- 分类blocking
- Issue 数4
- `0.7.3f` 最近一天次数12
- 设备数合计11
- 报告生成2026-06-12 15:50:49
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [dc1340f866d020b4b560a92559c89a21](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/dc1340f866d020b4b560a92559c89a21?pid=10) | NullReferenceException | 5 | 4 | 2026-06-12 15:31:20 | Object reference not set to an instance of an object. |
| [0b41041d271c3ca1128d6f10e46b27b2](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0b41041d271c3ca1128d6f10e46b27b2?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:31:04 | Object reference not set to an instance of an object. |
| [be8ba33741c7c959e4bff388decf5877](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/be8ba33741c7c959e4bff388decf5877?pid=10) | NullReferenceException | 3 | 3 | 2026-06-12 15:14:07 | Object reference not set to an instance of an object. |
| [0c808432af82e7b66883205719dbb199](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/0c808432af82e7b66883205719dbb199?pid=10) | NullReferenceException | 1 | 1 | 2026-06-12 12:42:42 | Object reference not set to an instance of an object. |
## 设备上下文
### dc1340f866d020b4b560a92559c89a21
- 样本 CrashId`d034b91bdf6d4bd38179a5468c277dd4`
- 样本 DeviceId`00-ff-fb-5d-e8-e7`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:38:25 | 115622af2c5f78d14b4e6b900ba1d151 | | |
| 2026-06-12 15:38:25 | 12dcc82a69446ab0f1cb4caf44b0579a | | |
| 2026-06-12 15:38:24 | ed493d4b6926c3bb5efe569a5db211e3 | | |
| 2026-06-12 15:38:24 | 5506094b5e9df26bc4d5fd90349178cb | | |
| 2026-06-12 15:38:24 | b36fb8882dd4aabcf8618737d0ec5a65 | | |
| 2026-06-12 15:31:20 | dc1340f866d020b4b560a92559c89a21 | | |
| 2026-06-12 15:31:20 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 15:31:04 | dc1340f866d020b4b560a92559c89a21 | | |
### 0b41041d271c3ca1128d6f10e46b27b2
- 样本 CrashId`5ad98ebcb8f44bc39580417051d745bb`
- 样本 DeviceId`00-ff-fb-5d-e8-e7`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
TMPro.TMP_SubMeshUI.UpdateMaterial () (at <00000000000000000000000000000000>.0)
TMPro.TMP_SubMeshUI.SetMaterialDirty () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskUtilities.NotifyStencilStateChanged (UnityEngine.Component mask) (at <00000000000000000000000000000000>.0)
UnityEngine.UI.MaskableGraphic.OnDisable () (at <00000000000000000000000000000000>.0)
UnityEngine.UI.Image.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:38:25 | 115622af2c5f78d14b4e6b900ba1d151 | | |
| 2026-06-12 15:38:25 | 12dcc82a69446ab0f1cb4caf44b0579a | | |
| 2026-06-12 15:38:24 | ed493d4b6926c3bb5efe569a5db211e3 | | |
| 2026-06-12 15:38:24 | 5506094b5e9df26bc4d5fd90349178cb | | |
| 2026-06-12 15:38:24 | b36fb8882dd4aabcf8618737d0ec5a65 | | |
| 2026-06-12 15:31:20 | dc1340f866d020b4b560a92559c89a21 | | |
| 2026-06-12 15:31:20 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 15:31:04 | dc1340f866d020b4b560a92559c89a21 | | |
### be8ba33741c7c959e4bff388decf5877
- 样本 CrashId`7cc68a71c55b4abbab7c7cdb370d6a46`
- 样本 DeviceId`d4-93-90-2e-72-b4`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
NullReferenceException
Object reference not set to an instance of an object.
Animancer.AnimancerState.get_NormalizedTime () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.set_Time (System.Single value) (at <00000000000000000000000000000000>.0)
Animancer.AnimancerState.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerLayer.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.Stop () (at <00000000000000000000000000000000>.0)
Animancer.AnimancerComponent.OnDisable () (at <00000000000000000000000000000000>.0)
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:14:07 | be8ba33741c7c959e4bff388decf5877 | | |
| 2026-06-12 15:14:06 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 15:10:32 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:05:27 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 15:05:26 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
| 2026-06-12 14:23:04 | 3b1873b47fcdc15a0284798ea83be004 | | |
| 2026-06-12 14:05:08 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 13:57:01 | 5bf29273f5c83382e8a559c3a51c64b1 | | |
## 代码位置
- 未通过固定文本直接定位;需要结合解码栈继续追。
## 解码结论
反混淆命中 `0`,这些栈不是业务混淆名,而是 Unity/TMP/Animancer 的明文运行时栈。这个报告里的 4 个 Issue 不能当成同一个根因处理:
- `dc1340f866d020b4b560a92559c89a21``0b41041d271c3ca1128d6f10e46b27b2``0c808432af82e7b66883205719dbb199`:共同栈顶是 `TMPro.TMP_SubMeshUI.UpdateMaterial -> SetMaterialDirty -> MaskableGraphic/Image.OnDisable`,说明崩在 UI 对象禁用/销毁期间TMP 子网格刷新材质时内部对象为空。`0c808...` 同设备同一秒还出现多语言资源加载为空,说明这条至少和 UI 销毁/重建、多语言文本刷新处在同一批操作里;但样本没有完整 Player.log不能证明多语言 null 是 TMP NRE 的直接原因。
- `be8ba33741c7c959e4bff388decf5877`:共同栈顶是 `AnimancerState.get_NormalizedTime -> Stop -> AnimancerComponent.OnDisable`,和 TMP 无关;这是动画组件禁用时 `Stop()` 过程中空引用,仍然更像 UI/GameObject disable 触发的第三方组件生命周期问题。
因此建议拆成两个修复方向:一是排查含 TMP 子网格的 UI 销毁/禁用流程,尤其是同设备伴随多语言加载失败的页面;二是单独排查带 Animancer 的对象在禁用时是否有空 Clip/State 或销毁顺序问题。
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,83 @@
# 重大事件公告 UI 空引用
- 分类blocking
- Issue 数1
- `0.7.3f` 最近一天次数1
- 设备数合计1
- 报告生成2026-06-12 15:50:49
## Issue
| Issue | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---:|---:|---|---|
| [fe24c7bf54531228f55d73530508a9fa](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/fe24c7bf54531228f55d73530508a9fa?pid=10) | UnityLogError | 1 | 1 | 2026-06-12 15:02:34 | EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object. at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0 at TH… |
## 设备上下文
### fe24c7bf54531228f55d73530508a9fa
- 样本 CrashId`18ce090edbf0448097312f6fd79db8d6`
- 样本 DeviceId`80-fa-5b-68-87-2b`
- CrashSight 附带日志文件:`False`
最终上报内容:
```text
UnityLogError
EventManager Publish<ShowUIAnnounceMajorEvent> listener failed: System.NullReferenceException: Object reference not set to an instance of an object.
at TH1_UI.View.Announce.UIAnnounceMajorEventView.SetContent (TH1_Core.Events.UIAnnounceMajorEventType eventType, System.Int32 param1, System.Int32 param2) [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Announce.UIAnnounceMajorEventController.OnOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TrueOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._OnViewStart () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T]._TryOpen () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].Open () [0x00000] in <00000000000000000000000000000000>:0
at TH1_UI.Controller.Base.ViewController`1[T].OpenWithParam (System.Object param) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Presentation.Sequencer.Task.UISequencerTask.Execute (System.Action onComplete) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.TryProcessNext () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.PresentationManager.EnqueueTask (TH1_Presentation.Sequencer.Task.ISequencerTask task, System.Boolean viewNextFrame) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Events.UIEventManagerBinder.HandleShowUIAnnounceMajorEvent (TH1_Core.Events.ShowUIAnnounceMajorEvent evt) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Core.Managers.EventManager.Publish[T] (T eventData) [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main+<>c.<NetStartGame>b__50_0 () [0x00000] in <00000000000000000000000000000000>:0
at Timer.Update () [0x00000] in <00000000000000000000000000000000>:0
at TH1_Logic.Core.Main.Update () [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.Debug.LogError(Object)
Logic.CrashSight.LogSystem.LogError(String, Object)
TH1_Core.Managers.EventManager.Pub
...
```
同设备最近 ERROR 上报序列:
| 时间 | Issue | 类型 | 消息 |
|---|---|---|---|
| 2026-06-12 15:50:53 | 16bd34f1b4756ad8655c843c0f9da506 | | |
| 2026-06-12 15:50:52 | ed7645351344dd651c0a27dfc3573b10 | | |
| 2026-06-12 15:34:56 | 26e2c7ab0fb8fdb0d95355ae254b4995 | | |
| 2026-06-12 15:34:41 | 03e368c38bf498c0ede3d3d6b1a4ba9 | | |
| 2026-06-12 15:02:34 | fe24c7bf54531228f55d73530508a9fa | | |
| 2026-06-12 15:02:25 | 96f415d89f78f0ac31e19174e23246ba | | |
| 2026-06-12 15:02:25 | 29ea271af8759bbf7e679bf751ef6373 | | |
| 2026-06-12 15:02:24 | 519eac5f561dfb99ea775c5294065411 | | |
## 代码位置
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:16: public class UIAnnounceMajorEventView : Base.View`
- `Unity/Assets/Scripts\TH1_UI\View\Announce\UIAnnounceMajorEventView.cs:63: LogSystem.LogError("UIAnnounceMajorEventView.SetContent(): Title or Content or Image or Image is null");`
- `Unity/Assets/Scripts\TH1_UI\Controller\Announce\UIAnnounceMajorEventController.cs:15: public class UIAnnounceMajorEventController : ViewController<UIAnnounceMajorEventView>, IEscClosable // 泛型参数是对应的View脚本`
## 解码结论
这条不是普通项目诊断,而是 `EventManager.Publish<ShowUIAnnounceMajorEvent>` 捕获到的真实 `System.NullReferenceException`。调用链清楚:`Main.NetStartGame` 在开局后 1.5 秒发布 `ShowUIAnnounceMajorEvent(StartGame)``UIEventManagerBinder` 把它排进 `PresentationManager``UIAnnounceMajorEventController.OnOpen``UIAnnounceMajorEventView.SetContent`,随后在 `SetContent` 内空引用。
可疑点集中在 `StartGame` 分支:`SetContent` 先检查了 `Title/Content/LeaderImage/WonderImage`,如果这些字段为空会提前 `return`,所以实际 NRE 更可能发生在后续对象假设上,例如 `Main.MapData.PlayerMap.SelfPlayerData``Table.Instance.PlayerDataAssets.GetPlayerInfo` 未成功但仍使用 `playerInfo``playerInfo.LeaderName/CivName/MusicName/LeaderAvatar``AudioManager.Instance``ChatBubbleText`。当前 CrashSight 没有行号和完整 Player.log无法在这些候选里再缩小到唯一字段。
建议给 `StartGame` 分支补显式判空和带上下文日志eventType、param、MapData 是否为空、SelfPlayerData id、GetPlayerInfo 是否成功、Title/Content/LeaderImage/WonderImage/ChatBubbleText/AudioManager 是否为空。这个位置会影响联机开局公告,优先级高于普通 LogError。
## 判断
这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。
本批样本 `hasLogFile=false`API 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。
## 建议
优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。

View File

@ -0,0 +1,53 @@
# CrashSight 0.7.3f 最近一天 ERROR 分析
- 捕获时间2026-06-12 15:50:49
- 筛选范围:`0.7.3f``last_1_day`ERROR未处理/处理中
- CrashSight numFound53
- 去重 Issue53
- blocking5 个 Issue13 次
- logerror48 个 Issue190 次
- 原始数据:`Temp\CrashSight\Daily_2026-06-12_0.7.3f_refresh_1550`
## 阻断家族
| 家族 | Issue 数 | 次数 | 报告 |
|---|---:|---:|---|
| 空引用异常 | 4 | 12 | [blocking/001_null-reference.md](blocking/001_null-reference.md) |
| 重大事件公告 UI 空引用 | 1 | 1 | [blocking/002_announce-major-event-null.md](blocking/002_announce-major-event-null.md) |
## 非阻断高频
| 类别 | Issue 数 | 次数 |
|---|---:|---:|
| P2P/大厅连接失败诊断 | 2 | 70 |
| 其他项目诊断日志 | 9 | 55 |
| 网络发送失败诊断 | 11 | 22 |
| 多语言资源加载为空 / 多语言 ID 为空 | 9 | 15 |
| AI 计算死循环保护 | 2 | 11 |
| 结算卡住兜底诊断 | 5 | 5 |
| 断线重连/ForceUpdate 诊断 | 3 | 4 |
| 行动执行玩家不一致 | 2 | 3 |
| STS/OSS 上传失败诊断 | 2 | 2 |
| Origin Player 为空诊断 | 1 | 1 |
| UI/Renderer 空保护诊断 | 1 | 1 |
| 相似 Action 重复诊断 | 1 | 1 |
## 报告
- [LogError Summary](logerror_summary.md)
- [人工分析](analysis.md)
- [空引用异常](blocking/001_null-reference.md)
- [重大事件公告 UI 空引用](blocking/002_announce-major-event-null.md)
## 人工复核要点
- 下午重新抓取后,早上 14 个 Issue 全部仍存在,新增 39 个 Issue主要增量来自 P2P/大厅连接失败、网络广播失败、TMP 子网格禁用时空引用、结算卡住兜底和多语言相关日志。
- `空引用异常` 不是一个根因:其中 `dc1340...``0b410...``0c808...``TMPro.TMP_SubMeshUI` 在 UI 禁用/Mask 状态刷新时空引用;`be8ba...``AnimancerComponent.OnDisable -> Stop` 链路空引用。
- `重大事件公告 UI 空引用` 是项目代码捕获到的真实异常:`NetStartGame` 延迟发布 `ShowUIAnnounceMajorEvent(StartGame)`UI 打开后在 `UIAnnounceMajorEventView.SetContent` 内 NRE。
- 多语言相关日志被自动分类合并到同一类,但里面有两种不同问题:`[TH1.YooAsset] Loaded null resource: ... MultilingualData` 是资源对象加载为空;`多语言ID为空` 是调用方传入空/非法 ID。
- 本批 blocking 样本均 `hasLogFile=false`API 只能看到最终上报栈和同设备 ERROR 序列,无法看到完整 Player.log 中更早的 Unity/YooAsset/TMP 内部错误。
## 说明
blocking 的判定只认真实异常类型、异常对象或调用栈;纯 `LogSystem.LogError` 业务状态诊断归入 logerror。
本次通过 CrashSight OpenAPI 抓取样本详情和同设备最近 ERROR 上报序列;若样本 `hasLogFile=false`,文档会明确标记上下文限制。

View File

@ -0,0 +1,76 @@
# LogError Summary
- 筛选范围:`0.7.3f``last_1_day`ERRORstatus `0,2`
- 捕获时间2026-06-12 15:50:49
- 非阻断 Issue48
- 非阻断次数190
## 分类汇总
| 类别 | Issue 数 | 次数 | 设备数 | 代码位置 | 示例 Issue |
|---|---:|---:|---:|---|---|
| P2P/大厅连接失败诊断 | 2 | 70 | 22 | Unity/Assets/Scripts\TH1_Logic\Steam\SimpleP2P.cs:480: LogSystem.LogError($"Connection failed - Reason: {endReason}"); | 03e368c38bf498c0ede3d3d6b1a4ba9, 5bf29273f5c83382e8a559c3a51c64b1 |
| 其他项目诊断日志 | 9 | 55 | 31 | 未直接定位 | 5fd467876966dade995de78f0f842730, 7076e90b6a985d264771f26e77281aa6, 26e2c7ab0fb8fdb0d95355ae254b4995 |
| 网络发送失败诊断 | 11 | 22 | 22 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1242: LogSystem.LogError($"ActionConfirm send failed, abort local execute: {ActionId.GetStringLog()}"); | 1d0340f4a74af4a27367b74fdfca40e5, 8d7cbe77207721b339ce20bf96d27652, ed7645351344dd651c0a27dfc3573b10 |
| 多语言资源加载为空 / 多语言 ID 为空 | 9 | 15 | 15 | Unity/Assets/Scripts\TH1_AOT\ResourceLoader.cs:89: Debug.LogError($"[TH1.YooAsset] Loaded null resource: {resolvedLocation}, type={typeof(T).Name}");<br>Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:176: LogSystem.LogError($"多语言ID为空");<br>Unity/Assets/Scripts\TH1_Logic\Multilingual\MultilingualManager.cs:200: LogSystem.LogError($"多语言ID为空"); | b176950b03c8f954ad35f9520da10d23, f5aa9c0a1411b1f09fd13146d745090d, 12dcc82a69446ab0f1cb4caf44b0579a |
| AI 计算死循环保护 | 2 | 11 | 5 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:179: LogSystem.LogError($"死循环了,最终记录点为:{MainEditor.Instance.BTNodeId}");<br>Unity/Assets/Scripts\TH1_Logic\AI\AIActionBase.cs:528: LogSystem.LogError($"死循环了"); | 3e65a3369290cfa41e540f0612aefad5, b8f5e42d2f8416ec9ab5e4f260a83b24 |
| 结算卡住兜底诊断 | 5 | 5 | 5 | Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:328: MatchSettlementStuckGuard.CheckAndRecover(map, info, MatchSettlementType.Normal, kv.Key);<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:424: public static class MatchSettlementStuckGuard<br>Unity/Assets/Scripts\TH1_Logic\MatchConfig\MatchSettlementInfo.cs:484: sb.Append("[MatchSettlementStuck] 触发兜底:"); | 57b4823e12accd4cb391b375ca13b229, bf5719f6215aa6dda0ddcfa334e74300, 87f1839a648cac091754402cae2340f4 |
| 断线重连/ForceUpdate 诊断 | 3 | 4 | 4 | Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:418: public void SendRequestForceUpdate()<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:425: LogSystem.LogWarning($"客户端请求重连冷却中: SendRequestForceUpdate, remain={RequestForceUpdateCooldown - (now - _lastRequestForceUpdateTime):F1}s");<br>Unity/Assets/Scripts\TH1_Logic\Steam\GameNetSender.cs:430: LogSystem.LogError($"客户端请求重连: SendRequestForceUpdate"); | 29ea271af8759bbf7e679bf751ef6373, 519eac5f561dfb99ea775c5294065411, 22fa9e63dc483a12cf3e1db26971c7fd |
| 行动执行玩家不一致 | 2 | 3 | 3 | Unity/Assets/Scripts\TH1_Logic\Action\ActionLogic.cs:1215: LogSystem.LogError($"CompleteExecute Player 不一致 {ActionId.GetStringLog()}"); | 217a8eace225fadbb28fe9c001b38d7c, acf75275ad92788914ce511f926df1ad |
| STS/OSS 上传失败诊断 | 2 | 2 | 2 | Unity/Assets/Scripts\TH1_Logic\Oss\OssManager.cs:127: LogSystem.LogError($"CollectData upload failed: {ex.Message}"); | 4b3f50847e230a1b123fc4d7b72cc3ce, 1f51b04a2682e0031ec4b1bdc1e6ac48 |
| Origin Player 为空诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:683: LogSystem.LogError($"Origin Player is null target.id:{target.Id}");<br>Unity/Assets/Scripts\TH1_Logic\Unit\UnitLogic.cs:738: LogSystem.LogError($"RecoverHealth Origin Player is null target.id:{target.Id}"); | 76c4a73c625af53a1601bc284e2e3013 |
| UI/Renderer 空保护诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:409: Debug.LogError("OnGridInfoAction Error: Main.MapData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:416: Debug.LogError("OnGridInfoAction Error: Main.MapData.PlayerMap?.SelfPlayerData is null");<br>Unity/Assets/Scripts\TH1_Logic\Input\InputLogic.cs:427: Debug.LogError("OnGridInfoAction Error: UIManager.Instance?.UIInfoManager is null"); | 96f415d89f78f0ac31e19174e23246ba |
| 相似 Action 重复诊断 | 1 | 1 | 1 | Unity/Assets/Scripts\TH1_Logic\AI\AILogic.cs:230: if(_sameCount > 5) LogSystem.LogError($"存在相似action ,记录点为:{MainEditor.Instance.BTNodeId} ," + | f1c119ee9f0c60b7f3a383def5491cd6 |
## 明细
| Issue | 类别 | 类型 | 次数 | 设备 | 最近上报 | 消息 |
|---|---|---|---:|---:|---|---|
| [5bf29273f5c83382e8a559c3a51c64b1](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5bf29273f5c83382e8a559c3a51c64b1?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 47 | 6 | 2026-06-12 15:31:20 | 应用层拒绝连接 - 错误码: 1000可能原因1.对方未创建监听套接字 2.对方主动拒绝 3.对方游戏未运行 |
| [3b1873b47fcdc15a0284798ea83be004](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3b1873b47fcdc15a0284798ea83be004?pid=10) | 其他项目诊断日志 | UnityLogError | 46 | 22 | 2026-06-12 15:28:48 | Releasing render texture that is set as Camera.targetTexture! |
| [03e368c38bf498c0ede3d3d6b1a4ba9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/03e368c38bf498c0ede3d3d6b1a4ba9?pid=10) | P2P/大厅连接失败诊断 | UnityLogError | 23 | 16 | 2026-06-12 15:37:43 | Connection failed - Reason: 1000 |
| [3e65a3369290cfa41e540f0612aefad5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3e65a3369290cfa41e540f0612aefad5?pid=10) | AI 计算死循环保护 | UnityLogError | 10 | 4 | 2026-06-12 15:16:58 | 死循环了 |
| [16bd34f1b4756ad8655c843c0f9da506](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/16bd34f1b4756ad8655c843c0f9da506?pid=10) | 网络发送失败诊断 | UnityLogError | 4 | 4 | 2026-06-12 15:34:42 | MemberStateSyncMessage: 房主广播失败 |
| [ed7645351344dd651c0a27dfc3573b10](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed7645351344dd651c0a27dfc3573b10?pid=10) | 网络发送失败诊断 | UnityLogError | 4 | 4 | 2026-06-12 15:34:42 | P2P broadcast preflight failed: target=76561199261233300, reason=Target is not a lobby peer: 76561199261233300 |
| [442bf5a8e6242beea1cb0ce03556f614](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/442bf5a8e6242beea1cb0ce03556f614?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | MemberStateSyncMessage: 房主广播失败 |
| [ad4750c819ae6ea6a508646025d0eebe](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ad4750c819ae6ea6a508646025d0eebe?pid=10) | 网络发送失败诊断 | UnityLogError | 3 | 3 | 2026-06-12 15:34:41 | P2P broadcast preflight failed: target=76561199261233300, reason=No connection to 76561199261233300 |
| [b176950b03c8f954ad35f9520da10d23](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b176950b03c8f954ad35f9520da10d23?pid=10) | 多语言资源加载为空 | UnityLogError | 3 | 3 | 2026-06-12 12:42:42 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [f5aa9c0a1411b1f09fd13146d745090d](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f5aa9c0a1411b1f09fd13146d745090d?pid=10) | 多语言资源加载为空 | UnityLogError | 3 | 3 | 2026-06-12 14:25:08 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [217a8eace225fadbb28fe9c001b38d7c](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/217a8eace225fadbb28fe9c001b38d7c?pid=10) | 行动执行玩家不一致 | UnityLogError | 2 | 2 | 2026-06-12 15:08:50 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : ThirdHero |
| [26e2c7ab0fb8fdb0d95355ae254b4995](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/26e2c7ab0fb8fdb0d95355ae254b4995?pid=10) | 其他项目诊断日志 | UnityLogError | 2 | 2 | 2026-06-12 15:34:56 | |
| [519eac5f561dfb99ea775c5294065411](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/519eac5f561dfb99ea775c5294065411?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:02:24 | 客户端请求重连: SendRequestForceUpdate |
| [949458f51e04d6cf3f4ff9ee18b7e160](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/949458f51e04d6cf3f4ff9ee18b7e160?pid=10) | 多语言资源加载为空 | UnityLogError | 2 | 2 | 2026-06-12 12:42:44 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [bae1cbeda505602c5dbbc984c0fa1d88](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bae1cbeda505602c5dbbc984c0fa1d88?pid=10) | 多语言资源加载为空 | UnityLogError | 2 | 2 | 2026-06-12 12:42:43 | [TH1.YooAsset] Loaded null resource: Assets/BundleResources/Export/Multilingual, type=MultilingualData |
| [ffb81e99d467263e9884a7aec3fcd845](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ffb81e99d467263e9884a7aec3fcd845?pid=10) | 网络发送失败诊断 | UnityLogError | 2 | 2 | 2026-06-12 15:34:42 | MapConfirmMessage: 房主广播失败 |
| [115622af2c5f78d14b4e6b900ba1d151](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/115622af2c5f78d14b4e6b900ba1d151?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [12dcc82a69446ab0f1cb4caf44b0579a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/12dcc82a69446ab0f1cb4caf44b0579a?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:25 | 多语言ID为空 |
| [1d0340f4a74af4a27367b74fdfca40e5](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1d0340f4a74af4a27367b74fdfca40e5?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | UpdateLobbyDataMessage: 发送给成员失败 memberId=76561199246777025 |
| [1f51b04a2682e0031ec4b1bdc1e6ac48](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/1f51b04a2682e0031ec4b1bdc1e6ac48?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | CollectData upload failed: STS request failed: HTTP/1.1 403 Forbidden |
| [22fa9e63dc483a12cf3e1db26971c7fd](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/22fa9e63dc483a12cf3e1db26971c7fd?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:26:19 | 触发断线重连, 触发原因: OK |
| [29ea271af8759bbf7e679bf751ef6373](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/29ea271af8759bbf7e679bf751ef6373?pid=10) | 断线重连/ForceUpdate 诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | 触发断线重连, 触发原因: Disconnected |
| [30622ad1a79c1111188744b6714fa6a4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/30622ad1a79c1111188744b6714fa6a4?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:45 | P2P broadcast preflight failed: target=76561198414473361, reason=Connection to 76561198414473361 is not active for queueing. State: k_ESteamNetworkingConnectionState_ClosedByPeer |
| [3734a997ed6d691a08e092e56913c40a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/3734a997ed6d691a08e092e56913c40a?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:02 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=437, DataUnits=33, RenderUnits=34, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[436]: Version=436, MapHash=a2d84780acdfeabc1a2702f510a3ffa4 Action : Build Wonder : None Resource : Mine Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitA… |
| [4b3f50847e230a1b123fc4d7b72cc3ce](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/4b3f50847e230a1b123fc4d7b72cc3ce?pid=10) | STS/OSS 上传失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:14:36 | STS request failed: HTTP/1.1 403 Forbidden, Response: {"error":"Steam verification failed: Steam API 请求失败(重试 2 次): Steam API 请求超时8000ms"} |
| [5506094b5e9df26bc4d5fd90349178cb](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5506094b5e9df26bc4d5fd90349178cb?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [55f59da02d6a71a429d56dbe65e20f4f](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/55f59da02d6a71a429d56dbe65e20f4f?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:47 | MemberStateSyncMessage: 房主广播失败 |
| [57b4823e12accd4cb391b375ca13b229](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/57b4823e12accd4cb391b375ca13b229?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:03:31 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=28 NetMode=Single PlayerCount=17 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=28 CityCount=20 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsS… |
| [5fd467876966dade995de78f0f842730](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/5fd467876966dade995de78f0f842730?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:49:54 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3504, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3503]: Version=3503, MapHash=10d52600eee9a090a6a724a41a6bf4a6 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation … |
| [7076e90b6a985d264771f26e77281aa6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/7076e90b6a985d264771f26e77281aa6?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:42:08 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=3048, DataUnits=50, RenderUnits=51, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3047]: Version=3047, MapHash=61a57aa2a6e9d87d426c30289da9c789 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [76c4a73c625af53a1601bc284e2e3013](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/76c4a73c625af53a1601bc284e2e3013?pid=10) | Origin Player 为空诊断 | UnityLogError | 1 | 1 | 2026-06-12 08:27:06 | Origin Player is null target.id:430 |
| [775b456dd3864ee2fd0e480673d7c1c9](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/775b456dd3864ee2fd0e480673d7c1c9?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:34:42 | P2P broadcast preflight failed: target=76561198446408112, reason=No connection to 76561198446408112 |
| [82d15ccd49201fabece20edd1853cdda](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/82d15ccd49201fabece20edd1853cdda?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 12:56:27 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2294221302, ActionIndex=2800, DataUnits=75, RenderUnits=76, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2799]: Version=2799, MapHash=808b4dc219c91b84ad23779b57fa27ce Action : UnitMove Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : Non… |
| [87f1839a648cac091754402cae2340f4](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/87f1839a648cac091754402cae2340f4?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [881c4ef7885f6fa88ed1f214352fb990](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/881c4ef7885f6fa88ed1f214352fb990?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 15:32:30 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=131154980, ActionIndex=2369, DataUnits=76, RenderUnits=77, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[2368]: Version=2368, MapHash=110ab1b166ccd6bacb1d56e8db6e8baa Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : No… |
| [8d7cbe77207721b339ce20bf96d27652](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/8d7cbe77207721b339ce20bf96d27652?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:37:44 | P2P message send failed: target=76561199246777025, reason=Target member is not in lobby: 76561199246777025 |
| [96f415d89f78f0ac31e19174e23246ba](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/96f415d89f78f0ac31e19174e23246ba?pid=10) | UI/Renderer 空保护诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:02:25 | OnGridInfoAction Error: Main.MapData is null |
| [a63d7c50108ffe49f2c02217f3d8eee8](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a63d7c50108ffe49f2c02217f3d8eee8?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 10:32:00 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=634905386, ActionIndex=429, DataUnits=34, RenderUnits=35, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[428]: Version=428, MapHash=be3b9dab92fa24c2de8ac5f6baab80c1 Action : UnitAttack Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None … |
| [a92e5105a3a896fb74424242bfbddf0a](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/a92e5105a3a896fb74424242bfbddf0a?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [acf75275ad92788914ce511f926df1ad](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/acf75275ad92788914ce511f926df1ad?pid=10) | 行动执行玩家不一致 | UnityLogError | 1 | 1 | 2026-06-12 12:39:18 | CompleteExecute Player 不一致 Action : BuyCultureCard Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : None PlayerAction : None AIParam : AllClear Tech : None CultureCardType : MonumentForest |
| [b36fb8882dd4aabcf8618737d0ec5a65](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b36fb8882dd4aabcf8618737d0ec5a65?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [b8f5e42d2f8416ec9ab5e4f260a83b24](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b8f5e42d2f8416ec9ab5e4f260a83b24?pid=10) | AI 计算死循环保护 | UnityLogError | 1 | 1 | 2026-06-12 13:35:32 | 死循环了,最终记录点为:194 |
| [b9ef15d9ba6eda7d608a9816cef2f41b](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/b9ef15d9ba6eda7d608a9816cef2f41b?pid=10) | 网络发送失败诊断 | UnityLogError | 1 | 1 | 2026-06-12 15:30:46 | P2P broadcast preflight failed: target=76561198414473361, reason=No connection to 76561198414473361 |
| [bf5719f6215aa6dda0ddcfa334e74300](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/bf5719f6215aa6dda0ddcfa334e74300?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:28:21 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=902 Turn=5 NetMode=Multi PlayerCount=2 Player Id=901 IsAI=False Alive=True IsSurrender=True IsSurvival=False DieMark=False Turn=6 CityCount=3 Group(IsSettlement=True,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=True IsWin=False Task[0] Type=ScoreWin IsSettlement=True IsSuccess… |
| [e0e8d47df59e68e38968a6d05ed1a882](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e0e8d47df59e68e38968a6d05ed1a882?pid=10) | 其他项目诊断日志 | UnityLogError | 1 | 1 | 2026-06-12 07:48:53 | [UnitRendererMismatchBeforeAction] 数据层Unit与渲染层Unit不一致 MapId=2242826177, ActionIndex=3149, DataUnits=61, RenderUnits=62, RenderOnly=1, DataOnly=0 PrevActions(count=2): PrevAction[3148]: Version=3148, MapHash=0ceb6f1746ddba5ef68843f17bc7ad60 Action : UnitAttackAlly Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation… |
| [e571d58f12740545f5a2756a546dc992](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/e571d58f12740545f5a2756a546dc992?pid=10) | 结算卡住兜底诊断 | UnityLogError | 1 | 1 | 2026-06-12 13:23:44 | [MatchSettlementStuck] 触发兜底MatchType=Normal BlockingPlayerId=325 Turn=6 NetMode=Multi PlayerCount=2 Player Id=325 IsAI=False Alive=True IsSurrender=False IsSurvival=True DieMark=False Turn=6 CityCount=1 Group(IsSettlement=False,IsWin=False) Settlement[0] Type=AllSuccessOrFailure IsSettlement=False IsWin=True Task[0] Type=ScoreWin IsSettlement=True IsSucces… |
| [ed493d4b6926c3bb5efe569a5db211e3](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/ed493d4b6926c3bb5efe569a5db211e3?pid=10) | 多语言 ID 为空 | UnityLogError | 1 | 1 | 2026-06-12 15:38:24 | 多语言ID为空 |
| [f1c119ee9f0c60b7f3a383def5491cd6](https://crashsight.qq.com/crash-reporting/errors/01076c49ce/f1c119ee9f0c60b7f3a383def5491cd6?pid=10) | 相似 Action 重复诊断 | UnityLogError | 1 | 1 | 2026-06-12 10:59:09 | 存在相似action ,记录点为:771 ,Action为:Action : LearnTech Wonder : None Resource : None Feature : None Terrain : None Unit : None Giant : None Vegetation : None UnitAction : None CityLevelUpAction : None CityAction : None GridMiscAction : None Skill : NONE Tech : Trade PlayerAction : None AIParam : AllClear Tech : Trade CultureCardType : None 重复次数 :6 |

View File

@ -0,0 +1,230 @@
{
"date": "2026-06-12",
"version": "0.7.3f",
"capture": {
"capturedAtUtc": "2026-06-12T07:50:49+00:00",
"capturedAtLocal": "2026-06-12 15:50:49",
"rawDir": "Temp\\CrashSight\\Daily_2026-06-12_0.7.3f_refresh_1550",
"reportDir": "MD\\CrashSight_2026-06-12_0.7.3f_refresh_1550"
},
"filter": {
"version": "0.7.3f",
"date": "last_1_day",
"status": "0,2",
"exceptionCategoryList": "ERROR",
"sortField": "uploadTime",
"sortOrder": "desc",
"rows": 200
},
"totalIssues": 53,
"blockingIssues": 5,
"blockingOccurrences": 13,
"logerrorIssues": 48,
"logerrorOccurrences": 190,
"blockingReports": [
{
"categoryId": "null-reference",
"title": "空引用异常",
"issueCount": 4,
"occurrences": 12,
"path": "blocking/001_null-reference.md",
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"categoryId": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"issueCount": 1,
"occurrences": 1,
"path": "blocking/002_announce-major-event-null.md",
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
],
"categories": [
{
"id": "p2p-lobby-connection-failure",
"title": "P2P/大厅连接失败诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 70,
"issues": [
"03e368c38bf498c0ede3d3d6b1a4ba9",
"5bf29273f5c83382e8a559c3a51c64b1"
]
},
{
"id": "other-logerror",
"title": "其他项目诊断日志",
"class": "logerror",
"issueCount": 9,
"occurrences": 55,
"issues": [
"5fd467876966dade995de78f0f842730",
"7076e90b6a985d264771f26e77281aa6",
"26e2c7ab0fb8fdb0d95355ae254b4995",
"881c4ef7885f6fa88ed1f214352fb990",
"3b1873b47fcdc15a0284798ea83be004",
"82d15ccd49201fabece20edd1853cdda",
"3734a997ed6d691a08e092e56913c40a",
"a63d7c50108ffe49f2c02217f3d8eee8",
"e0e8d47df59e68e38968a6d05ed1a882"
]
},
{
"id": "network-send-failure",
"title": "网络发送失败诊断",
"class": "logerror",
"issueCount": 11,
"occurrences": 22,
"issues": [
"1d0340f4a74af4a27367b74fdfca40e5",
"8d7cbe77207721b339ce20bf96d27652",
"ed7645351344dd651c0a27dfc3573b10",
"775b456dd3864ee2fd0e480673d7c1c9",
"ffb81e99d467263e9884a7aec3fcd845",
"16bd34f1b4756ad8655c843c0f9da506",
"ad4750c819ae6ea6a508646025d0eebe",
"442bf5a8e6242beea1cb0ce03556f614",
"55f59da02d6a71a429d56dbe65e20f4f",
"b9ef15d9ba6eda7d608a9816cef2f41b",
"30622ad1a79c1111188744b6714fa6a4"
]
},
{
"id": "multilingual-empty-id",
"title": "多语言资源加载为空 / 多语言 ID 为空",
"class": "logerror",
"issueCount": 9,
"occurrences": 15,
"issues": [
"12dcc82a69446ab0f1cb4caf44b0579a",
"115622af2c5f78d14b4e6b900ba1d151",
"b36fb8882dd4aabcf8618737d0ec5a65",
"5506094b5e9df26bc4d5fd90349178cb",
"ed493d4b6926c3bb5efe569a5db211e3",
"f5aa9c0a1411b1f09fd13146d745090d",
"949458f51e04d6cf3f4ff9ee18b7e160",
"bae1cbeda505602c5dbbc984c0fa1d88",
"b176950b03c8f954ad35f9520da10d23"
]
},
{
"id": "null-reference",
"title": "空引用异常",
"class": "blocking",
"issueCount": 4,
"occurrences": 12,
"issues": [
"dc1340f866d020b4b560a92559c89a21",
"0b41041d271c3ca1128d6f10e46b27b2",
"be8ba33741c7c959e4bff388decf5877",
"0c808432af82e7b66883205719dbb199"
]
},
{
"id": "ai-loop-guard",
"title": "AI 计算死循环保护",
"class": "logerror",
"issueCount": 2,
"occurrences": 11,
"issues": [
"3e65a3369290cfa41e540f0612aefad5",
"b8f5e42d2f8416ec9ab5e4f260a83b24"
]
},
{
"id": "match-settlement-stuck-fallback",
"title": "结算卡住兜底诊断",
"class": "logerror",
"issueCount": 5,
"occurrences": 5,
"issues": [
"57b4823e12accd4cb391b375ca13b229",
"bf5719f6215aa6dda0ddcfa334e74300",
"87f1839a648cac091754402cae2340f4",
"e571d58f12740545f5a2756a546dc992",
"a92e5105a3a896fb74424242bfbddf0a"
]
},
{
"id": "reconnect-forceupdate",
"title": "断线重连/ForceUpdate 诊断",
"class": "logerror",
"issueCount": 3,
"occurrences": 4,
"issues": [
"29ea271af8759bbf7e679bf751ef6373",
"519eac5f561dfb99ea775c5294065411",
"22fa9e63dc483a12cf3e1db26971c7fd"
]
},
{
"id": "action-completeexecute-player-mismatch",
"title": "行动执行玩家不一致",
"class": "logerror",
"issueCount": 2,
"occurrences": 3,
"issues": [
"217a8eace225fadbb28fe9c001b38d7c",
"acf75275ad92788914ce511f926df1ad"
]
},
{
"id": "sts-upload-failure",
"title": "STS/OSS 上传失败诊断",
"class": "logerror",
"issueCount": 2,
"occurrences": 2,
"issues": [
"4b3f50847e230a1b123fc4d7b72cc3ce",
"1f51b04a2682e0031ec4b1bdc1e6ac48"
]
},
{
"id": "origin-player-null-diagnostic",
"title": "Origin Player 为空诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"76c4a73c625af53a1601bc284e2e3013"
]
},
{
"id": "ui-renderer-null-guard",
"title": "UI/Renderer 空保护诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"96f415d89f78f0ac31e19174e23246ba"
]
},
{
"id": "duplicate-similar-action",
"title": "相似 Action 重复诊断",
"class": "logerror",
"issueCount": 1,
"occurrences": 1,
"issues": [
"f1c119ee9f0c60b7f3a383def5491cd6"
]
},
{
"id": "announce-major-event-null",
"title": "重大事件公告 UI 空引用",
"class": "blocking",
"issueCount": 1,
"occurrences": 1,
"issues": [
"fe24c7bf54531228f55d73530508a9fa"
]
}
]
}

View File

@ -2,6 +2,7 @@
<linker>
<assembly fullname="Animancer">
<type fullname="Animancer.AnimancerComponent" preserve="all" />
<type fullname="Animancer.AnimancerComponent/DisableAction" preserve="all" />
<type fullname="Animancer.AnimancerEvent" preserve="all" />
<type fullname="Animancer.AnimancerEvent/Sequence" preserve="all" />
<type fullname="Animancer.AnimancerState" preserve="all" />
@ -50,6 +51,7 @@
</assembly>
<assembly fullname="OPS.Obfuscator">
<type fullname="OPS.Obfuscator.Attribute.DoNotObfuscateClassAttribute" preserve="all" />
<type fullname="OPS.Obfuscator.Attribute.DoNotRenameAttribute" preserve="all" />
</assembly>
<assembly fullname="ParadoxNotion">
<type fullname="NodeCanvas.Framework.ActionTask" preserve="all" />

File diff suppressed because it is too large Load Diff

View File

@ -81,7 +81,7 @@
{
"Type" : "Bool",
"Key" : "Obfuscate_Assembly_AssemblyCSharp",
"Value" : "True",
"Value" : "False",
"Values" : null
},
{
@ -160,7 +160,7 @@
{
"Type" : "Bool",
"Key" : "Obfuscate_Namespaces",
"Value" : "True",
"Value" : "False",
"Values" : null
},
{
@ -174,6 +174,9 @@
"Key" : "Skip_Namespace_Array",
"Value" : null,
"Values" : [
"TH1_Hotfix",
"TH1_Logic.Core",
"Logic.Achievement"
]
}
]
@ -184,7 +187,7 @@
{
"Type" : "Bool",
"Key" : "Obfuscate_Classes",
"Value" : "True",
"Value" : "False",
"Values" : null
},
{
@ -331,7 +334,7 @@
{
"Type" : "Bool",
"Key" : "Obfuscate_Fields",
"Value" : "True",
"Value" : "False",
"Values" : null
},
{
@ -503,7 +506,7 @@
{
"Type" : "Bool",
"Key" : "Enable_Add_Random_Code",
"Value" : "True",
"Value" : "False",
"Values" : null
},
{
@ -531,7 +534,7 @@
{
"Type" : "Bool",
"Key" : "Enable_String_Obfuscation",
"Value" : "True",
"Value" : "False",
"Values" : null
}
]
@ -553,7 +556,7 @@
{
"Type" : "Bool",
"Key" : "Enable_AntiTampering_Protection",
"Value" : "True",
"Value" : "False",
"Values" : null
}
]
@ -659,8 +662,8 @@
{
"Type" : "Bool",
"Key" : "Global_Enable_Obfuscation",
"Value" : "True",
"Value" : "False",
"Values" : null
}
]
}
}

View File

@ -37,7 +37,7 @@ namespace TH1_Logic.Hotfix
return false;
}
var assembly = Assembly.Load(File.ReadAllBytes(hotfixPath));
LoadedAssembly = assembly;
LoadedAssemblyFullName = assembly.FullName;
@ -86,6 +86,11 @@ namespace TH1_Logic.Hotfix
{
if (_aotMetadataLoaded) return;
#if !ENABLE_IL2CPP
_aotMetadataLoaded = true;
Debug.Log("[TH1.Hotfix] Skip AOT metadata on non-IL2CPP scripting backend.");
return;
#else
var aotDir = Path.Combine(root, HotfixManifest.AotMetadataFolderName);
var allLoaded = true;
@ -104,6 +109,7 @@ namespace TH1_Logic.Hotfix
}
_aotMetadataLoaded = allLoaded;
#endif
}
private static void InvokeHotfixEntryInternal(Assembly assembly)

View File

@ -1,11 +1,14 @@
using UnityEngine;
using OPS.Obfuscator.Attribute;
namespace TH1_Hotfix
{
[DoNotRename]
public static class HotfixEntry
{
public const string Version = "0.1.0";
[DoNotRename]
public static void Initialize()
{
Debug.Log($"[TH1.Hotfix] Initialize version {Version}");

View File

@ -9,6 +9,7 @@
using System;
using System.Collections.Generic;
using Logic.Pool;
using OPS.Obfuscator.Attribute;
using RuntimeData;
using UnityEngine;
@ -72,6 +73,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public abstract class AchievementConditionBase : ISerializationCallbackReceiver
{
@ -126,6 +128,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class TrainGiantCondition : AchievementConditionBase
{
@ -203,6 +206,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class BuildWonderConditionCondition : AchievementConditionBase
{
@ -277,6 +281,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class WonderInCityConditionCondition : AchievementConditionBase
{
@ -341,6 +346,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class UnitOnWonderConditionCondition : AchievementConditionBase
{
@ -434,6 +440,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class AroundBuildingsConditionCondition : AchievementConditionBase
{
@ -530,6 +537,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class AroundWondersConditionCondition : AchievementConditionBase
{
@ -613,6 +621,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class AroundEnemyUnitsConditionCondition : AchievementConditionBase
{
@ -699,6 +708,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class AroundSelfUnitsConditionCondition : AchievementConditionBase
{
@ -785,6 +795,7 @@ namespace Logic.Achievement
}
[DoNotObfuscateClass]
[Serializable]
public class AroundCityGridsConditionCondition : AchievementConditionBase
{

View File

@ -14,6 +14,7 @@ using Logic.Config;
using Logic.CrashSight;
using Logic.Multilingual;
using Logic.PrefabPool;
using OPS.Obfuscator.Attribute;
using RuntimeData;
using TH1_Core.Events;
using TH1_Core.Managers;
@ -38,34 +39,53 @@ using ConfigManager = TH1_Logic.Config.ConfigManager;
namespace TH1_Logic.Core
{
// Runtime entry loaded by the AOT bootstrap after TH1.Hotfix is available.
[DoNotRename]
public class Main : MonoBehaviour
{
private const string StartGameAnnouncementTimerMessage = "Main_CenterMessage_Anim";
public static Main Instance { get; private set; }
[Header("Debug Param")]
[DoNotRename]
public bool NoAI = false;
[DoNotRename]
public bool FullSight = true;
[DoNotRename]
public float AIActionTime = 0.2f;
[DoNotRename]
public bool AIAllTech = true;
[DoNotRename]
public bool AIMoreMoney = true;
[DoNotRename]
public float LandThreshold = -1f;
[DoNotRename]
public float AnimationSpeed = 1f;
[DoNotRename]
public bool DebugMode = false;
[DoNotRename]
public bool DebugHideCenterMessage = false;
[Header("Play Settings")]
[DoNotRename]
public int cityCount;
[DoNotRename]
public int unitCount;
[DoNotRename]
public int turn;
[DoNotRename]
public int renko = 0; //真正的玩家一人
[DoNotRename]
public bool IsNetActionExecuting = false;
[Header("RenderObject")]
[DoNotRename]
public GameObject ROMapRenderer;
//用来帮助借调一些必须通过main来承载的数据
[Header("SuperBank")]
[DoNotRename]
public Material URPDefaultMat;
//--------------------------------new data type--------------------------------
[NonSerialized] public MapConfig MapConfig;
@ -136,6 +156,7 @@ namespace TH1_Logic.Core
MatchConfigManager.Instance.Init();
}
[DoNotRename]
IEnumerator Start()
{
_isStarted = false;
@ -271,13 +292,7 @@ namespace TH1_Logic.Core
if (MapData.GetCapitalCityDataByPlayerId(selfp.Id, out var cap) &&
MapData.GetGridDataByCityId(cap.Id, out var grid))
camera.CameraFocusOnGrid(grid, true);
Timer.Instance.TimerRegister(this, () =>
{
//start game
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.StartGame };
EventManager.Publish(announcement);
//UIManager.Instance.CenterMessageUI.SetCenterMessageShow(UICenterMessageID.StartGame,MapData.PlayerMap.SelfPlayerData);
}, 1.5f, "Main_CenterMessage_Anim");
RegisterStartGameAnnouncement(MapData);
MapData.SaveMatchConfig(MapConfig);
// 新版存档:新开局一定先写 begin。
@ -428,13 +443,7 @@ namespace TH1_Logic.Core
var selfp = MapData.PlayerMap.SelfPlayerData;
if(MapData.GetCapitalCityDataByPlayerId(selfp.Id, out var cap) && MapData.GetGridDataByCityId(cap.Id, out var grid))
camera.CameraFocusOnGrid(grid,true);
Timer.Instance.TimerRegister(this, () =>
{
//start game
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.StartGame};
EventManager.Publish(announcement);
//UIManager.Instance.CenterMessageUI.SetCenterMessageShow(UICenterMessageID.StartGame,MapData.PlayerMap.SelfPlayerData);
},1.5f,"Main_CenterMessage_Anim");
RegisterStartGameAnnouncement(MapData);
// 联机新开局也写 begin但必须放在 GameStart 广播成功之后。
// 否则房主本地开始失败时可能留下一个没有真正开局的 begin。
@ -573,11 +582,28 @@ namespace TH1_Logic.Core
{
LogSystem.LogError(reason);
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.GameStartFailed);
Timer.Instance.CancelByMessage("Main_CenterMessage_Anim");
Timer.Instance?.CancelByMessage(StartGameAnnouncementTimerMessage);
MapGeneratorLogic = previousGenerator;
RestoreNetworkMatchState(previousMap, previousInput, previousInteraction, reason);
}
private void RegisterStartGameAnnouncement(MapData expectedMap)
{
var timer = Timer.Instance;
if (timer == null) return;
timer.CancelByMessage(StartGameAnnouncementTimerMessage);
timer.TimerRegister(this, () =>
{
if (!ReferenceEquals(MapData, expectedMap)) return;
if (expectedMap?.PlayerMap?.SelfPlayerData == null) return;
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.StartGame };
EventManager.Publish(announcement);
//UIManager.Instance.CenterMessageUI.SetCenterMessageShow(UICenterMessageID.StartGame,MapData.PlayerMap.SelfPlayerData);
}, 1.5f, StartGameAnnouncementTimerMessage);
}
// 成员客户端开始多人游戏
public bool NetStartGame(MapData map)
{
@ -614,13 +640,7 @@ namespace TH1_Logic.Core
if(MapData.GetCapitalCityDataByPlayerId(selfp.Id, out var cap)
&& MapData.GetGridDataByCityId(cap.Id, out var grid))
camera.CameraFocusOnGrid(grid,true);
Timer.Instance.TimerRegister(this, () =>
{
//start game
var announcement = new ShowUIAnnounceMajorEvent { EventType = UIAnnounceMajorEventType.StartGame};
EventManager.Publish(announcement);
//UIManager.Instance.CenterMessageUI.SetCenterMessageShow(UICenterMessageID.StartGame,MapData.PlayerMap.SelfPlayerData);
},1.5f,"Main_CenterMessage_Anim");
RegisterStartGameAnnouncement(MapData);
// 成员端也要保存本机 begin。之后本机游戏结束会写 end + Ended record
// 回放需要这条 record 同时索引到开局快照和结束快照。
@ -819,6 +839,7 @@ namespace TH1_Logic.Core
}
// Update is called once per frame
[DoNotRename]
void Update()
{
if (!_isStarted)
@ -911,9 +932,11 @@ namespace TH1_Logic.Core
public void Clear()
{
Timer.Instance?.CancelByMessage(StartGameAnnouncementTimerMessage);
MapData = null;
}
[DoNotRename]
private void OnDestroy()
{
LobbyManager.Instance.Lobby.Cleanup();

View File

@ -1,7 +1,11 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using OPS.Mono.Cecil;
using TH1_Logic.Hotfix;
using UnityEditor;
using UnityEditor.Build;
@ -13,6 +17,11 @@ namespace TH1_Logic.Editor.HybridCLR
{
private const string HybridClrInstallerMenu = "HybridCLR/Installer...";
private const string HybridClrGenerateAllMenu = "HybridCLR/Generate/All";
private const string OpsObfuscatorSettingsPath = "Assets/OPS/Obfuscator/Settings/Obfuscator_Settings.json";
private static readonly Regex OpsObfuscationRegex = new Regex(
"(?<prefix>\"Key\"\\s*:\\s*\"Global_Enable_Obfuscation\"\\s*,\\s*\"Value\"\\s*:\\s*\")(?<value>True|False)(?<suffix>\")",
RegexOptions.Compiled);
public const long MinimumHotfixDllSize = 64 * 1024;
[MenuItem("Tools/TH1/iOS Migration/HybridCLR/1. Run HybridCLR Installer")]
@ -74,6 +83,11 @@ namespace TH1_Logic.Editor.HybridCLR
}
public static bool BuildAndCopyHotfixArtifacts(bool developmentBuild)
{
return BuildAndCopyHotfixArtifacts(developmentBuild, IsHotfixObfuscationEnabled());
}
public static bool BuildAndCopyHotfixArtifacts(bool developmentBuild, bool obfuscateHotfixDll)
{
if (!TryCompileHotfixDll(developmentBuild))
{
@ -81,7 +95,13 @@ namespace TH1_Logic.Editor.HybridCLR
return false;
}
var copiedHotfixDll = CopyHotfixDll();
if (!TryPrepareHotfixDllForCopy(obfuscateHotfixDll, out var hotfixDllPath))
{
Debug.LogError("[TH1.HybridCLR] Prepare hotfix dll failed. Skip copying hotfix artifacts.");
return false;
}
var copiedHotfixDll = CopyHotfixDll(hotfixDllPath);
var copiedAotMetadata = CopyAotMetadataDlls();
AssetDatabase.Refresh();
return copiedHotfixDll && copiedAotMetadata;
@ -99,6 +119,11 @@ namespace TH1_Logic.Editor.HybridCLR
return Path.Combine("HybridCLRData", "HotUpdateDlls", buildTarget.ToString(), HotfixManifest.HotfixAssemblyName + ".dll");
}
public static string GetObfuscatedHotfixDllPath(BuildTarget buildTarget)
{
return Path.Combine("HybridCLRData", "ObfuscatedHotUpdateDlls", buildTarget.ToString(), HotfixManifest.HotfixAssemblyName + ".dll");
}
public static string GetStreamingHotfixDllPath()
{
return Path.Combine(
@ -137,9 +162,28 @@ namespace TH1_Logic.Editor.HybridCLR
return true;
}
private static bool CopyHotfixDll()
private static bool TryPrepareHotfixDllForCopy(bool obfuscateHotfixDll, out string hotfixDllPath)
{
var source = GetHotfixDllSourcePath(EditorUserBuildSettings.activeBuildTarget);
hotfixDllPath = source;
if (!IsUsableHotfixDll(source, out var message))
{
Debug.LogError($"[TH1.HybridCLR] hotfix dll is not usable before obfuscation: {message}");
return false;
}
if (!obfuscateHotfixDll)
{
Debug.Log("[TH1.HybridCLR] OPS obfuscation is disabled. Copy raw hotfix dll.");
return true;
}
return TryObfuscateHotfixDll(source, out hotfixDllPath);
}
private static bool CopyHotfixDll(string source)
{
if (File.Exists(source) && new FileInfo(source).Length < MinimumHotfixDllSize)
{
Debug.LogError($"[TH1.HybridCLR] hotfix dll is too small and looks stale: {source}");
@ -151,15 +195,489 @@ namespace TH1_Logic.Editor.HybridCLR
return CopyFile(source, destination, "hotfix dll");
}
public static bool IsHotfixObfuscationEnabled()
{
var path = GetProjectPath(OpsObfuscatorSettingsPath);
if (!File.Exists(path))
{
Debug.LogWarning($"[TH1.HybridCLR] OPS settings missing. Hotfix dll will not be obfuscated: {OpsObfuscatorSettingsPath}");
return false;
}
if (!TryReadOpsObfuscationEnabled(out var enabled))
{
Debug.LogWarning($"[TH1.HybridCLR] Cannot read Global_Enable_Obfuscation from {OpsObfuscatorSettingsPath}. Hotfix dll will not be obfuscated.");
return false;
}
return enabled;
}
private static bool TryObfuscateHotfixDll(string source, out string obfuscatedPath)
{
var targetPath = GetObfuscatedHotfixDllPath(EditorUserBuildSettings.activeBuildTarget);
obfuscatedPath = targetPath;
try
{
Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
File.Copy(source, targetPath, true);
RunWithOpsObfuscationTemporarilyEnabled(() => RunOpsObfuscationForHotfixDll(targetPath));
if (!IsUsableHotfixDll(targetPath, out var message))
{
Debug.LogError($"[TH1.HybridCLR] obfuscated hotfix dll is not usable: {message}");
return false;
}
if (!VerifyHotfixObfuscationKeepRules(targetPath))
{
return false;
}
Debug.Log($"[TH1.HybridCLR] Obfuscated hotfix dll: {targetPath}");
return true;
}
catch (Exception e)
{
Debug.LogError($"[TH1.HybridCLR] OPS obfuscate hotfix dll failed:\n{e}");
return false;
}
}
private static void RunWithOpsObfuscationTemporarilyEnabled(System.Action action)
{
var canRestore = TryReadOpsObfuscationEnabled(out var previousEnabled);
if (canRestore && !previousEnabled)
{
SetOpsObfuscationEnabled(true);
}
try
{
action();
}
finally
{
if (canRestore)
{
SetOpsObfuscationEnabled(previousEnabled);
}
}
}
private static bool TryReadOpsObfuscationEnabled(out bool enabled)
{
enabled = false;
var path = GetProjectPath(OpsObfuscatorSettingsPath);
if (!File.Exists(path))
{
return false;
}
var json = File.ReadAllText(path);
var matches = OpsObfuscationRegex.Matches(json);
if (matches.Count != 1)
{
return false;
}
enabled = string.Equals(matches[0].Groups["value"].Value, "True", StringComparison.OrdinalIgnoreCase);
return true;
}
public static void SetOpsObfuscationEnabled(bool enabled)
{
var path = GetProjectPath(OpsObfuscatorSettingsPath);
if (!File.Exists(path))
{
throw new FileNotFoundException($"OPS obfuscator settings not found: {OpsObfuscatorSettingsPath}", path);
}
var json = File.ReadAllText(path);
var matches = OpsObfuscationRegex.Matches(json);
if (matches.Count != 1)
{
throw new InvalidOperationException($"Cannot find a unique Global_Enable_Obfuscation entry in {OpsObfuscatorSettingsPath}.");
}
var updated = OpsObfuscationRegex.Replace(json, match =>
$"{match.Groups["prefix"].Value}{(enabled ? "True" : "False")}{match.Groups["suffix"].Value}", 1);
if (updated == json) return;
File.WriteAllText(path, updated);
AssetDatabase.ImportAsset(OpsObfuscatorSettingsPath);
}
private static void RunOpsObfuscationForHotfixDll(string hotfixDllPath)
{
var editorSettingsType = RequireType("OPS.Obfuscator.Editor.Settings.Unity.Editor.EditorSettings");
var buildSettingsType = RequireType("OPS.Obfuscator.Editor.Settings.Unity.Build.BuildSettings");
var assemblyLoadInfoType = RequireType("OPS.Obfuscator.Editor.Assembly.AssemblyLoadInfo");
var obfuscatorType = RequireType("OPS.Obfuscator.Editor.Obfuscator");
var editorSettings = CreateInstance(editorSettingsType);
var buildSettings = CreateInstance(buildSettingsType);
SetMember(buildSettings, "IsDevelopmentBuild", EditorUserBuildSettings.development);
SetMember(buildSettings, "BuildTarget", EditorUserBuildSettings.activeBuildTarget);
SetMember(buildSettings, "BuildTargetGroup", EditorUserBuildSettings.selectedBuildTargetGroup);
SetMember(buildSettings, "UnityBuildReport", null);
SetMember(buildSettings, "IsIL2CPPBuild", PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup) == ScriptingImplementation.IL2CPP);
var compression = GetOpsCompressionValue(buildSettingsType);
if (compression != null)
{
TrySetMember(buildSettings, "Compression", compression);
}
SetMember(buildSettings, "BuildIntoProject", false);
SetMember(buildSettings, "AssemblyDependencyDirectoryPathList", CreateStringList(GetOpsDependencyDirectories(hotfixDllPath)));
SetMember(buildSettings, "AssemblyLoadInfoList", CreateAssemblyLoadInfoList(assemblyLoadInfoType, hotfixDllPath));
obfuscatorType.GetMethod("Init", BindingFlags.Public | BindingFlags.Static)?.Invoke(null, null);
var singleton = obfuscatorType.GetProperty("Singleton", BindingFlags.Public | BindingFlags.Static)?.GetValue(null);
if (singleton == null)
{
throw new InvalidOperationException("OPS Obfuscator singleton is unavailable.");
}
EditorApplication.LockReloadAssemblies();
try
{
var method = obfuscatorType.GetMethod("PostAssemblyBuild", BindingFlags.Public | BindingFlags.Instance);
if (method == null)
{
throw new MissingMethodException(obfuscatorType.FullName, "PostAssemblyBuild");
}
method.Invoke(singleton, new[] { editorSettings, buildSettings });
}
catch (TargetInvocationException e)
{
throw e.InnerException ?? e;
}
finally
{
EditorApplication.UnlockReloadAssemblies();
}
}
private static IList CreateAssemblyLoadInfoList(Type assemblyLoadInfoType, string hotfixDllPath)
{
var listType = typeof(List<>).MakeGenericType(assemblyLoadInfoType);
var list = (IList)Activator.CreateInstance(listType);
list.Add(CreateAssemblyLoadInfo(assemblyLoadInfoType, hotfixDllPath, true, false));
return list;
}
private static object CreateAssemblyLoadInfo(Type assemblyLoadInfoType, string filePath, bool obfuscate, bool helper)
{
var loadInfo = CreateInstance(assemblyLoadInfoType);
SetMember(loadInfo, "FilePath", Path.GetFullPath(filePath));
SetMember(loadInfo, "Obfuscate", obfuscate);
TrySetMember(loadInfo, "IsUnityAssembly", !helper);
TrySetMember(loadInfo, "IsThirdPartyAssembly", helper);
TrySetMember(loadInfo, "IsThirdParty", helper);
TrySetMember(loadInfo, "IsHelperAssembly", helper);
TrySetMember(loadInfo, "IsHelper", helper);
return loadInfo;
}
private static List<string> CreateStringList(IEnumerable<string> values)
{
return values
.Where(path => !string.IsNullOrWhiteSpace(path))
.Select(Path.GetFullPath)
.Where(Directory.Exists)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
}
private static IEnumerable<string> GetOpsDependencyDirectories(string hotfixDllPath)
{
yield return Path.GetDirectoryName(hotfixDllPath);
yield return GetProjectPath("Library/ScriptAssemblies");
yield return GetProjectPath("Assets/Plugins");
yield return GetProjectPath("Assets/OPS/Plugins");
yield return GetProjectPath("Assets/OPS/Obfuscator/Plugins");
yield return GetProjectPath("Assets/OPS/Obfuscator/Editor/Plugins");
var unityEditorDir = EditorApplication.applicationContentsPath;
yield return Path.Combine(unityEditorDir, "Managed");
yield return Path.Combine(unityEditorDir, "Managed", "UnityEngine");
yield return Path.Combine(unityEditorDir, "UnityReferenceAssemblies", "unity-4.8-api");
yield return Path.Combine(unityEditorDir, "UnityReferenceAssemblies", "unity-4.8-api", "Facades");
var packageCache = GetProjectPath("Library/PackageCache");
if (Directory.Exists(packageCache))
{
foreach (var dll in Directory.EnumerateFiles(packageCache, "*.dll", SearchOption.AllDirectories))
{
yield return Path.GetDirectoryName(dll);
}
}
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.IsDynamic) continue;
var location = string.Empty;
try
{
location = assembly.Location;
}
catch
{
// Some editor assemblies do not expose a stable file location.
}
if (!string.IsNullOrWhiteSpace(location))
{
yield return Path.GetDirectoryName(location);
}
}
}
private static bool VerifyHotfixObfuscationKeepRules(string hotfixDllPath)
{
try
{
using var assembly = AssemblyDefinition.ReadAssembly(hotfixDllPath);
var missing = new List<string>();
var entryType = FindCecilType(assembly.MainModule, HotfixManifest.EntryTypeName);
if (entryType == null)
{
missing.Add(HotfixManifest.EntryTypeName);
}
else if (!entryType.Methods.Any(method =>
method.Name == HotfixManifest.EntryMethodName &&
method.IsPublic &&
method.IsStatic))
{
missing.Add($"{HotfixManifest.EntryTypeName}.{HotfixManifest.EntryMethodName}");
}
var mainType = FindCecilType(assembly.MainModule, HotfixManifest.RuntimeMainTypeName);
if (mainType == null)
{
missing.Add(HotfixManifest.RuntimeMainTypeName);
}
else
{
foreach (var fieldName in RequiredRuntimeMainFieldNames)
{
if (!mainType.Fields.Any(field => field.Name == fieldName))
{
missing.Add($"{HotfixManifest.RuntimeMainTypeName}.{fieldName}");
}
}
}
foreach (var typeName in RequiredAchievementConditionTypeNames)
{
if (FindCecilType(assembly.MainModule, typeName) == null)
{
missing.Add(typeName);
}
}
if (missing.Count <= 0)
{
return true;
}
Debug.LogError($"[TH1.HybridCLR] obfuscated hotfix dll is missing required reflection metadata: {string.Join(", ", missing)}");
return false;
}
catch (Exception e)
{
Debug.LogError($"[TH1.HybridCLR] verify obfuscated hotfix dll failed: {hotfixDllPath}\n{e}");
return false;
}
}
private static readonly string[] RequiredRuntimeMainFieldNames =
{
"NoAI",
"FullSight",
"AIActionTime",
"AIAllTech",
"AIMoreMoney",
"LandThreshold",
"AnimationSpeed",
"DebugMode",
"DebugHideCenterMessage",
"cityCount",
"unitCount",
"turn",
"renko",
"IsNetActionExecuting",
"ROMapRenderer",
"URPDefaultMat",
};
private static readonly string[] RequiredAchievementConditionTypeNames =
{
"Logic.Achievement.AchievementConditionBase",
"Logic.Achievement.TrainGiantCondition",
"Logic.Achievement.BuildWonderConditionCondition",
"Logic.Achievement.WonderInCityConditionCondition",
"Logic.Achievement.UnitOnWonderConditionCondition",
"Logic.Achievement.AroundBuildingsConditionCondition",
"Logic.Achievement.AroundWondersConditionCondition",
"Logic.Achievement.AroundEnemyUnitsConditionCondition",
"Logic.Achievement.AroundSelfUnitsConditionCondition",
"Logic.Achievement.AroundCityGridsConditionCondition",
};
private static TypeDefinition FindCecilType(ModuleDefinition module, string fullName)
{
return EnumerateCecilTypes(module.Types)
.FirstOrDefault(type => type.FullName == fullName);
}
private static IEnumerable<TypeDefinition> EnumerateCecilTypes(IEnumerable<TypeDefinition> types)
{
foreach (var type in types)
{
yield return type;
foreach (var nestedType in EnumerateCecilTypes(type.NestedTypes))
{
yield return nestedType;
}
}
}
private static Type RequireType(string fullName)
{
var type = FindType(fullName);
if (type == null)
{
throw new InvalidOperationException($"Required type not found: {fullName}");
}
return type;
}
private static object CreateInstance(Type type)
{
var defaultCtor = type.GetConstructor(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null,
Type.EmptyTypes,
null);
if (defaultCtor != null)
{
return defaultCtor.Invoke(null);
}
var ctor = type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.OrderBy(item => item.GetParameters().Length)
.FirstOrDefault();
if (ctor == null)
{
throw new MissingMethodException(type.FullName, ".ctor");
}
var parameters = ctor.GetParameters();
var args = parameters
.Select(parameter => parameter.HasDefaultValue ? parameter.DefaultValue : GetDefaultValue(parameter.ParameterType))
.ToArray();
return ctor.Invoke(args);
}
private static object GetDefaultValue(Type type)
{
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
private static object GetOpsCompressionValue(Type buildSettingsType)
{
var memberType = GetMemberType(buildSettingsType, "Compression");
var method = typeof(EditorUserBuildSettings).GetMethod(
"GetCompressionType",
BindingFlags.NonPublic | BindingFlags.Static);
if (memberType == null || method == null)
{
return null;
}
var unityCompression = method.Invoke(null, new object[] { EditorUserBuildSettings.selectedBuildTargetGroup });
var value = Convert.ToInt32(unityCompression);
return Enum.ToObject(memberType, value);
}
private static Type GetMemberType(Type type, string memberName)
{
var property = type.GetProperty(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
return property.PropertyType;
}
var field = type.GetField(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
return field?.FieldType;
}
private static void SetMember(object instance, string memberName, object value)
{
if (instance == null) throw new ArgumentNullException(nameof(instance));
var type = instance.GetType();
var property = type.GetProperty(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
var setter = property.GetSetMethod(true);
if (setter != null)
{
setter.Invoke(instance, new[] { value });
return;
}
}
var field = type.GetField(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
field.SetValue(instance, value);
return;
}
throw new MissingMemberException(type.FullName, memberName);
}
private static bool TrySetMember(object instance, string memberName, object value)
{
try
{
SetMember(instance, memberName, value);
return true;
}
catch (MissingMemberException)
{
return false;
}
}
private static bool CopyAotMetadataDlls()
{
var sourceDir = GetAotMetadataSourceDir(EditorUserBuildSettings.activeBuildTarget);
var destinationDir = GetStreamingAotMetadataDir();
var group = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
var requiresAotMetadata = PlayerSettings.GetScriptingBackend(group) == ScriptingImplementation.IL2CPP;
if (!Directory.Exists(sourceDir))
{
Debug.LogError($"[TH1.HybridCLR] AOT metadata source missing: {sourceDir}. Run HybridCLR Installer, then HybridCLR/Generate/All after an IL2CPP target is selected.");
return false;
var message = $"[TH1.HybridCLR] AOT metadata source missing: {sourceDir}. Run HybridCLR Installer, then HybridCLR/Generate/All after an IL2CPP target is selected.";
if (requiresAotMetadata)
{
Debug.LogError(message);
return false;
}
Debug.LogWarning(message + " Current target uses Mono, so continue without AOT metadata.");
return true;
}
var copiedAll = true;
@ -171,7 +689,15 @@ namespace TH1_Logic.Editor.HybridCLR
if (!File.Exists(source))
{
copiedAll = false;
Debug.LogError($"[TH1.HybridCLR] AOT metadata dll missing: {source}");
var message = $"[TH1.HybridCLR] AOT metadata dll missing: {source}";
if (requiresAotMetadata)
{
Debug.LogError(message);
}
else
{
Debug.LogWarning(message + " Current target uses Mono, so continue without this AOT metadata file.");
}
continue;
}
@ -179,7 +705,7 @@ namespace TH1_Logic.Editor.HybridCLR
Debug.Log($"[TH1.HybridCLR] Copied AOT metadata: {destination}");
}
return copiedAll;
return requiresAotMetadata ? copiedAll : true;
}
private static bool ExecuteHybridClrMenu(string menuPath)
@ -314,6 +840,12 @@ namespace TH1_Logic.Editor.HybridCLR
return $"{length} B";
}
private static string GetProjectPath(string relativePath)
{
var projectRoot = Directory.GetParent(Application.dataPath)?.FullName ?? Application.dataPath;
return Path.Combine(projectRoot, relativePath.Replace('/', Path.DirectorySeparatorChar));
}
private static Type FindType(string fullName)
{
return AppDomain.CurrentDomain.GetAssemblies()

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using TH1_Logic.Editor.HybridCLR;
@ -155,6 +156,17 @@ namespace TH1_Logic.Editor
});
}
if (GUILayout.Button("测试 Hotfix 混淆", GUILayout.Height(32)))
{
RunAction("Test Hotfix Obfuscation", () =>
{
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(_developmentBuild, true))
{
throw new Exception("Test hotfix obfuscation failed. See Console for details.");
}
});
}
EditorGUILayout.Space(6);
EditorGUILayout.LabelField("YooAsset", EditorStyles.boldLabel);
using (new EditorGUILayout.HorizontalScope())
@ -303,18 +315,48 @@ namespace TH1_Logic.Editor
internal static class TH1MigrationBuildStatus
{
public static List<MigrationStatusItem> Collect(BuildTarget target)
{
return Collect(target, TH1HybridCLRBuildTools.IsHotfixObfuscationEnabled(), true);
}
public static List<MigrationStatusItem> Collect(BuildTarget target, bool expectObfuscatedHotfix)
{
return Collect(target, expectObfuscatedHotfix, true);
}
public static List<MigrationStatusItem> Collect(BuildTarget target, bool expectObfuscatedHotfix, bool checkYooAssetAb)
{
var items = new List<MigrationStatusItem>();
AddHotfixStatus(items, target);
AddHotfixStatus(items, target, expectObfuscatedHotfix);
AddAotMetadataStatus(items, target);
AddYooAssetStatus(items);
if (checkYooAssetAb)
{
AddYooAssetStatus(items);
}
else
{
items.Add(new MigrationStatusItem(
"4. YooAsset 内置 AB",
MigrationStatusLevel.Warning,
"已按一体化出包选项跳过检查,将沿用 StreamingAssets 中已有的 YooAsset AB。"));
}
return items;
}
public static List<string> GetBuildBlockingMessages(BuildTarget target)
{
return GetBuildBlockingMessages(target, TH1HybridCLRBuildTools.IsHotfixObfuscationEnabled(), true);
}
public static List<string> GetBuildBlockingMessages(BuildTarget target, bool expectObfuscatedHotfix)
{
return GetBuildBlockingMessages(target, expectObfuscatedHotfix, true);
}
public static List<string> GetBuildBlockingMessages(BuildTarget target, bool expectObfuscatedHotfix, bool checkYooAssetAb)
{
var errors = new List<string>();
foreach (var item in Collect(target))
foreach (var item in Collect(target, expectObfuscatedHotfix, checkYooAssetAb))
{
if (item.Level == MigrationStatusLevel.Error)
{
@ -325,9 +367,10 @@ namespace TH1_Logic.Editor
return errors;
}
private static void AddHotfixStatus(List<MigrationStatusItem> items, BuildTarget target)
private static void AddHotfixStatus(List<MigrationStatusItem> items, BuildTarget target, bool expectObfuscatedHotfix)
{
var source = TH1HybridCLRBuildTools.GetHotfixDllSourcePath(target);
var obfuscated = TH1HybridCLRBuildTools.GetObfuscatedHotfixDllPath(target);
var streaming = TH1HybridCLRBuildTools.GetStreamingHotfixDllPath();
var sourceOk = TH1HybridCLRBuildTools.IsUsableHotfixDll(source, out var sourceMessage);
@ -336,6 +379,22 @@ namespace TH1_Logic.Editor
sourceOk ? MigrationStatusLevel.Ok : MigrationStatusLevel.Error,
$"{sourceMessage}\n这是 HybridCLR 针对当前平台编出来的 TH1.Hotfix.dll。"));
var expected = source;
var expectedOk = sourceOk;
var expectedLabel = "未混淆输出";
if (expectObfuscatedHotfix)
{
var obfuscatedOk = TH1HybridCLRBuildTools.IsUsableHotfixDll(obfuscated, out var obfuscatedMessage);
items.Add(new MigrationStatusItem(
"1.5 OPS 混淆后 DLL 输出",
obfuscatedOk ? MigrationStatusLevel.Ok : MigrationStatusLevel.Error,
$"{obfuscatedMessage}\n这是打包会优先拷贝的 TH1.Hotfix.dll。"));
expected = obfuscated;
expectedOk = obfuscatedOk;
expectedLabel = "混淆输出";
}
var streamingOk = TH1HybridCLRBuildTools.IsUsableHotfixDll(streaming, out var streamingMessage);
var streamingLevel = streamingOk ? MigrationStatusLevel.Ok : MigrationStatusLevel.Error;
var streamingDetails = $"{streamingMessage}\n{streaming}";
@ -345,15 +404,15 @@ namespace TH1_Logic.Editor
streamingLevel = MigrationStatusLevel.Error;
streamingDetails += "\n该 DLL 疑似引用 UnityEditor不能进 PC/iOS 包。请用面板重新构建目标平台热更 DLL。";
}
else if (streamingOk && sourceOk)
else if (streamingOk && expectedOk)
{
var sourceInfo = new FileInfo(source);
var sourceInfo = new FileInfo(expected);
var streamingInfo = new FileInfo(streaming);
if (streamingInfo.LastWriteTimeUtc.AddSeconds(1) < sourceInfo.LastWriteTimeUtc ||
streamingInfo.Length != sourceInfo.Length)
{
streamingLevel = MigrationStatusLevel.Error;
streamingDetails += "\n它和第 1 步的输出不一致,请重新执行大按钮。";
streamingDetails += $"\n它和{expectedLabel}不一致,请重新执行大按钮。";
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using TH1_Logic.Editor.HybridCLR;
@ -16,7 +17,32 @@ namespace TH1_Logic.Editor
{
private const string BuildDirArg = "-th1SmokeBuildDir";
private const string DefaultBuildSubDirectory = "TH1/CodexSmoke";
private const string ProductName = "TOHOTOPIA";
private const string ExeName = "TOHOTOPIA.exe";
private static readonly string[] BaseSharedDefines =
{
"UNITY",
"ENABLE_VIEW",
"NODECANVAS"
};
private static readonly string[] ControlledDefines =
{
"UNITY",
"ENABLE_VIEW",
"NODECANVAS",
"STEAMWORKS_NET",
"STEAM_CHANNEL",
"USE_INPUT",
"ENABLE_SPEEDUP",
"ENABLE_TRAIN",
"ENABLE_AIMODEL",
"GAME_AUTO_DEBUG",
"CHECK_ACTIONDEFFERENCE",
"STEAM_TEST",
"TH1_PLATFORM_PC",
"TH1_PLATFORM_IOS"
};
[MenuItem("Tools/TH1/iOS Migration/Command Line/Prepare And Build Windows Smoke")]
public static void PrepareAndBuildWindowsSmoke()
@ -31,6 +57,19 @@ namespace TH1_Logic.Editor
});
}
[MenuItem("Tools/TH1/iOS Migration/Command Line/Build Windows Debug Hotfix Obfuscation Smoke")]
public static void BuildWindowsDebugHotfixObfuscationSmoke()
{
RunBatchAction(() =>
{
ConfigureWindowsIl2CppDebugHotfixObfuscationSettings();
PrepareWindowsDebugHotfixObfuscation();
var exePath = BuildWindowsSmokePlayer(true);
Debug.Log($"[TH1.Migration.CLI] Windows debug hotfix-obfuscation smoke build OK: {exePath}");
});
}
[MenuItem("Tools/TH1/iOS Migration/Command Line/Prepare Current Platform")]
public static void PrepareCurrentPlatformMenu()
{
@ -65,6 +104,93 @@ namespace TH1_Logic.Editor
Debug.Log("[TH1.Migration.CLI] Prepare current platform OK.");
}
private static void PrepareWindowsDebugHotfixObfuscation()
{
AssetDatabase.SaveAssets();
TH1HybridCLRBuildTools.ConfigureHotfixSettings();
TH1YooAssetBuildTools.ConfigureDefaultPackageCollector();
TH1HybridCLRBuildTools.SetOpsObfuscationEnabled(false);
TH1HybridCLRBuildTools.GenerateAll();
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(true, true))
{
throw new BuildFailedException("[TH1.Migration.CLI] Build obfuscated hotfix dll failed.");
}
TH1YooAssetBuildTools.BuildBuiltinDefaultPackage();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
var blockers = TH1MigrationBuildStatus.GetBuildBlockingMessages(
EditorUserBuildSettings.activeBuildTarget,
true,
true);
if (blockers.Count > 0)
{
throw new BuildFailedException(
"[TH1.Migration.CLI] Debug hotfix-obfuscation preparation still has blocking errors:\n" +
string.Join("\n", blockers));
}
Debug.Log("[TH1.Migration.CLI] Windows debug hotfix-obfuscation preparation OK.");
}
private static void ConfigureWindowsIl2CppDebugHotfixObfuscationSettings()
{
const BuildTargetGroup group = BuildTargetGroup.Standalone;
const BuildTarget target = BuildTarget.StandaloneWindows64;
if (EditorUserBuildSettings.activeBuildTarget != target)
{
EditorUserBuildSettings.SwitchActiveBuildTarget(group, target);
}
SetWindowsDebugDefines();
PlayerSettings.productName = ProductName;
PlayerSettings.SetScriptingBackend(group, ScriptingImplementation.IL2CPP);
EditorUserBuildSettings.development = true;
EditorUserBuildSettings.allowDebugging = true;
PlayerSettings.usePlayerLog = true;
PlayerSettings.enableInternalProfiler = true;
PlayerSettings.SetStackTraceLogType(LogType.Log, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Warning, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Error, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Assert, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Exception, StackTraceLogType.ScriptOnly);
Debug.Log("[TH1.Migration.CLI] Configured Windows IL2CPP debug hotfix-obfuscation build settings.");
}
private static void SetWindowsDebugDefines()
{
const BuildTargetGroup group = BuildTargetGroup.Standalone;
var defines = new HashSet<string>(
PlayerSettings.GetScriptingDefineSymbolsForGroup(group)
.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
.Select(symbol => symbol.Trim())
.Where(symbol => !string.IsNullOrEmpty(symbol)),
StringComparer.Ordinal);
foreach (var symbol in ControlledDefines)
{
defines.Remove(symbol);
}
foreach (var symbol in BaseSharedDefines)
{
defines.Add(symbol);
}
defines.Add("TH1_PLATFORM_PC");
defines.Add("STEAMWORKS_NET");
defines.Add("STEAM_CHANNEL");
defines.Add("USE_INPUT");
PlayerSettings.SetScriptingDefineSymbolsForGroup(group, string.Join(";", defines.OrderBy(symbol => symbol)));
}
private static void ConfigureWindowsIl2CppSmokeSettings()
{
const BuildTargetGroup group = BuildTargetGroup.Standalone;
@ -88,7 +214,7 @@ namespace TH1_Logic.Editor
Debug.Log("[TH1.Migration.CLI] Configured Windows IL2CPP smoke build settings.");
}
private static string BuildWindowsSmokePlayer()
private static string BuildWindowsSmokePlayer(bool validateDebugHotfixObfuscation = false)
{
var outputRoot = GetSmokeBuildDirectory();
CleanSmokeBuildDirectory(outputRoot);
@ -110,10 +236,14 @@ namespace TH1_Logic.Editor
locationPathName = outputExe,
target = BuildTarget.StandaloneWindows64,
targetGroup = BuildTargetGroup.Standalone,
options = BuildOptions.Development
options = BuildOptions.Development | BuildOptions.AllowDebugging
};
var report = BuildPipeline.BuildPlayer(options);
BuildReport report;
using (TH1MigrationBuildValidationGate.Suppress())
{
report = BuildPipeline.BuildPlayer(options);
}
var summary = report.summary;
if (summary.result != BuildResult.Succeeded)
{
@ -134,9 +264,46 @@ namespace TH1_Logic.Editor
$"[TH1.Migration.CLI] Build succeeded but no runnable player exe was found under {outputRoot}.");
}
if (validateDebugHotfixObfuscation)
{
ValidateIl2CppDebugHotfixObfuscationOutput(outputRoot, playerExe);
}
return playerExe;
}
private static void ValidateIl2CppDebugHotfixObfuscationOutput(string outputRoot, string playerExe)
{
var gameAssembly = Directory.GetFiles(outputRoot, "GameAssembly.dll", SearchOption.AllDirectories)
.FirstOrDefault();
if (string.IsNullOrEmpty(gameAssembly))
{
throw new BuildFailedException(
$"[TH1.Migration.CLI] Windows Debug hotfix-obfuscation build must use IL2CPP, but GameAssembly.dll was not found under {outputRoot}.");
}
var playerName = Path.GetFileNameWithoutExtension(playerExe);
var dataDirectory = Path.Combine(Path.GetDirectoryName(playerExe) ?? outputRoot, playerName + "_Data");
var managedDirectory = Path.Combine(dataDirectory, "Managed");
var embeddedHotfixDll = Path.Combine(managedDirectory, "TH1.Hotfix.dll");
if (File.Exists(embeddedHotfixDll))
{
throw new BuildFailedException(
$"[TH1.Migration.CLI] TH1.Hotfix.dll should not be embedded in IL2CPP player Managed directory: {embeddedHotfixDll}");
}
var streamingHotfixDll = Directory
.GetFiles(dataDirectory, "TH1.Hotfix.dll.bytes", SearchOption.AllDirectories)
.FirstOrDefault(path => path.IndexOf("HybridCLR", StringComparison.OrdinalIgnoreCase) >= 0);
if (string.IsNullOrEmpty(streamingHotfixDll))
{
throw new BuildFailedException(
$"[TH1.Migration.CLI] Obfuscated hotfix dll bytes were not copied into player StreamingAssets under {dataDirectory}.");
}
Debug.Log($"[TH1.Migration.CLI] Windows IL2CPP debug hotfix-obfuscation output verified: gameAssembly={gameAssembly}, streaming={streamingHotfixDll}");
}
private static string GetSmokeBuildDirectory()
{
var argValue = GetCommandLineValue(BuildDirArg);

View File

@ -19,6 +19,7 @@ namespace TH1_Logic.Editor
private const string OpsObfuscatorSettingsPath = "Assets/OPS/Obfuscator/Settings/Obfuscator_Settings.json";
private const string ProductName = "TOHOTOPIA";
private const string ExeName = "TOHOTOPIA.exe";
private const string DebugOpsObfuscationEditorPrefsKey = "TH1.UnifiedBuild.DebugOpsObfuscation";
private const string OpsObfuscationEnabledLabel = "开启";
private const string OpsObfuscationDisabledLabel = "关闭";
private static readonly Regex OpsObfuscationRegex = new Regex(
@ -58,11 +59,12 @@ namespace TH1_Logic.Editor
private uint _patch;
private uint _fourth;
private BuildPlatformProfile _platform = BuildPlatformProfile.PC;
private PackageProfile _package = PackageProfile.Debug;
private PackageProfile _package = PackageProfile.Release;
private bool _prepareBeforeBuild = true;
private bool _buildPlayer = true;
private bool _cleanOutput;
private bool _cleanOutput = true;
private bool _runMultilingualExportImport = true;
private bool _buildYooAssetAb = true;
private bool _showAdvanced;
private bool _enableSpeedup;
private bool _enableTrain;
@ -70,6 +72,7 @@ namespace TH1_Logic.Editor
private bool _gameAutoDebug;
private bool _checkActionDifference;
private bool _steamTest;
private bool _obfuscateDebugPackage;
private bool _actionScheduled;
private string _lastAction = "Ready";
private string _stageDetail = string.Empty;
@ -88,6 +91,12 @@ namespace TH1_Logic.Editor
private void OnEnable()
{
LoadVersionConfig();
_obfuscateDebugPackage = EditorPrefs.GetBool(DebugOpsObfuscationEditorPrefsKey, false);
_prepareBeforeBuild = true;
_buildPlayer = true;
_cleanOutput = true;
_runMultilingualExportImport = true;
_buildYooAssetAb = true;
ResetReleaseTogglesIfNeeded();
}
@ -119,7 +128,7 @@ namespace TH1_Logic.Editor
}
EditorGUILayout.HelpBox(
"流程:选版本 -> 选平台 -> 选 Debug/Release -> 勾特殊功能 -> 一键执行。Debug 包会关闭 OPS 混淆Release 包会关闭特殊功能宏并开启 OPS 混淆iOS 配置不会写入 STEAM_CHANNEL/STEAMWORKS_NET。",
"流程:选版本 -> 选平台 -> 选 Debug/Release -> 勾特殊功能 -> 一键执行。Debug 包默认携带未混淆 Hotfix DLL可手动勾选混淆Release 包会关闭特殊功能宏并携带混淆 Hotfix DLLiOS 配置不会写入 STEAM_CHANNEL/STEAMWORKS_NET。",
MessageType.Info);
}
@ -191,11 +200,13 @@ namespace TH1_Logic.Editor
_cleanOutput = EditorGUILayout.ToggleLeft("构建前清空本次输出目录", _cleanOutput);
EditorGUILayout.HelpBox("建议多语言导表/导回后再打包。勾选后,一键流程会先执行多语言导出导回,把 DataAssets 同步到 Export再继续构建 AB 和 Player。", MessageType.Warning);
_runMultilingualExportImport = EditorGUILayout.ToggleLeft("一键流程中执行多语言导出导回DataAssets -> Export", _runMultilingualExportImport);
DrawYooAssetBuildOption();
DrawDebugObfuscationOption();
var group = GetBuildTargetGroup(_platform);
EditorGUILayout.LabelField("目标平台组", group.ToString());
EditorGUILayout.LabelField("目标 BuildTarget", GetBuildTarget(_platform).ToString());
EditorGUILayout.LabelField("脚本后端", GetScriptingBackend(_platform, _package).ToString());
EditorGUILayout.LabelField("脚本后端", GetSelectedScriptingBackend().ToString());
EditorGUILayout.LabelField("输出目录", GetOutputPathPreview());
}
@ -215,12 +226,51 @@ namespace TH1_Logic.Editor
if (_package == PackageProfile.Release)
{
EditorGUILayout.HelpBox("发布包会强制关闭上面所有特殊功能宏,并在应用配置时开启 OPS 混淆。", MessageType.None);
EditorGUILayout.HelpBox("发布包会强制关闭上面所有特殊功能宏,并携带混淆后的 Hotfix DLL。", MessageType.None);
}
DrawOpsObfuscationStatus();
}
private void DrawYooAssetBuildOption()
{
using (new EditorGUI.DisabledScope(!_prepareBeforeBuild))
{
var next = EditorGUILayout.ToggleLeft("准备流程中构建 YooAsset AB资源没变可关闭", _buildYooAssetAb);
if (next != _buildYooAssetAb)
{
_buildYooAssetAb = next;
}
}
if (_prepareBeforeBuild && !_buildYooAssetAb)
{
var messageType = _runMultilingualExportImport ? MessageType.Warning : MessageType.None;
var message = _runMultilingualExportImport
? "当前会先执行多语言导出导回,但不会重构 AB包内仍会使用旧 AB 里的资源。只在确认资源变化不影响本次测试时这样做。"
: "将跳过 YooAsset Collector 配置和内置 AB 构建;适合只测代码/Hotfix 混淆的 Debug 或 Release 包。";
EditorGUILayout.HelpBox(message, messageType);
}
}
private void DrawDebugObfuscationOption()
{
if (_package == PackageProfile.Release)
{
EditorGUILayout.LabelField("Hotfix DLL 混淆", "Release 包固定开启");
return;
}
var next = EditorGUILayout.ToggleLeft("Debug 包也混淆 Hotfix DLL用于定位混淆后问题", _obfuscateDebugPackage);
if (next == _obfuscateDebugPackage)
{
return;
}
_obfuscateDebugPackage = next;
EditorPrefs.SetBool(DebugOpsObfuscationEditorPrefsKey, _obfuscateDebugPackage);
}
private void DrawActions()
{
EditorGUILayout.LabelField("执行", EditorStyles.boldLabel);
@ -280,10 +330,19 @@ namespace TH1_Logic.Editor
{
ScheduleAction("Build Hotfix DLL", () =>
{
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(IsDevelopmentBuild()))
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(IsDevelopmentBuild(), ShouldObfuscateHotfixDll()))
throw new Exception("Build hotfix dll failed. See Console for details.");
});
}
if (GUILayout.Button("测试 Hotfix 混淆"))
{
ScheduleAction("Test Hotfix Obfuscation", () =>
{
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(IsDevelopmentBuild(), true))
throw new Exception("Test hotfix obfuscation failed. See Console for details.");
});
}
}
using (new EditorGUILayout.HorizontalScope())
@ -301,7 +360,7 @@ namespace TH1_Logic.Editor
using (new EditorGUILayout.HorizontalScope())
{
if (GUILayout.Button("按当前包类型设置 OPS 混淆"))
if (GUILayout.Button("应用 Hotfix 混淆设置"))
{
ScheduleAction("Apply OPS Obfuscation", ApplyOpsObfuscationSettings);
}
@ -403,17 +462,33 @@ namespace TH1_Logic.Editor
private void RunHybridClrAndYooAssetStages()
{
RunBuildStage("配置 HybridCLR", "刷新热更程序集、AOT 元数据和 HybridCLR 设置。", TH1HybridCLRBuildTools.ConfigureHotfixSettings);
RunBuildStage("配置 YooAsset Collector", "确保 DefaultPackage 收集整个 Assets/BundleResources。", TH1YooAssetBuildTools.ConfigureDefaultPackageCollector);
RunBuildStage("HybridCLR Generate All", "生成 HybridCLR 必要代码和裁剪引用。", TH1HybridCLRBuildTools.GenerateAll);
RunBuildStage("构建 Hotfix DLL/AOT", "编译热更 DLL 并写入 StreamingAssets。", () =>
if (_buildYooAssetAb)
{
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(IsDevelopmentBuild()))
RunBuildStage("配置 YooAsset Collector", "确保 DefaultPackage 收集整个 Assets/BundleResources。", TH1YooAssetBuildTools.ConfigureDefaultPackageCollector);
}
else
{
SkipBuildStage("配置 YooAsset Collector", "已取消准备流程中构建 YooAsset AB。");
}
RunBuildStage("HybridCLR Generate All", "生成 HybridCLR 必要代码和裁剪引用。", TH1HybridCLRBuildTools.GenerateAll);
RunBuildStage("构建 Hotfix DLL/AOT", GetHotfixBuildStageDetail(), () =>
{
if (!TH1HybridCLRBuildTools.BuildAndCopyHotfixArtifacts(IsDevelopmentBuild(), ShouldObfuscateHotfixDll()))
{
throw new BuildFailedException("Build hotfix dll failed. See Console for details.");
}
});
RunBuildStage("构建 YooAsset AB", "构建内置 DefaultPackage AssetBundle。", TH1YooAssetBuildTools.BuildBuiltinDefaultPackage);
RunBuildStage("检查构建阻断项", "确认热更 DLL、AOT Metadata、YooAsset Manifest 都已就绪。", CheckBuildBlockers);
if (_buildYooAssetAb)
{
RunBuildStage("构建 YooAsset AB", "构建内置 DefaultPackage AssetBundle。", TH1YooAssetBuildTools.BuildBuiltinDefaultPackage);
}
else
{
SkipBuildStage("构建 YooAsset AB", "已取消;沿用 StreamingAssets 中已有的 YooAsset AB。");
}
RunBuildStage("检查构建阻断项", GetBuildBlockerStageDetail(), CheckBuildBlockers);
}
private void SkipPrepareStages(string detail)
@ -432,9 +507,26 @@ namespace TH1_Logic.Editor
UpdateRunningStage("多语言导出导回", message, progress));
}
private static void CheckBuildBlockers()
private string GetHotfixBuildStageDetail()
{
var blockers = TH1MigrationBuildStatus.GetBuildBlockingMessages(EditorUserBuildSettings.activeBuildTarget);
return ShouldObfuscateHotfixDll()
? "编译热更 DLL单独混淆 TH1.Hotfix.dll并写入 StreamingAssets。"
: "编译热更 DLL 并写入 StreamingAssets。";
}
private string GetBuildBlockerStageDetail()
{
return _buildYooAssetAb
? "确认热更 DLL、AOT Metadata、YooAsset Manifest 都已就绪。"
: "确认热更 DLL、AOT Metadata 已就绪YooAsset AB 按选项跳过检查。";
}
private void CheckBuildBlockers()
{
var blockers = TH1MigrationBuildStatus.GetBuildBlockingMessages(
EditorUserBuildSettings.activeBuildTarget,
ShouldObfuscateHotfixDll(),
_buildYooAssetAb);
if (blockers.Count == 0) return;
throw new BuildFailedException(
@ -638,7 +730,7 @@ namespace TH1_Logic.Editor
private void ApplyPlayerSettings()
{
var group = GetBuildTargetGroup(_platform);
PlayerSettings.SetScriptingBackend(group, GetScriptingBackend(_platform, _package));
PlayerSettings.SetScriptingBackend(group, GetSelectedScriptingBackend());
EditorUserBuildSettings.development = IsDevelopmentBuild();
EditorUserBuildSettings.allowDebugging = IsDevelopmentBuild();
PlayerSettings.usePlayerLog = IsDevelopmentBuild();
@ -666,30 +758,44 @@ namespace TH1_Logic.Editor
private void DrawOpsObfuscationStatus()
{
EditorGUILayout.Space(4);
EditorGUILayout.LabelField("OPS 混淆", EditorStyles.boldLabel);
var targetEnabled = ShouldEnableOpsObfuscation();
EditorGUILayout.LabelField("当前包类型目标", targetEnabled ? $"Release 包:{OpsObfuscationEnabledLabel}" : $"Debug 包:{OpsObfuscationDisabledLabel}");
EditorGUILayout.LabelField("Hotfix DLL 混淆", EditorStyles.boldLabel);
var targetEnabled = ShouldObfuscateHotfixDll();
EditorGUILayout.LabelField("当前包类型目标", GetHotfixObfuscationTargetLabel(targetEnabled));
if (TryReadOpsObfuscationEnabled(out var currentEnabled))
{
EditorGUILayout.LabelField("当前配置文件状态", currentEnabled ? OpsObfuscationEnabledLabel : OpsObfuscationDisabledLabel);
EditorGUILayout.LabelField("OPS 全局配置文件状态", currentEnabled ? OpsObfuscationEnabledLabel : OpsObfuscationDisabledLabel);
}
else
{
EditorGUILayout.HelpBox($"无法读取 OPS 混淆状态:{OpsObfuscatorSettingsPath}", MessageType.Warning);
}
EditorGUILayout.HelpBox("一键流程只在 Hotfix 阶段临时开启 OPS全局配置会保持关闭避免 Build Player 阶段也进入 OPS 钩子。", MessageType.None);
}
private void ApplyOpsObfuscationSettings()
{
var enabled = ShouldEnableOpsObfuscation();
SetOpsObfuscationEnabled(enabled);
Debug.Log($"[TH1.UnifiedBuild] OPS obfuscation {(enabled ? "enabled" : "disabled")} for {_package} package.");
SetOpsObfuscationEnabled(false);
Debug.Log($"[TH1.UnifiedBuild] OPS player build hook disabled. Hotfix dll obfuscation {(ShouldObfuscateHotfixDll() ? "enabled" : "disabled")} for {_package} package.");
}
private bool ShouldEnableOpsObfuscation()
private bool ShouldObfuscateHotfixDll()
{
return _package == PackageProfile.Release;
return _package == PackageProfile.Release ||
(_package == PackageProfile.Debug && _obfuscateDebugPackage);
}
private string GetHotfixObfuscationTargetLabel(bool enabled)
{
if (_package == PackageProfile.Release)
{
return $"Release 包:{OpsObfuscationEnabledLabel}";
}
return enabled
? $"Debug 包:{OpsObfuscationEnabledLabel}(调试混淆问题)"
: $"Debug 包:{OpsObfuscationDisabledLabel}";
}
private static bool TryReadOpsObfuscationEnabled(out bool enabled)
@ -741,6 +847,8 @@ namespace TH1_Logic.Editor
private void BuildPlayer()
{
ValidateScriptingBackendBeforeBuild();
var outputPath = GetOutputPath();
var outputDir = _platform == BuildPlatformProfile.iOS ? outputPath : Path.GetDirectoryName(outputPath);
if (string.IsNullOrEmpty(outputDir)) throw new BuildFailedException("Invalid output path.");
@ -785,6 +893,25 @@ namespace TH1_Logic.Editor
}
Debug.Log($"[TH1.UnifiedBuild] Build succeeded: {outputPath}");
if (!Application.isBatchMode)
{
EditorUtility.RevealInFinder(outputDir);
}
}
private void ValidateScriptingBackendBeforeBuild()
{
var group = GetBuildTargetGroup(_platform);
var expected = GetSelectedScriptingBackend();
var actual = PlayerSettings.GetScriptingBackend(group);
if (actual == expected)
{
return;
}
throw new BuildFailedException(
$"Scripting backend mismatch before Build Player. Platform={_platform}, Package={_package}, expected={expected}, actual={actual}. " +
"Run Apply Profile again before building.");
}
private BuildOptions GetBuildOptions()
@ -835,10 +962,11 @@ namespace TH1_Logic.Editor
return platform == BuildPlatformProfile.iOS ? BuildTargetGroup.iOS : BuildTargetGroup.Standalone;
}
private static ScriptingImplementation GetScriptingBackend(BuildPlatformProfile platform, PackageProfile package)
private ScriptingImplementation GetSelectedScriptingBackend()
{
if (platform == BuildPlatformProfile.iOS) return ScriptingImplementation.IL2CPP;
return package == PackageProfile.Release ? ScriptingImplementation.IL2CPP : ScriptingImplementation.Mono2x;
if (_platform == BuildPlatformProfile.iOS) return ScriptingImplementation.IL2CPP;
if (_package == PackageProfile.Release) return ScriptingImplementation.IL2CPP;
return ShouldObfuscateHotfixDll() ? ScriptingImplementation.IL2CPP : ScriptingImplementation.Mono2x;
}
private bool IsDevelopmentBuild()

View File

@ -48,7 +48,10 @@ namespace TH1_UI.Controller.Announce
// 使用接收到的数据设置UI内容
if (WindowScript != null)
{
WindowScript.SetContent(evt.EventType, evt.Param1, evt.Param2);
if (!WindowScript.SetContent(evt.EventType, evt.Param1, evt.Param2))
{
Close();
}
}
}
else
@ -82,4 +85,4 @@ namespace TH1_UI.Controller.Announce
// 重大事件公告UI不需要取消地图高亮
}
}
}
}

View File

@ -53,7 +53,7 @@ namespace TH1_UI.View.Announce
_grayScaleMat = TH1Resource.ResourceLoader.Load<Material>("Materials/GrayScale");
}
public void SetContent(UIAnnounceMajorEventType eventType, int param1, int param2)
public bool SetContent(UIAnnounceMajorEventType eventType, int param1, int param2)
{
_eventType = eventType;
_param1 = param1;
@ -61,7 +61,7 @@ namespace TH1_UI.View.Announce
if (Title == null || Content == null || LeaderImage == null || WonderImage == null)
{
LogSystem.LogError("UIAnnounceMajorEventView.SetContent(): Title or Content or Image or Image is null");
return;
return false;
}
UICenterMessageInfo info;
@ -72,12 +72,14 @@ namespace TH1_UI.View.Announce
case UIAnnounceMajorEventType.StartGame:
//step #1 获取界面的文本info以及真人玩家data和playerInfo
if (!Table.Instance.UICenterMessageDataAssets.GetUICenterMessageInfo(UICenterMessageID.StartGame, out info)) break;
player = Main.MapData.PlayerMap.SelfPlayerData;
Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out playerInfo);
if (!Table.Instance.UICenterMessageDataAssets.GetUICenterMessageInfo(UICenterMessageID.StartGame, out info)) return false;
var map = Main.MapData;
player = map?.PlayerMap?.SelfPlayerData;
if (player == null) return false;
if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out playerInfo)) return false;
string leaderName = MultilingualManager.Instance.GetMultilingualTextSafe(playerInfo.LeaderName);
string civName = MultilingualManager.Instance.GetMultilingualTextSafe(playerInfo.CivName);
string forceName = Logic.PlayerLogic.GetDisplayForceName(Main.MapData, player);
string forceName = Logic.PlayerLogic.GetDisplayForceName(map, player);
//step #2 设置文字和图片
MultilingualManager.Instance.SetUIText(Content,info.Message,new List<string>(){leaderName,civName,forceName});
@ -209,7 +211,8 @@ namespace TH1_UI.View.Announce
default:
break;
}
return true;
}

View File

@ -39,6 +39,7 @@ namespace TH1_UI.View.Base
// ✅ [修复] 必须在这里初始化 AnimancerComponent
ApplyDefaultScrollSensitivity();
_animancer = GetComponent<AnimancerComponent>();
ApplyUiAnimancerDisablePolicy();
// 如果 Inspector 中没有手动指定打开动画,则使用默认的淡入动画
if (_showAnimationClip == null)
@ -73,6 +74,16 @@ namespace TH1_UI.View.Base
}
}
void ApplyUiAnimancerDisablePolicy()
{
var animancers = GetComponentsInChildren<AnimancerComponent>(true);
foreach (var animancer in animancers)
{
if (animancer == null) continue;
animancer.ActionOnDisable = AnimancerComponent.DisableAction.Pause;
}
}
void _Resize()
{
// ... (此部分代码未做修改,保持原样)

View File

@ -34,11 +34,11 @@
"url": "https://package.openupm.com"
},
"com.unity.2d.animation": {
"version": "9.1.3",
"version": "9.0.3",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.0.4",
"com.unity.2d.common": "8.0.1",
"com.unity.2d.sprite": "1.0.0",
"com.unity.collections": "1.1.0",
"com.unity.modules.animation": "1.0.0",
@ -47,7 +47,7 @@
"url": "https://packages.unity.com"
},
"com.unity.2d.aseprite": {
"version": "1.1.6",
"version": "1.0.0",
"depth": 1,
"source": "registry",
"dependencies": {
@ -59,7 +59,7 @@
"url": "https://packages.unity.com"
},
"com.unity.2d.common": {
"version": "8.0.4",
"version": "8.0.1",
"depth": 2,
"source": "registry",
"dependencies": {
@ -79,13 +79,13 @@
"url": "https://packages.unity.com"
},
"com.unity.2d.psdimporter": {
"version": "8.0.5",
"version": "8.0.2",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.0.2",
"com.unity.2d.common": "8.0.1",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.animation": "9.1.1"
"com.unity.2d.animation": "9.0.1"
},
"url": "https://packages.unity.com"
},
@ -96,11 +96,11 @@
"dependencies": {}
},
"com.unity.2d.spriteshape": {
"version": "9.0.5",
"version": "9.0.2",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "8.0.4",
"com.unity.2d.common": "8.0.1",
"com.unity.mathematics": "1.1.0",
"com.unity.modules.physics2d": "1.0.0"
},
@ -116,7 +116,7 @@
}
},
"com.unity.2d.tilemap.extras": {
"version": "3.1.3",
"version": "3.1.1",
"depth": 1,
"source": "registry",
"dependencies": {
@ -128,12 +128,11 @@
"url": "https://packages.unity.com"
},
"com.unity.burst": {
"version": "1.8.18",
"version": "1.8.8",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.mathematics": "1.2.1",
"com.unity.modules.jsonserialize": "1.0.0"
"com.unity.mathematics": "1.2.1"
},
"url": "https://packages.unity.com"
},
@ -166,14 +165,14 @@
"depth": 0,
"source": "builtin",
"dependencies": {
"com.unity.2d.animation": "9.1.3",
"com.unity.2d.animation": "9.0.3",
"com.unity.2d.pixel-perfect": "5.0.3",
"com.unity.2d.psdimporter": "8.0.5",
"com.unity.2d.psdimporter": "8.0.2",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.spriteshape": "9.0.5",
"com.unity.2d.spriteshape": "9.0.2",
"com.unity.2d.tilemap": "1.0.0",
"com.unity.2d.tilemap.extras": "3.1.3",
"com.unity.2d.aseprite": "1.1.6"
"com.unity.2d.tilemap.extras": "3.1.1",
"com.unity.2d.aseprite": "1.0.0"
}
},
"com.unity.ide.rider": {
@ -202,7 +201,7 @@
"url": "https://packages.unity.com"
},
"com.unity.render-pipelines.core": {
"version": "14.0.11",
"version": "14.0.8",
"depth": 1,
"source": "builtin",
"dependencies": {
@ -218,22 +217,13 @@
"source": "builtin",
"dependencies": {
"com.unity.mathematics": "1.2.1",
"com.unity.burst": "1.8.9",
"com.unity.render-pipelines.core": "14.0.11",
"com.unity.shadergraph": "14.0.11",
"com.unity.render-pipelines.universal-config": "14.0.9"
}
},
"com.unity.render-pipelines.universal-config": {
"version": "14.0.10",
"depth": 1,
"source": "builtin",
"dependencies": {
"com.unity.render-pipelines.core": "14.0.10"
"com.unity.burst": "1.8.4",
"com.unity.render-pipelines.core": "14.0.8",
"com.unity.shadergraph": "14.0.8"
}
},
"com.unity.scriptablebuildpipeline": {
"version": "1.21.25",
"version": "1.21.21",
"depth": 1,
"source": "registry",
"dependencies": {},
@ -247,11 +237,11 @@
"url": "https://packages.unity.com"
},
"com.unity.shadergraph": {
"version": "14.0.11",
"version": "14.0.8",
"depth": 1,
"source": "builtin",
"dependencies": {
"com.unity.render-pipelines.core": "14.0.11",
"com.unity.render-pipelines.core": "14.0.8",
"com.unity.searcher": "4.9.2"
}
},

View File

@ -13,7 +13,7 @@ PlayerSettings:
useOnDemandResources: 0
accelerometerFrequency: 60
companyName: Remilia Command
productName: TOHOTOPIA
productName: TOHOTOPIA v0.7.3f
defaultCursor: {fileID: 0}
cursorHotspot: {x: 0, y: 0}
m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
@ -48,7 +48,6 @@ PlayerSettings:
defaultScreenHeightWeb: 600
m_StereoRenderingPath: 0
m_ActiveColorSpace: 1
unsupportedMSAAFallback: 0
m_SpriteBatchVertexThreshold: 300
m_MTRendering: 1
mipStripping: 0
@ -76,7 +75,6 @@ PlayerSettings:
androidMinimumWindowWidth: 400
androidMinimumWindowHeight: 300
androidFullscreenMode: 1
androidAutoRotationBehavior: 1
defaultIsNativeResolution: 0
macRetinaSupport: 1
runInBackground: 0
@ -84,7 +82,6 @@ PlayerSettings:
muteOtherAudioSources: 0
Prepare IOS For Recording: 0
Force IOS Speakers When Recording: 0
audioSpatialExperience: 0
deferSystemGesturesMode: 0
hideHomeButton: 0
submitAnalytics: 1
@ -138,8 +135,6 @@ PlayerSettings:
vulkanEnableLateAcquireNextImage: 0
vulkanEnableCommandBufferRecycling: 1
loadStoreDebugModeEnabled: 0
visionOSBundleVersion: 1.0
tvOSBundleVersion: 1.0
bundleVersion: 0.7.3f
preloadedAssets: []
metroInputSource: 0
@ -152,7 +147,6 @@ PlayerSettings:
isWsaHolographicRemotingEnabled: 0
enableFrameTimingStats: 0
enableOpenGLProfilerGPURecorders: 1
allowHDRDisplaySupport: 0
useHDRDisplay: 0
hdrBitDepth: 0
m_ColorGamuts: 00000000
@ -234,7 +228,6 @@ PlayerSettings:
iOSMetalForceHardShadows: 0
metalEditorSupport: 1
metalAPIValidation: 1
metalCompileShaderBinary: 0
iOSRenderExtraFrameOnPause: 0
iosCopyPluginsCodeInsteadOfSymlink: 0
appleDeveloperTeamID:
@ -462,7 +455,7 @@ PlayerSettings:
switchSocketConcurrencyLimit: 14
switchScreenResolutionBehavior: 2
switchUseCPUProfiler: 0
switchEnableFileSystemTrace: 0
switchUseGOLDLinker: 0
switchLTOSetting: 0
switchApplicationID: 0x01004b9000490000
switchNSODependencies:
@ -592,6 +585,7 @@ PlayerSettings:
switchSocketBufferEfficiency: 4
switchSocketInitializeEnabled: 1
switchNetworkInterfaceManagerInitializeEnabled: 1
switchPlayerConnectionEnabled: 1
switchUseNewStyleFilepaths: 0
switchUseLegacyFmodPriorities: 0
switchUseMicroSleepForYield: 1
@ -756,7 +750,6 @@ PlayerSettings:
metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1}
metroSplashScreenUseBackgroundColor: 0
syncCapabilities: 0
platformCapabilities: {}
metroTargetDeviceFamilies: {}
metroFTAName:

View File

@ -1,2 +1,2 @@
m_EditorVersion: 2022.3.53f1c1
m_EditorVersionWithRevision: 2022.3.53f1c1 (f16e16b78e06)
m_EditorVersion: 2022.3.8f1c1
m_EditorVersionWithRevision: 2022.3.8f1c1 (4ec8ee1b2212)

View File

@ -1,102 +1,623 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NodeCanvas", "NodeCanvas.csproj", "{504AB00F-3D3F-909B-15CB-381039DF1EC2}"
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NodeCanvas", "NodeCanvas.csproj", "{0fb04a50-3f3d-9b90-15cb-381039df1ec2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Hotfix", "TH1.Hotfix.csproj", "{73D282A7-CB2D-EF29-AED6-2182E01638A7}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Hotfix", "TH1.Hotfix.csproj", "{a782d273-2dcb-29ef-aed6-2182e01638a7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ParadoxNotion", "ParadoxNotion.csproj", "{6E3594B9-F350-38E8-E051-007A051E45C9}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Timeline", "Unity.Timeline.csproj", "{63b491c9-db19-5561-f15e-1c9ea0e3c9f0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.FSM", "Animancer.FSM.csproj", "{B6514B77-01B9-7EB9-D593-35721140FEA6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ShaderGraph.Editor", "Unity.ShaderGraph.Editor.csproj", "{8fde539b-b477-26b5-0f99-c769ace654db}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrashSight.Runtime", "CrashSight.Runtime.csproj", "{D79D413D-5E6A-92EE-DA4A-BE15F62A50F3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ParadoxNotion", "ParadoxNotion.csproj", "{b994356e-50f3-e838-e051-007a051e45c9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "com.rlabrecque.steamworks.net", "com.rlabrecque.steamworks.net.csproj", "{45C54A48-C87A-0FED-7146-E9C97C82AFBD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Aseprite.Editor", "Unity.2D.Aseprite.Editor.csproj", "{8e089428-a193-2945-36a1-b1f8757c4203}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Logic.Editor", "TH1.Logic.Editor.csproj", "{47654AF1-44B2-0F19-E6E7-C324B11BCD21}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Flow", "Unity.VisualScripting.Flow.csproj", "{f4cf6b1d-2314-3cd4-2919-94501cec3479}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OPS.Obfuscator", "OPS.Obfuscator.csproj", "{C47EB37A-BDEF-7F7F-DA88-EFA56365689D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Runtime", "Unity.RenderPipelines.Universal.Runtime.csproj", "{c678c602-0a4a-3246-5b09-5b414fc0d5de}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer", "Animancer.csproj", "{F6659E15-63D3-6D1A-EC57-6DB30DA1B98F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEditor.UI", "UnityEditor.UI.csproj", "{74e1c5c0-7c72-fa9f-cd43-b55bdef754da}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.Examples", "Animancer.Examples.csproj", "{76FC8738-B016-5BE2-D964-8C25CC3023A6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Timeline.Editor", "Unity.Timeline.Editor.csproj", "{4f63daae-f5cd-01d3-9fa4-bd9bc22dc82d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp-Editor", "Assembly-CSharp-Editor.csproj", "{6311E6C6-0A20-383B-320B-694068DE37A5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.PlasticSCM.Editor", "Unity.PlasticSCM.Editor.csproj", "{9f94db9c-5882-04d7-c896-b8fd99196c07}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Editor", "TH1.Editor.csproj", "{98A6CD40-90BA-D09A-0F2A-AB7388F81ACC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.Runtime", "Unity.RenderPipelines.Core.Runtime.csproj", "{bd9fa624-8739-25a7-eb0e-444640a78f6f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.AOT", "TH1.AOT.csproj", "{E2888E45-5D33-D4F1-4A1D-FEB18C3D64F4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ScriptableBuildPipeline.Editor", "Unity.ScriptableBuildPipeline.Editor.csproj", "{6830a9eb-1bb7-0aff-ad7d-1b12cc4ddd79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Steam.Editor", "TH1.Steam.Editor.csproj", "{8CAB0A5B-C98C-617A-404C-A43277C19518}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Mathematics", "Unity.Mathematics.csproj", "{22e42b9f-676f-18ca-867c-a7d5d221a80f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "com.rlabrecque.steamworks.net.editor", "com.rlabrecque.steamworks.net.editor.csproj", "{EF8EBA37-0FEB-1015-410B-B4DEF69F9059}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.Editor", "Unity.RenderPipelines.Core.Editor.csproj", "{a8cca490-fd0e-ac44-1ae7-79afcaec1ad8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HybridCLR.Editor", "HybridCLR.Editor.csproj", "{b5a5cde4-f776-a3cf-965b-7acd393a4ff9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Common.Path.Editor", "Unity.2D.Common.Path.Editor.csproj", "{04a97c45-48c6-668f-ac36-dfbabb0f25fe}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.FSM", "Animancer.FSM.csproj", "{774b51b6-b901-b97e-d593-35721140fea6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Psdimporter.Editor", "Unity.2D.Psdimporter.Editor.csproj", "{37815a88-829e-5a28-cd21-1a199012c457}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Core.Editor", "Unity.VisualScripting.Core.Editor.csproj", "{a3cd058e-d81d-4658-0256-e8eec1407181}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.IK.Runtime", "Unity.2D.IK.Runtime.csproj", "{b70f05c5-f9eb-67a6-6bfb-7a4c15a7c1d6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrashSight.Runtime", "CrashSight.Runtime.csproj", "{3d419dd7-6a5e-ee92-da4a-be15f62a50f3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEditor.TestRunner", "UnityEditor.TestRunner.csproj", "{84d77f67-4616-0a38-4f03-16ab5e7769f7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YooAsset.Editor", "YooAsset.Editor.csproj", "{e17e49b1-467b-9f35-a59e-d9aea156de57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Editor", "Unity.RenderPipelines.Universal.Editor.csproj", "{c35b59b3-2d1e-4660-22b4-60a82203cbc5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro.Editor", "Unity.TextMeshPro.Editor.csproj", "{651b9223-1d49-3552-fade-892e6e843c3f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Flow.Editor", "Unity.VisualScripting.Flow.Editor.csproj", "{3be7305c-66e6-ffc8-a35a-0a6a8b4f4610}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEngine.TestRunner", "UnityEngine.TestRunner.csproj", "{ed943ac8-3d8f-7c17-157d-c4c31cbc811c}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Core", "Unity.VisualScripting.Core.csproj", "{3b86216b-72df-a555-5f96-65b39a83c610}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "com.rlabrecque.steamworks.net", "com.rlabrecque.steamworks.net.csproj", "{484ac545-7ac8-ed0f-7146-e9c97c82afbd}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Editor", "Unity.2D.Tilemap.Editor.csproj", "{40b987c2-94ea-9ed4-6f63-abc9b006d1e6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Searcher.Editor", "Unity.Searcher.Editor.csproj", "{c1108643-0a9f-f78a-fcbe-c1d5d3670ee2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst", "Unity.Burst.csproj", "{7ae84323-8279-2bed-3a96-b03194de76f4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PsdPlugin", "PsdPlugin.csproj", "{2291f2b0-92e0-7e70-af29-9f195372dc03}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections", "Unity.Collections.csproj", "{491ac21f-d830-bfd7-e626-15eabf2df6a9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Animation.Editor", "Unity.2D.Animation.Editor.csproj", "{9966ea08-1871-7d07-45c9-8be7d88e754e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.SpriteShape.Editor", "Unity.2D.SpriteShape.Editor.csproj", "{e4fe47e6-c383-9f4e-f5a4-354867d9fe91}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Logic.Editor", "TH1.Logic.Editor.csproj", "{f14a6547-b244-190f-e6e7-c324b11bcd21}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YooAsset", "YooAsset.csproj", "{969b6393-7326-9cc5-ac5f-d252d24b1a34}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualStudio.Editor", "Unity.VisualStudio.Editor.csproj", "{2fd67010-5958-e159-3cc0-c54cbefa2290}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PPv2URPConverters", "PPv2URPConverters.csproj", "{c035505f-2403-19ee-1749-5ecd4746f976}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OPS.Obfuscator", "OPS.Obfuscator.csproj", "{7ab37ec4-efbd-7f7f-da88-efa56365689d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuGetForUnity", "NuGetForUnity.csproj", "{1f33cf80-07a3-b2f9-b7bb-11acc1f175d3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Rider.Editor", "Unity.Rider.Editor.csproj", "{35b7e023-97a7-dbdc-b926-161520c4dc89}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.InternalAPIEditorBridge.001", "Unity.InternalAPIEditorBridge.001.csproj", "{5655cc19-e755-9069-b166-1343c10b837d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.SpriteShape.Runtime", "Unity.2D.SpriteShape.Runtime.csproj", "{652001f9-9c1b-a374-8d10-86cd1b4d5f3f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer", "Animancer.csproj", "{159e65f6-d363-1a6d-ec57-6db30da1b98f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MemoryPack", "MemoryPack.csproj", "{c6244ad6-8b5a-a312-8d20-3509617ae294}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.State.Editor", "Unity.VisualScripting.State.Editor.csproj", "{0703fade-f85f-e284-3526-ccf1bb017b33}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.Examples", "Animancer.Examples.csproj", "{3887fc76-16b0-e25b-d964-8c25cc3023a6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEngine.UI", "UnityEngine.UI.csproj", "{979dfe98-9199-94e5-7d3c-a2abc20e4793}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst.CodeGen", "Unity.Burst.CodeGen.csproj", "{20ff02be-4ec6-8c98-c6f9-b038409c414d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipeline.Universal.ShaderLibrary", "Unity.RenderPipeline.Universal.ShaderLibrary.csproj", "{fbdf8803-6ad7-83ad-0fe9-28598ca1a00f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.State", "Unity.VisualScripting.State.csproj", "{4337c050-cc3a-134b-6dfa-c9e140f3f61a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro", "Unity.TextMeshPro.csproj", "{dfd7019c-bb86-3498-4973-5d336b1f52ef}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Extras.Editor", "Unity.2D.Tilemap.Extras.Editor.csproj", "{6858fc7a-0902-f5e2-5f0c-b3af5d8c14d7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Animation.Runtime", "Unity.2D.Animation.Runtime.csproj", "{966594db-397c-5af1-f590-00ceeab21cb6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.SettingsProvider.Editor", "Unity.VisualScripting.SettingsProvider.Editor.csproj", "{db89644f-431d-7769-779c-05896c34395b}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.IK.Editor", "Unity.2D.IK.Editor.csproj", "{2330184f-e44c-9b47-a0ec-374ebe1daf06}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp-Editor", "Assembly-CSharp-Editor.csproj", "{c6e61163-200a-3b38-320b-694068de37a5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.InternalAPIEngineBridge.001", "Unity.InternalAPIEngineBridge.001.csproj", "{90dc1aaf-d7c0-dd6a-a6ed-aa77e7f1a486}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst.Editor", "Unity.Burst.Editor.csproj", "{e74d0544-fb3f-a89c-c745-9769758465d8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Aseprite.Common", "Unity.2D.Aseprite.Common.csproj", "{8f239c03-0b13-b5a7-17e4-12e9342f07e0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Editor", "TH1.Editor.csproj", "{40cda698-ba90-9ad0-0f2a-ab7388f81acc}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Common.Editor", "Unity.2D.Common.Editor.csproj", "{945e3271-902a-848a-4836-a63ac22f6bff}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.PixelPerfect", "Unity.2D.PixelPerfect.csproj", "{085a5f8a-e0c1-924e-86ef-8d1110206613}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.PixelPerfect.Editor", "Unity.2D.PixelPerfect.Editor.csproj", "{954606ad-4e98-1746-2d42-97503edb8f42}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Sprite.Editor", "Unity.2D.Sprite.Editor.csproj", "{a8309bda-81a0-0e11-d6b4-bfaf6da6450d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Common.Runtime", "Unity.2D.Common.Runtime.csproj", "{098d18e4-6ae0-86c7-8616-1c17d236ea89}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.AOT", "TH1.AOT.csproj", "{458e88e2-335d-f1d4-4a1d-feb18c3d64f4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Mathematics.Editor", "Unity.Mathematics.Editor.csproj", "{b222b8e9-4c55-4797-e65b-2cfa5626b69a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Extras", "Unity.2D.Tilemap.Extras.csproj", "{95fe389c-81b1-c9f7-0230-926077cb0926}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.InternalAPIEditorBridge.005", "Unity.InternalAPIEditorBridge.005.csproj", "{96f43981-0b0f-178f-6a92-f4488c9b8181}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ShaderGraph.Utilities", "Unity.ShaderGraph.Utilities.csproj", "{e379cc4a-07ca-e3e7-8188-50d8e1851b65}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Shared.Editor", "Unity.VisualScripting.Shared.Editor.csproj", "{58cf9cb8-9dba-8f43-f2f8-e923457c1691}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Steam.Editor", "TH1.Steam.Editor.csproj", "{5b0aab8c-8cc9-7a61-404c-a43277c19518}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HybridCLR.Runtime", "HybridCLR.Runtime.csproj", "{9df118af-f9b8-47b5-c242-63718d7ed119}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ScriptableBuildPipeline", "Unity.ScriptableBuildPipeline.csproj", "{2b300fef-22e5-8e33-299d-e81b8a400794}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections.DocCodeSamples", "Unity.Collections.DocCodeSamples.csproj", "{7fdf0708-d79d-15b8-5417-a497c97d933b}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "com.rlabrecque.steamworks.net.editor", "com.rlabrecque.steamworks.net.editor.csproj", "{37ba8eef-eb0f-1510-410b-b4def69f9059}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections.BurstCompatibilityGen", "Unity.Collections.BurstCompatibilityGen.csproj", "{5a8d4482-bf60-ff37-23a9-6008d09e865c}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.CollabProxy.Editor", "Unity.CollabProxy.Editor.csproj", "{4bef6551-7042-78d6-30a6-28520a4ec193}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary", "Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.csproj", "{86e9e3b2-607d-95d0-f253-3311097e2c40}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.ShaderLibrary", "Unity.RenderPipelines.Core.ShaderLibrary.csproj", "{12a11b8b-7f02-62f3-33ea-1dd938c79e71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Shaders", "Unity.RenderPipelines.Universal.Shaders.csproj", "{2f530e06-cca7-161a-01b9-0629a5a15367}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NodeCanvas", "NodeCanvas.Player.csproj", "{ec74174d-c1b7-a7a0-0276-f28f73c7038a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.Hotfix", "TH1.Hotfix.Player.csproj", "{693e2cff-cc5b-352a-fef1-ace2e1eff2ab}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Timeline", "Unity.Timeline.Player.csproj", "{9413d5c4-9215-77d3-3dd8-f6cfaa3fef5e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ParadoxNotion", "ParadoxNotion.Player.csproj", "{bf79b403-c27e-8b6f-c989-840c09bcf65f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Flow", "Unity.VisualScripting.Flow.Player.csproj", "{2abe80e0-9383-9621-569d-cded29b2e0d9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Runtime", "Unity.RenderPipelines.Universal.Runtime.Player.csproj", "{40e4dc91-1eef-62d2-3af4-2dc6d70e65f8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.Runtime", "Unity.RenderPipelines.Core.Runtime.Player.csproj", "{7622281f-9ce8-e97a-847c-2a4f53d14c44}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Mathematics", "Unity.Mathematics.Player.csproj", "{500ad7e6-b18d-dff0-dcfc-7f5faabf2978}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.FSM", "Animancer.FSM.Player.csproj", "{a5124360-6af6-d087-0976-78da691e0ca9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.IK.Runtime", "Unity.2D.IK.Runtime.Player.csproj", "{0de92c9b-1194-1de2-850e-d3808cafbd8a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrashSight.Runtime", "CrashSight.Runtime.Player.csproj", "{b3f4db19-dda6-32b9-ffe0-47f4ed2b9404}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEngine.TestRunner", "UnityEngine.TestRunner.Player.csproj", "{b66601b1-2509-7c66-d9f0-20fae957e91f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.Core", "Unity.VisualScripting.Core.Player.csproj", "{aff74e63-4d65-6b53-6bff-07f5db8ce7b8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "com.rlabrecque.steamworks.net", "com.rlabrecque.steamworks.net.Player.csproj", "{b5067ade-ddfb-2e91-e4e5-e4ff00685c0c}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst", "Unity.Burst.Player.csproj", "{08122e21-1203-a254-ce7b-5af4cad3fa58}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections", "Unity.Collections.Player.csproj", "{439307fe-edb0-ca46-b09b-ef3cc9ebeff7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YooAsset", "YooAsset.Player.csproj", "{2f001118-66fa-afe0-ede8-3a5f88c1588e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OPS.Obfuscator", "OPS.Obfuscator.Player.csproj", "{5c69dac1-06f0-1eb6-354f-eac4236a89b6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.SpriteShape.Runtime", "Unity.2D.SpriteShape.Runtime.Player.csproj", "{54631365-9fbc-94e3-7f3b-93e34ca45e12}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer", "Animancer.Player.csproj", "{09c97dc4-b115-3e2f-b786-fc8946cfbe43}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MemoryPack", "MemoryPack.Player.csproj", "{d42cb690-61fa-72a1-bdea-1e4564afed7e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Animancer.Examples", "Animancer.Examples.Player.csproj", "{6fe3f612-9e3a-e0f6-e7cd-29378ba66746}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEngine.UI", "UnityEngine.UI.Player.csproj", "{67655f18-9b1c-34a3-64d0-0f7247c6b418}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipeline.Universal.ShaderLibrary", "Unity.RenderPipeline.Universal.ShaderLibrary.Player.csproj", "{684284b7-63ff-ea85-dbf3-3f9ffb4e0583}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.VisualScripting.State", "Unity.VisualScripting.State.Player.csproj", "{3b0ba7c0-94fc-a849-d520-77608a532675}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro", "Unity.TextMeshPro.Player.csproj", "{16659ea9-de73-6ac7-9407-23f1bd0fbfdb}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Animation.Runtime", "Unity.2D.Animation.Runtime.Player.csproj", "{06f4a22c-1ce8-8e49-c019-d042efc002e2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.InternalAPIEngineBridge.001", "Unity.InternalAPIEngineBridge.001.Player.csproj", "{44c31b53-8c0b-bed2-f8c0-2f315fbec652}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.PixelPerfect", "Unity.2D.PixelPerfect.Player.csproj", "{e3ed6442-b1bb-7b18-c12d-1e3028ff7519}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Common.Runtime", "Unity.2D.Common.Runtime.Player.csproj", "{7476bdb1-57c7-f61c-3137-1db5d2422fb1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TH1.AOT", "TH1.AOT.Player.csproj", "{8b68eb68-ef29-38ac-fb66-3cb49bc01cfa}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Extras", "Unity.2D.Tilemap.Extras.Player.csproj", "{5a0bcbde-ee60-8b8d-525a-b92d1519e679}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HybridCLR.Runtime", "HybridCLR.Runtime.Player.csproj", "{ed061814-5f09-f717-7483-c2f0cc53f3c8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ScriptableBuildPipeline", "Unity.ScriptableBuildPipeline.Player.csproj", "{1c107de3-017c-5441-0f11-ea5926db0787}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary", "Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.Player.csproj", "{2f6423df-6b42-08a8-8aa5-06e10b4f2895}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.ShaderLibrary", "Unity.RenderPipelines.Core.ShaderLibrary.Player.csproj", "{bf3a9bca-830b-3997-a9d8-468533514cd6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Shaders", "Unity.RenderPipelines.Universal.Shaders.Player.csproj", "{9ca57443-4f9d-e6c2-b28d-d16608900d22}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp.csproj", "{03938ccd-4b40-8dfb-6b9b-21988d5cac0a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Mathematics.Tests", "Unity.Mathematics.Tests.csproj", "{16b76928-80d7-3525-3f65-abb1479dad96}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Aseprite.EditorTests", "Unity.2D.Aseprite.EditorTests.csproj", "{dbdb2ec4-fe98-a4fd-8fc5-06a51a0a6416}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.Editor.Tests", "Unity.RenderPipelines.Core.Editor.Tests.csproj", "{38402df3-1d8b-43e6-7d70-21fc7b7c40d4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ScriptableBuildPipeline.Editor.Tests", "Unity.ScriptableBuildPipeline.Editor.Tests.csproj", "{b7a0ed36-7150-0913-0b69-44af361ffde2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Sprite.Package.EditorTests", "Unity.2D.Sprite.Package.EditorTests.csproj", "{0e8dfda0-8601-e29d-2b1c-83b595ba0869}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst.Tests.UnitTests", "Unity.Burst.Tests.UnitTests.csproj", "{e445d710-a09b-14ba-8cf2-1d10ec1b763d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.PixelPerfect.EditorTests", "Unity.2D.PixelPerfect.EditorTests.csproj", "{3413af9c-cd48-3fde-6c6e-8ceb4b996c12}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.SpriteShape.EditorTests", "Unity.2D.SpriteShape.EditorTests.csproj", "{327836d4-652e-2176-cfc2-1492dd9a9cdc}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Common.EditorTests", "Unity.2D.Common.EditorTests.csproj", "{e6b7913c-1aa7-2b9a-9a48-90b67d682a4f}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Searcher.EditorTests", "Unity.Searcher.EditorTests.csproj", "{1502e028-abaf-bbf1-f733-589d09df6062}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Burst.Editor.Tests", "Unity.Burst.Editor.Tests.csproj", "{55fe5d26-e58b-e859-0ea5-3f08916d3b82}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro.Editor.Tests", "Unity.TextMeshPro.Editor.Tests.csproj", "{66f8153e-d264-e3fc-c0c8-4649b6572425}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocCodeExamples", "DocCodeExamples.csproj", "{7df720ca-a16d-54d1-c4c1-2a843dc29603}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Editor.Tests", "Unity.RenderPipelines.Universal.Editor.Tests.csproj", "{a2281099-c63c-475d-742e-779f2008bb94}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections.Tests", "Unity.Collections.Tests.csproj", "{fd457172-8b21-66d9-f1e9-d5295c3b818a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Psdimporter.EditorTests", "Unity.2D.Psdimporter.EditorTests.csproj", "{b8429819-51de-7a59-1524-9b949bd7e25b}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEngine.UI.Tests", "UnityEngine.UI.Tests.csproj", "{219c6149-e7e9-29e7-65dd-062bacb5802d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Collections.Tests.Playmode", "Unity.Collections.Tests.Playmode.csproj", "{4a03ecce-a49b-f7a6-281f-bd8e40f5cb10}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Animation.EditorTests", "Unity.2D.Animation.EditorTests.csproj", "{79419771-2283-4d66-d86e-62d8bbc6371b}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp-firstpass", "Assembly-CSharp-firstpass.csproj", "{09b46226-3263-561e-d797-c9025c53bdd6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.TextMeshPro.Tests", "Unity.TextMeshPro.Tests.csproj", "{9a02ff8e-ade4-aeb7-6b24-6dc12d676bb2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SeparateAssembly", "SeparateAssembly.csproj", "{f53401de-a16c-1712-682d-7274eb2e3449}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityEditor.UI.EditorTests", "UnityEditor.UI.EditorTests.csproj", "{0c845559-1492-f01d-a7ab-a330a661c34d}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Package.EditorTests", "Unity.2D.Tilemap.Package.EditorTests.csproj", "{ff473c2b-23e7-89df-f52b-7b1f14c6b352}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Universal.Runtime.Tests", "Unity.RenderPipelines.Universal.Runtime.Tests.csproj", "{6fbfa052-2539-09d5-4271-1e302876cc3b}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ScriptableBuildPipeline.Tests", "Unity.ScriptableBuildPipeline.Tests.csproj", "{043748fa-6551-69f0-1e1c-94a01e5f3f5e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.2D.Tilemap.Extras.Placeholder.EditorTests", "Unity.2D.Tilemap.Extras.Placeholder.EditorTests.csproj", "{6ae7232c-7862-11a1-34e3-d37adc68ddda}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OverloadedFunctionPointers", "OverloadedFunctionPointers.csproj", "{1118b8e7-4f68-f171-aa7b-6f6ac448b26c}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.RenderPipelines.Core.Runtime.Tests", "Unity.RenderPipelines.Core.Runtime.Tests.csproj", "{256b7ddc-313a-d557-ea2e-c5361c77f2f3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ShaderGraph.Editor.Tests", "Unity.ShaderGraph.Editor.Tests.csproj", "{d7acd1aa-3ff5-c452-6c4c-169b58615d26}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{504AB00F-3D3F-909B-15CB-381039DF1EC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{504AB00F-3D3F-909B-15CB-381039DF1EC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{504AB00F-3D3F-909B-15CB-381039DF1EC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{504AB00F-3D3F-909B-15CB-381039DF1EC2}.Release|Any CPU.Build.0 = Release|Any CPU
{73D282A7-CB2D-EF29-AED6-2182E01638A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73D282A7-CB2D-EF29-AED6-2182E01638A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73D282A7-CB2D-EF29-AED6-2182E01638A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73D282A7-CB2D-EF29-AED6-2182E01638A7}.Release|Any CPU.Build.0 = Release|Any CPU
{6E3594B9-F350-38E8-E051-007A051E45C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E3594B9-F350-38E8-E051-007A051E45C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E3594B9-F350-38E8-E051-007A051E45C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E3594B9-F350-38E8-E051-007A051E45C9}.Release|Any CPU.Build.0 = Release|Any CPU
{B6514B77-01B9-7EB9-D593-35721140FEA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6514B77-01B9-7EB9-D593-35721140FEA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B6514B77-01B9-7EB9-D593-35721140FEA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6514B77-01B9-7EB9-D593-35721140FEA6}.Release|Any CPU.Build.0 = Release|Any CPU
{D79D413D-5E6A-92EE-DA4A-BE15F62A50F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D79D413D-5E6A-92EE-DA4A-BE15F62A50F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D79D413D-5E6A-92EE-DA4A-BE15F62A50F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D79D413D-5E6A-92EE-DA4A-BE15F62A50F3}.Release|Any CPU.Build.0 = Release|Any CPU
{45C54A48-C87A-0FED-7146-E9C97C82AFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{45C54A48-C87A-0FED-7146-E9C97C82AFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{45C54A48-C87A-0FED-7146-E9C97C82AFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{45C54A48-C87A-0FED-7146-E9C97C82AFBD}.Release|Any CPU.Build.0 = Release|Any CPU
{47654AF1-44B2-0F19-E6E7-C324B11BCD21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47654AF1-44B2-0F19-E6E7-C324B11BCD21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47654AF1-44B2-0F19-E6E7-C324B11BCD21}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47654AF1-44B2-0F19-E6E7-C324B11BCD21}.Release|Any CPU.Build.0 = Release|Any CPU
{C47EB37A-BDEF-7F7F-DA88-EFA56365689D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C47EB37A-BDEF-7F7F-DA88-EFA56365689D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C47EB37A-BDEF-7F7F-DA88-EFA56365689D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C47EB37A-BDEF-7F7F-DA88-EFA56365689D}.Release|Any CPU.Build.0 = Release|Any CPU
{F6659E15-63D3-6D1A-EC57-6DB30DA1B98F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6659E15-63D3-6D1A-EC57-6DB30DA1B98F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6659E15-63D3-6D1A-EC57-6DB30DA1B98F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6659E15-63D3-6D1A-EC57-6DB30DA1B98F}.Release|Any CPU.Build.0 = Release|Any CPU
{76FC8738-B016-5BE2-D964-8C25CC3023A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76FC8738-B016-5BE2-D964-8C25CC3023A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76FC8738-B016-5BE2-D964-8C25CC3023A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76FC8738-B016-5BE2-D964-8C25CC3023A6}.Release|Any CPU.Build.0 = Release|Any CPU
{6311E6C6-0A20-383B-320B-694068DE37A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6311E6C6-0A20-383B-320B-694068DE37A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6311E6C6-0A20-383B-320B-694068DE37A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6311E6C6-0A20-383B-320B-694068DE37A5}.Release|Any CPU.Build.0 = Release|Any CPU
{98A6CD40-90BA-D09A-0F2A-AB7388F81ACC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{98A6CD40-90BA-D09A-0F2A-AB7388F81ACC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{98A6CD40-90BA-D09A-0F2A-AB7388F81ACC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{98A6CD40-90BA-D09A-0F2A-AB7388F81ACC}.Release|Any CPU.Build.0 = Release|Any CPU
{E2888E45-5D33-D4F1-4A1D-FEB18C3D64F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2888E45-5D33-D4F1-4A1D-FEB18C3D64F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2888E45-5D33-D4F1-4A1D-FEB18C3D64F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2888E45-5D33-D4F1-4A1D-FEB18C3D64F4}.Release|Any CPU.Build.0 = Release|Any CPU
{8CAB0A5B-C98C-617A-404C-A43277C19518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CAB0A5B-C98C-617A-404C-A43277C19518}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8CAB0A5B-C98C-617A-404C-A43277C19518}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8CAB0A5B-C98C-617A-404C-A43277C19518}.Release|Any CPU.Build.0 = Release|Any CPU
{EF8EBA37-0FEB-1015-410B-B4DEF69F9059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF8EBA37-0FEB-1015-410B-B4DEF69F9059}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF8EBA37-0FEB-1015-410B-B4DEF69F9059}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF8EBA37-0FEB-1015-410B-B4DEF69F9059}.Release|Any CPU.Build.0 = Release|Any CPU
{0fb04a50-3f3d-9b90-15cb-381039df1ec2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0fb04a50-3f3d-9b90-15cb-381039df1ec2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a782d273-2dcb-29ef-aed6-2182e01638a7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a782d273-2dcb-29ef-aed6-2182e01638a7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63b491c9-db19-5561-f15e-1c9ea0e3c9f0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63b491c9-db19-5561-f15e-1c9ea0e3c9f0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8fde539b-b477-26b5-0f99-c769ace654db}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8fde539b-b477-26b5-0f99-c769ace654db}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b994356e-50f3-e838-e051-007a051e45c9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b994356e-50f3-e838-e051-007a051e45c9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8e089428-a193-2945-36a1-b1f8757c4203}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8e089428-a193-2945-36a1-b1f8757c4203}.Debug|Any CPU.Build.0 = Debug|Any CPU
{f4cf6b1d-2314-3cd4-2919-94501cec3479}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{f4cf6b1d-2314-3cd4-2919-94501cec3479}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c678c602-0a4a-3246-5b09-5b414fc0d5de}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c678c602-0a4a-3246-5b09-5b414fc0d5de}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74e1c5c0-7c72-fa9f-cd43-b55bdef754da}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74e1c5c0-7c72-fa9f-cd43-b55bdef754da}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4f63daae-f5cd-01d3-9fa4-bd9bc22dc82d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4f63daae-f5cd-01d3-9fa4-bd9bc22dc82d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9f94db9c-5882-04d7-c896-b8fd99196c07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9f94db9c-5882-04d7-c896-b8fd99196c07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{bd9fa624-8739-25a7-eb0e-444640a78f6f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{bd9fa624-8739-25a7-eb0e-444640a78f6f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6830a9eb-1bb7-0aff-ad7d-1b12cc4ddd79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6830a9eb-1bb7-0aff-ad7d-1b12cc4ddd79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22e42b9f-676f-18ca-867c-a7d5d221a80f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22e42b9f-676f-18ca-867c-a7d5d221a80f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a8cca490-fd0e-ac44-1ae7-79afcaec1ad8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a8cca490-fd0e-ac44-1ae7-79afcaec1ad8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b5a5cde4-f776-a3cf-965b-7acd393a4ff9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b5a5cde4-f776-a3cf-965b-7acd393a4ff9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04a97c45-48c6-668f-ac36-dfbabb0f25fe}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04a97c45-48c6-668f-ac36-dfbabb0f25fe}.Debug|Any CPU.Build.0 = Debug|Any CPU
{774b51b6-b901-b97e-d593-35721140fea6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{774b51b6-b901-b97e-d593-35721140fea6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37815a88-829e-5a28-cd21-1a199012c457}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{37815a88-829e-5a28-cd21-1a199012c457}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a3cd058e-d81d-4658-0256-e8eec1407181}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a3cd058e-d81d-4658-0256-e8eec1407181}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b70f05c5-f9eb-67a6-6bfb-7a4c15a7c1d6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b70f05c5-f9eb-67a6-6bfb-7a4c15a7c1d6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3d419dd7-6a5e-ee92-da4a-be15f62a50f3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3d419dd7-6a5e-ee92-da4a-be15f62a50f3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{84d77f67-4616-0a38-4f03-16ab5e7769f7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{84d77f67-4616-0a38-4f03-16ab5e7769f7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e17e49b1-467b-9f35-a59e-d9aea156de57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e17e49b1-467b-9f35-a59e-d9aea156de57}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c35b59b3-2d1e-4660-22b4-60a82203cbc5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c35b59b3-2d1e-4660-22b4-60a82203cbc5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{651b9223-1d49-3552-fade-892e6e843c3f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{651b9223-1d49-3552-fade-892e6e843c3f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3be7305c-66e6-ffc8-a35a-0a6a8b4f4610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3be7305c-66e6-ffc8-a35a-0a6a8b4f4610}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ed943ac8-3d8f-7c17-157d-c4c31cbc811c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ed943ac8-3d8f-7c17-157d-c4c31cbc811c}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3b86216b-72df-a555-5f96-65b39a83c610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3b86216b-72df-a555-5f96-65b39a83c610}.Debug|Any CPU.Build.0 = Debug|Any CPU
{484ac545-7ac8-ed0f-7146-e9c97c82afbd}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{484ac545-7ac8-ed0f-7146-e9c97c82afbd}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40b987c2-94ea-9ed4-6f63-abc9b006d1e6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40b987c2-94ea-9ed4-6f63-abc9b006d1e6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c1108643-0a9f-f78a-fcbe-c1d5d3670ee2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c1108643-0a9f-f78a-fcbe-c1d5d3670ee2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ae84323-8279-2bed-3a96-b03194de76f4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ae84323-8279-2bed-3a96-b03194de76f4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2291f2b0-92e0-7e70-af29-9f195372dc03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2291f2b0-92e0-7e70-af29-9f195372dc03}.Debug|Any CPU.Build.0 = Debug|Any CPU
{491ac21f-d830-bfd7-e626-15eabf2df6a9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{491ac21f-d830-bfd7-e626-15eabf2df6a9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9966ea08-1871-7d07-45c9-8be7d88e754e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9966ea08-1871-7d07-45c9-8be7d88e754e}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e4fe47e6-c383-9f4e-f5a4-354867d9fe91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e4fe47e6-c383-9f4e-f5a4-354867d9fe91}.Debug|Any CPU.Build.0 = Debug|Any CPU
{f14a6547-b244-190f-e6e7-c324b11bcd21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{f14a6547-b244-190f-e6e7-c324b11bcd21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{969b6393-7326-9cc5-ac5f-d252d24b1a34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{969b6393-7326-9cc5-ac5f-d252d24b1a34}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2fd67010-5958-e159-3cc0-c54cbefa2290}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2fd67010-5958-e159-3cc0-c54cbefa2290}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c035505f-2403-19ee-1749-5ecd4746f976}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c035505f-2403-19ee-1749-5ecd4746f976}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ab37ec4-efbd-7f7f-da88-efa56365689d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ab37ec4-efbd-7f7f-da88-efa56365689d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1f33cf80-07a3-b2f9-b7bb-11acc1f175d3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1f33cf80-07a3-b2f9-b7bb-11acc1f175d3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{35b7e023-97a7-dbdc-b926-161520c4dc89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{35b7e023-97a7-dbdc-b926-161520c4dc89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5655cc19-e755-9069-b166-1343c10b837d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5655cc19-e755-9069-b166-1343c10b837d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{652001f9-9c1b-a374-8d10-86cd1b4d5f3f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{652001f9-9c1b-a374-8d10-86cd1b4d5f3f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{159e65f6-d363-1a6d-ec57-6db30da1b98f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{159e65f6-d363-1a6d-ec57-6db30da1b98f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c6244ad6-8b5a-a312-8d20-3509617ae294}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c6244ad6-8b5a-a312-8d20-3509617ae294}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0703fade-f85f-e284-3526-ccf1bb017b33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0703fade-f85f-e284-3526-ccf1bb017b33}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3887fc76-16b0-e25b-d964-8c25cc3023a6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3887fc76-16b0-e25b-d964-8c25cc3023a6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{979dfe98-9199-94e5-7d3c-a2abc20e4793}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{979dfe98-9199-94e5-7d3c-a2abc20e4793}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20ff02be-4ec6-8c98-c6f9-b038409c414d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20ff02be-4ec6-8c98-c6f9-b038409c414d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{fbdf8803-6ad7-83ad-0fe9-28598ca1a00f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{fbdf8803-6ad7-83ad-0fe9-28598ca1a00f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4337c050-cc3a-134b-6dfa-c9e140f3f61a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4337c050-cc3a-134b-6dfa-c9e140f3f61a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{dfd7019c-bb86-3498-4973-5d336b1f52ef}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{dfd7019c-bb86-3498-4973-5d336b1f52ef}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6858fc7a-0902-f5e2-5f0c-b3af5d8c14d7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6858fc7a-0902-f5e2-5f0c-b3af5d8c14d7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{966594db-397c-5af1-f590-00ceeab21cb6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{966594db-397c-5af1-f590-00ceeab21cb6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{db89644f-431d-7769-779c-05896c34395b}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{db89644f-431d-7769-779c-05896c34395b}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2330184f-e44c-9b47-a0ec-374ebe1daf06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2330184f-e44c-9b47-a0ec-374ebe1daf06}.Debug|Any CPU.Build.0 = Debug|Any CPU
{c6e61163-200a-3b38-320b-694068de37a5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{c6e61163-200a-3b38-320b-694068de37a5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{90dc1aaf-d7c0-dd6a-a6ed-aa77e7f1a486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{90dc1aaf-d7c0-dd6a-a6ed-aa77e7f1a486}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e74d0544-fb3f-a89c-c745-9769758465d8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e74d0544-fb3f-a89c-c745-9769758465d8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8f239c03-0b13-b5a7-17e4-12e9342f07e0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8f239c03-0b13-b5a7-17e4-12e9342f07e0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40cda698-ba90-9ad0-0f2a-ab7388f81acc}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40cda698-ba90-9ad0-0f2a-ab7388f81acc}.Debug|Any CPU.Build.0 = Debug|Any CPU
{945e3271-902a-848a-4836-a63ac22f6bff}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{945e3271-902a-848a-4836-a63ac22f6bff}.Debug|Any CPU.Build.0 = Debug|Any CPU
{085a5f8a-e0c1-924e-86ef-8d1110206613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{085a5f8a-e0c1-924e-86ef-8d1110206613}.Debug|Any CPU.Build.0 = Debug|Any CPU
{954606ad-4e98-1746-2d42-97503edb8f42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{954606ad-4e98-1746-2d42-97503edb8f42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a8309bda-81a0-0e11-d6b4-bfaf6da6450d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a8309bda-81a0-0e11-d6b4-bfaf6da6450d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{098d18e4-6ae0-86c7-8616-1c17d236ea89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{098d18e4-6ae0-86c7-8616-1c17d236ea89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{458e88e2-335d-f1d4-4a1d-feb18c3d64f4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{458e88e2-335d-f1d4-4a1d-feb18c3d64f4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b222b8e9-4c55-4797-e65b-2cfa5626b69a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b222b8e9-4c55-4797-e65b-2cfa5626b69a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{95fe389c-81b1-c9f7-0230-926077cb0926}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{95fe389c-81b1-c9f7-0230-926077cb0926}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96f43981-0b0f-178f-6a92-f4488c9b8181}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96f43981-0b0f-178f-6a92-f4488c9b8181}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e379cc4a-07ca-e3e7-8188-50d8e1851b65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e379cc4a-07ca-e3e7-8188-50d8e1851b65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58cf9cb8-9dba-8f43-f2f8-e923457c1691}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58cf9cb8-9dba-8f43-f2f8-e923457c1691}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5b0aab8c-8cc9-7a61-404c-a43277c19518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5b0aab8c-8cc9-7a61-404c-a43277c19518}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9df118af-f9b8-47b5-c242-63718d7ed119}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9df118af-f9b8-47b5-c242-63718d7ed119}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2b300fef-22e5-8e33-299d-e81b8a400794}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2b300fef-22e5-8e33-299d-e81b8a400794}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7fdf0708-d79d-15b8-5417-a497c97d933b}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7fdf0708-d79d-15b8-5417-a497c97d933b}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37ba8eef-eb0f-1510-410b-b4def69f9059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{37ba8eef-eb0f-1510-410b-b4def69f9059}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5a8d4482-bf60-ff37-23a9-6008d09e865c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5a8d4482-bf60-ff37-23a9-6008d09e865c}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4bef6551-7042-78d6-30a6-28520a4ec193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4bef6551-7042-78d6-30a6-28520a4ec193}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86e9e3b2-607d-95d0-f253-3311097e2c40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86e9e3b2-607d-95d0-f253-3311097e2c40}.Debug|Any CPU.Build.0 = Debug|Any CPU
{12a11b8b-7f02-62f3-33ea-1dd938c79e71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12a11b8b-7f02-62f3-33ea-1dd938c79e71}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2f530e06-cca7-161a-01b9-0629a5a15367}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2f530e06-cca7-161a-01b9-0629a5a15367}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ec74174d-c1b7-a7a0-0276-f28f73c7038a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ec74174d-c1b7-a7a0-0276-f28f73c7038a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{693e2cff-cc5b-352a-fef1-ace2e1eff2ab}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{693e2cff-cc5b-352a-fef1-ace2e1eff2ab}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9413d5c4-9215-77d3-3dd8-f6cfaa3fef5e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9413d5c4-9215-77d3-3dd8-f6cfaa3fef5e}.Debug|Any CPU.Build.0 = Debug|Any CPU
{bf79b403-c27e-8b6f-c989-840c09bcf65f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{bf79b403-c27e-8b6f-c989-840c09bcf65f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2abe80e0-9383-9621-569d-cded29b2e0d9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2abe80e0-9383-9621-569d-cded29b2e0d9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40e4dc91-1eef-62d2-3af4-2dc6d70e65f8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40e4dc91-1eef-62d2-3af4-2dc6d70e65f8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7622281f-9ce8-e97a-847c-2a4f53d14c44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7622281f-9ce8-e97a-847c-2a4f53d14c44}.Debug|Any CPU.Build.0 = Debug|Any CPU
{500ad7e6-b18d-dff0-dcfc-7f5faabf2978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{500ad7e6-b18d-dff0-dcfc-7f5faabf2978}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a5124360-6af6-d087-0976-78da691e0ca9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a5124360-6af6-d087-0976-78da691e0ca9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0de92c9b-1194-1de2-850e-d3808cafbd8a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0de92c9b-1194-1de2-850e-d3808cafbd8a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b3f4db19-dda6-32b9-ffe0-47f4ed2b9404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b3f4db19-dda6-32b9-ffe0-47f4ed2b9404}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b66601b1-2509-7c66-d9f0-20fae957e91f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b66601b1-2509-7c66-d9f0-20fae957e91f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{aff74e63-4d65-6b53-6bff-07f5db8ce7b8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{aff74e63-4d65-6b53-6bff-07f5db8ce7b8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b5067ade-ddfb-2e91-e4e5-e4ff00685c0c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b5067ade-ddfb-2e91-e4e5-e4ff00685c0c}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08122e21-1203-a254-ce7b-5af4cad3fa58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08122e21-1203-a254-ce7b-5af4cad3fa58}.Debug|Any CPU.Build.0 = Debug|Any CPU
{439307fe-edb0-ca46-b09b-ef3cc9ebeff7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{439307fe-edb0-ca46-b09b-ef3cc9ebeff7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2f001118-66fa-afe0-ede8-3a5f88c1588e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2f001118-66fa-afe0-ede8-3a5f88c1588e}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5c69dac1-06f0-1eb6-354f-eac4236a89b6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5c69dac1-06f0-1eb6-354f-eac4236a89b6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{54631365-9fbc-94e3-7f3b-93e34ca45e12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{54631365-9fbc-94e3-7f3b-93e34ca45e12}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09c97dc4-b115-3e2f-b786-fc8946cfbe43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{09c97dc4-b115-3e2f-b786-fc8946cfbe43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{d42cb690-61fa-72a1-bdea-1e4564afed7e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{d42cb690-61fa-72a1-bdea-1e4564afed7e}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6fe3f612-9e3a-e0f6-e7cd-29378ba66746}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6fe3f612-9e3a-e0f6-e7cd-29378ba66746}.Debug|Any CPU.Build.0 = Debug|Any CPU
{67655f18-9b1c-34a3-64d0-0f7247c6b418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{67655f18-9b1c-34a3-64d0-0f7247c6b418}.Debug|Any CPU.Build.0 = Debug|Any CPU
{684284b7-63ff-ea85-dbf3-3f9ffb4e0583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{684284b7-63ff-ea85-dbf3-3f9ffb4e0583}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3b0ba7c0-94fc-a849-d520-77608a532675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3b0ba7c0-94fc-a849-d520-77608a532675}.Debug|Any CPU.Build.0 = Debug|Any CPU
{16659ea9-de73-6ac7-9407-23f1bd0fbfdb}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{16659ea9-de73-6ac7-9407-23f1bd0fbfdb}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06f4a22c-1ce8-8e49-c019-d042efc002e2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06f4a22c-1ce8-8e49-c019-d042efc002e2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{44c31b53-8c0b-bed2-f8c0-2f315fbec652}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{44c31b53-8c0b-bed2-f8c0-2f315fbec652}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e3ed6442-b1bb-7b18-c12d-1e3028ff7519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e3ed6442-b1bb-7b18-c12d-1e3028ff7519}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7476bdb1-57c7-f61c-3137-1db5d2422fb1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7476bdb1-57c7-f61c-3137-1db5d2422fb1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8b68eb68-ef29-38ac-fb66-3cb49bc01cfa}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8b68eb68-ef29-38ac-fb66-3cb49bc01cfa}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5a0bcbde-ee60-8b8d-525a-b92d1519e679}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5a0bcbde-ee60-8b8d-525a-b92d1519e679}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ed061814-5f09-f717-7483-c2f0cc53f3c8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ed061814-5f09-f717-7483-c2f0cc53f3c8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1c107de3-017c-5441-0f11-ea5926db0787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1c107de3-017c-5441-0f11-ea5926db0787}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2f6423df-6b42-08a8-8aa5-06e10b4f2895}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2f6423df-6b42-08a8-8aa5-06e10b4f2895}.Debug|Any CPU.Build.0 = Debug|Any CPU
{bf3a9bca-830b-3997-a9d8-468533514cd6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{bf3a9bca-830b-3997-a9d8-468533514cd6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9ca57443-4f9d-e6c2-b28d-d16608900d22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9ca57443-4f9d-e6c2-b28d-d16608900d22}.Debug|Any CPU.Build.0 = Debug|Any CPU
{03938ccd-4b40-8dfb-6b9b-21988d5cac0a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{03938ccd-4b40-8dfb-6b9b-21988d5cac0a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{16b76928-80d7-3525-3f65-abb1479dad96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{16b76928-80d7-3525-3f65-abb1479dad96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{dbdb2ec4-fe98-a4fd-8fc5-06a51a0a6416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{dbdb2ec4-fe98-a4fd-8fc5-06a51a0a6416}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38402df3-1d8b-43e6-7d70-21fc7b7c40d4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38402df3-1d8b-43e6-7d70-21fc7b7c40d4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b7a0ed36-7150-0913-0b69-44af361ffde2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b7a0ed36-7150-0913-0b69-44af361ffde2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0e8dfda0-8601-e29d-2b1c-83b595ba0869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0e8dfda0-8601-e29d-2b1c-83b595ba0869}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e445d710-a09b-14ba-8cf2-1d10ec1b763d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e445d710-a09b-14ba-8cf2-1d10ec1b763d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3413af9c-cd48-3fde-6c6e-8ceb4b996c12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3413af9c-cd48-3fde-6c6e-8ceb4b996c12}.Debug|Any CPU.Build.0 = Debug|Any CPU
{327836d4-652e-2176-cfc2-1492dd9a9cdc}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{327836d4-652e-2176-cfc2-1492dd9a9cdc}.Debug|Any CPU.Build.0 = Debug|Any CPU
{e6b7913c-1aa7-2b9a-9a48-90b67d682a4f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{e6b7913c-1aa7-2b9a-9a48-90b67d682a4f}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1502e028-abaf-bbf1-f733-589d09df6062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1502e028-abaf-bbf1-f733-589d09df6062}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55fe5d26-e58b-e859-0ea5-3f08916d3b82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55fe5d26-e58b-e859-0ea5-3f08916d3b82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66f8153e-d264-e3fc-c0c8-4649b6572425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66f8153e-d264-e3fc-c0c8-4649b6572425}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7df720ca-a16d-54d1-c4c1-2a843dc29603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7df720ca-a16d-54d1-c4c1-2a843dc29603}.Debug|Any CPU.Build.0 = Debug|Any CPU
{a2281099-c63c-475d-742e-779f2008bb94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{a2281099-c63c-475d-742e-779f2008bb94}.Debug|Any CPU.Build.0 = Debug|Any CPU
{fd457172-8b21-66d9-f1e9-d5295c3b818a}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{fd457172-8b21-66d9-f1e9-d5295c3b818a}.Debug|Any CPU.Build.0 = Debug|Any CPU
{b8429819-51de-7a59-1524-9b949bd7e25b}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{b8429819-51de-7a59-1524-9b949bd7e25b}.Debug|Any CPU.Build.0 = Debug|Any CPU
{219c6149-e7e9-29e7-65dd-062bacb5802d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{219c6149-e7e9-29e7-65dd-062bacb5802d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4a03ecce-a49b-f7a6-281f-bd8e40f5cb10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4a03ecce-a49b-f7a6-281f-bd8e40f5cb10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79419771-2283-4d66-d86e-62d8bbc6371b}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79419771-2283-4d66-d86e-62d8bbc6371b}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09b46226-3263-561e-d797-c9025c53bdd6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{09b46226-3263-561e-d797-c9025c53bdd6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9a02ff8e-ade4-aeb7-6b24-6dc12d676bb2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9a02ff8e-ade4-aeb7-6b24-6dc12d676bb2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{f53401de-a16c-1712-682d-7274eb2e3449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{f53401de-a16c-1712-682d-7274eb2e3449}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0c845559-1492-f01d-a7ab-a330a661c34d}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0c845559-1492-f01d-a7ab-a330a661c34d}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ff473c2b-23e7-89df-f52b-7b1f14c6b352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ff473c2b-23e7-89df-f52b-7b1f14c6b352}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6fbfa052-2539-09d5-4271-1e302876cc3b}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6fbfa052-2539-09d5-4271-1e302876cc3b}.Debug|Any CPU.Build.0 = Debug|Any CPU
{043748fa-6551-69f0-1e1c-94a01e5f3f5e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{043748fa-6551-69f0-1e1c-94a01e5f3f5e}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6ae7232c-7862-11a1-34e3-d37adc68ddda}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6ae7232c-7862-11a1-34e3-d37adc68ddda}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1118b8e7-4f68-f171-aa7b-6f6ac448b26c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1118b8e7-4f68-f171-aa7b-6f6ac448b26c}.Debug|Any CPU.Build.0 = Debug|Any CPU
{256b7ddc-313a-d557-ea2e-c5361c77f2f3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{256b7ddc-313a-d557-ea2e-c5361c77f2f3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{d7acd1aa-3ff5-c452-6c4c-169b58615d26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{d7acd1aa-3ff5-c452-6c4c-169b58615d26}.Debug|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE