fix: Round 55 递归硬中止、存档加载缓存刷新、好感度空值防护、选项穿透延迟、分支对话去重
- QuestSO.HasPrerequisiteCycle/HasBranchCycle: depth>32 改为 LogError+return true 硬中止,防止栈溢出 - DialogueSequenceSO.HasChoiceCycle: 新增 depth 参数及 >32 硬中止,同时更新递归调用传 depth+1 - IQuestEventSource: 新增 OnAfterSaveLoaded 事件接口,供存档加载后统一刷新缓存 - QuestManager.OnLoad: 末尾触发 OnAfterSaveLoaded,确保所有缓存组件收到通知 - QuestGiver: 订阅 OnAfterSaveLoaded 设 _cacheDirty,存档恢复后 NPC 交互提示始终最新 - QuestManager.ApplyAffinity: 新增 giverNpc null 显式 LogWarning、maxAffinity<0 LogError 防护 - DialogueManager: 选项穿透防护改为预创建 WaitForSeconds(0.15f),替代 yield return null - QuestManager.UnlockBranches: 多分支同时满足时只播首个有对话的分支,防止重复播放 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -58,7 +58,10 @@ namespace BaseGames.Quest
|
||||
_questManager = SL.GetOrDefault<IQuestManager>();
|
||||
_questEvents = _questManager as IQuestEventSource;
|
||||
if (_questEvents != null)
|
||||
{
|
||||
_questEvents.OnQuestStateChanged += HandleQuestStateChanged;
|
||||
_questEvents.OnAfterSaveLoaded += HandleAfterSaveLoaded;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
@@ -67,6 +70,7 @@ namespace BaseGames.Quest
|
||||
if (_questEvents != null)
|
||||
{
|
||||
_questEvents.OnQuestStateChanged -= HandleQuestStateChanged;
|
||||
_questEvents.OnAfterSaveLoaded -= HandleAfterSaveLoaded;
|
||||
_questEvents = null;
|
||||
}
|
||||
_questManager = null;
|
||||
@@ -80,6 +84,9 @@ namespace BaseGames.Quest
|
||||
if (q != null && q.questId == questId) { _cacheDirty = true; return; }
|
||||
}
|
||||
|
||||
// 存档加载完成后统一刷新缓存,确保 NPC 交互提示反映最新任务状态
|
||||
private void HandleAfterSaveLoaded() => _cacheDirty = true;
|
||||
|
||||
// 本地化提示词辅助:如 Key 在表中找不到(返回值等于 Key 自身),回退到内联默认文本
|
||||
private static string GetPrompt(string key, string fallback)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user