From d6d00b107d881a136bcfe87b61776f0738156487 Mon Sep 17 00:00:00 2001 From: IcePop Date: Fri, 7 Aug 2026 21:50:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=80=A7=E6=A0=BC=E7=BB=B4=E5=BA=A6?= =?UTF-8?q?=E5=9B=BE=E6=8E=A5=E5=85=A5=E7=9C=9F=E5=AE=9E=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E7=9F=A9=E9=98=B5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 宠物 prefab 绑定 PersonalityMatrixSO(Angel/Devil),初始 7 维性格有真实来源 - PersonalityEvolutionBootstrap 启动时扫描已激活宠物补种初始矩阵,修复编辑器 Play 流程 Boot 晚于宠物场景加载导致 PetControllerInitializedEvent 被错过 - PersonalityEvolutionService 存档版本迁移:忽略 v1(0 基数累计的脏数据), 由真实初始矩阵为基数重建;CaptureJson 升到 v2 --- Assets/_Project/Prefabs/Pet/Pet_Angel.prefab | 2 +- Assets/_Project/Prefabs/Pet/Pet_Devil.prefab | 2 +- .../IPersonalityEvolutionService.cs | 7 +++++ .../PersonalityEvolutionBootstrap.cs | 26 +++++++++++++++++++ .../PersonalityEvolutionService.cs | 22 +++++++++++++++- .../Scripts/Modules/Pet/PetController.cs | 3 +++ 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/Assets/_Project/Prefabs/Pet/Pet_Angel.prefab b/Assets/_Project/Prefabs/Pet/Pet_Angel.prefab index dd436ed3..e83b95f0 100644 --- a/Assets/_Project/Prefabs/Pet/Pet_Angel.prefab +++ b/Assets/_Project/Prefabs/Pet/Pet_Angel.prefab @@ -432,7 +432,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _config: {fileID: 0} - _personality: {fileID: 0} + _personality: {fileID: 11400000, guid: 1ecede15733b42244a1305f7645463bd, type: 2} _movementController: {fileID: 9100000, guid: ba46f117e79c2504888c585f53d1ecf8, type: 2} _sideFramesFaceLeft: 1 _movementBounds: {fileID: 0} diff --git a/Assets/_Project/Prefabs/Pet/Pet_Devil.prefab b/Assets/_Project/Prefabs/Pet/Pet_Devil.prefab index a127086e..9758ce44 100644 --- a/Assets/_Project/Prefabs/Pet/Pet_Devil.prefab +++ b/Assets/_Project/Prefabs/Pet/Pet_Devil.prefab @@ -287,7 +287,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _config: {fileID: 0} - _personality: {fileID: 0} + _personality: {fileID: 11400000, guid: 844d776109915fc4092eeee43b3d825a, type: 2} _movementController: {fileID: 9100000, guid: 49dff8841cae4cc7ae3247d5c623213b, type: 2} _sideFramesFaceLeft: 1 _movementBounds: {fileID: 0} diff --git a/Assets/_Project/Scripts/Modules/Pet/Personality/IPersonalityEvolutionService.cs b/Assets/_Project/Scripts/Modules/Pet/Personality/IPersonalityEvolutionService.cs index 98a648ce..b68ea6f7 100644 --- a/Assets/_Project/Scripts/Modules/Pet/Personality/IPersonalityEvolutionService.cs +++ b/Assets/_Project/Scripts/Modules/Pet/Personality/IPersonalityEvolutionService.cs @@ -22,5 +22,12 @@ public interface IPersonalityEvolutionService /// 重复调用会覆盖。 /// void SetInitialMatrix(PetId petId, PersonalityVector initial); + + /// + /// 补种初始值:仅当该宠物尚无任何写入(含存档恢复)时才设置,否则忽略。 + /// 用于编辑器 Play 流程中 Boot 场景晚于宠物场景加载、初始化事件被错过的兜底。 + /// + /// true 表示本次实际写入了初始值;false 表示已存在(被跳过)。 + bool SeedInitialMatrixIfAbsent(PetId petId, PersonalityMatrixSO? matrix); } } diff --git a/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionBootstrap.cs b/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionBootstrap.cs index c08c8a67..e4e497eb 100644 --- a/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionBootstrap.cs +++ b/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionBootstrap.cs @@ -36,6 +36,32 @@ private void Awake() } Debug.Log("[PersonalityEvolutionBootstrap] PersonalityEvolutionService registered."); + SeedInitialMatricesFromActivePets(); + } + + /// + /// 启动时补种初始矩阵。编辑器 Play 流程里 Boot 场景可能晚于宠物所在场景加载 + /// (EditorBootSceneLoader 用 delayCall 附加加载 Boot),宠物 Awake 已发布的 + /// 会在服务订阅之前被错过,导致 + /// GetMatrix 一直返回全 0。此处扫描当前已激活的宠物补种;已通过正常事件路径 + /// 或存档恢复写入的值会被 ContainsKey 守卫跳过,不会覆盖。 + /// + private void SeedInitialMatricesFromActivePets() + { + if (_service == null) return; + + var controllers = FindObjectsOfType(); + int seeded = 0; + foreach (var controller in controllers) + { + if (controller.InitialPersonalityMatrix is not { } matrix) continue; + if (_service.SeedInitialMatrixIfAbsent(controller.PetId, matrix)) seeded++; + } + + if (seeded > 0) + { + Debug.Log($"[PersonalityEvolutionBootstrap] 启动补种初始性格: {seeded} 只宠物 (Boot 晚于宠物场景加载,事件已被错过)"); + } } private void OnDestroy() diff --git a/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionService.cs b/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionService.cs index 4732462f..9d8232f8 100644 --- a/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionService.cs +++ b/Assets/_Project/Scripts/Modules/Pet/Personality/PersonalityEvolutionService.cs @@ -58,6 +58,14 @@ public void SetInitialMatrix(PetId petId, PersonalityVector initial) MatrixChanged?.Invoke(petId, _matrices[petId]); } + public bool SeedInitialMatrixIfAbsent(PetId petId, PersonalityMatrixSO? matrix) + { + // 存档恢复若已写入则不覆盖(与 OnPetControllerInitialized 的守卫一致) + if (_matrices.ContainsKey(petId)) return false; + SetInitialMatrix(petId, PersonalityVector.FromSO(matrix)); + return true; + } + public void Dispose() { _tarotSub?.Dispose(); @@ -163,7 +171,7 @@ public string CaptureJson() { entries[i++] = new Entry { petId = (int)kv.Key, vector = kv.Value }; } - return JsonUtility.ToJson(new SavePayload { version = 1, entries = entries }); + return JsonUtility.ToJson(new SavePayload { version = 2, entries = entries }); } public bool RestoreJson(string json) @@ -172,6 +180,18 @@ public bool RestoreJson(string json) try { var payload = JsonUtility.FromJson(json); + + // v1 存档(初始矩阵接入修复前)是基于全 0 初始矩阵累计的:当时编辑器 + // Play 时序让 PetControllerInitializedEvent 被错过,初始矩阵从未写入, + // 演化增量全部叠在 0 基数上,恢复它会覆盖启动补种写入的真实初始矩阵 + // (雷达又变全 0 正多边形)。v1 一律忽略,由启动补种/宠物初始化事件 + // 以真实 PersonalityMatrixSO 为基数重新建立。 + if (payload.version < 2) + { + Debug.Log("[PersonalityEvolutionService] 忽略旧版性格存档(v1,0 基数累计,已由真实初始矩阵取代)"); + return true; + } + _matrices.Clear(); if (payload.entries != null) { diff --git a/Assets/_Project/Scripts/Modules/Pet/PetController.cs b/Assets/_Project/Scripts/Modules/Pet/PetController.cs index d7c2c5c3..cd04bc38 100644 --- a/Assets/_Project/Scripts/Modules/Pet/PetController.cs +++ b/Assets/_Project/Scripts/Modules/Pet/PetController.cs @@ -71,6 +71,9 @@ public sealed class PetController : MonoBehaviour public PetId PetId => _petId; + /// 初始性格矩阵(Inspector 绑定;可为空)。启动时由 PersonalityEvolutionBootstrap 补种读取。 + public PersonalityMatrixSO? InitialPersonalityMatrix => _personality; + private PetContext? _context; private StateMachine? _stateMachine; private StatTickService? _tickService;