feat: Round 48 narrative systems improvements
- QuestSO: Add ValidateBranchCycles() DFS detection for branches[].nextQuest loop - QuestSO: Mark three legacy prerequisite fields with v2.0 removal warning in Tooltip - IQuestManager: Add QuestLockReason enum + QuestLockInfo struct (strongly-typed lock info) - IQuestManager: Add GetQuestLockInfo() method to interface; GetQuestLockReason() now delegates to it - IQuestEventSource: Add OnQuestStateChanged(questId, oldState, newState) unified event - QuestManager: Implement GetQuestLockInfo(); fire OnQuestStateChanged on all state transitions - DialogueManager: Add one-frame yield in HandleChoices before ShowChoices (skip-debounce fix) - DialogueManager: Increment _playbackId in ForceEnd() to invalidate residual choice callbacks - DialogueSequenceSO: Add UNITY_EDITOR debug log in TryGetActiveVariant on variant match - WorldStateRegistry: Add OnBatchStateChanged event + BatchMark() batch-write API - DialogueModule: List badge shows warning indicator for unconditional-shadowing variants - DialogueModule: BuildVariantsCard shows logic mode (AND/OR) alongside flag conditions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -10,7 +10,7 @@ namespace BaseGames.Editor.Modules
|
||||
/// <summary>
|
||||
/// DataHub 技能模块 —— 管理 FormSkillSO 资产。
|
||||
/// </summary>
|
||||
public class SkillModule : IDataModule
|
||||
public class SkillModule : IDataModule, IDataModuleOrdered
|
||||
{
|
||||
private const string Folder = "Assets/_Game/Data/Skills";
|
||||
private const string Prefix = "SKL_";
|
||||
@@ -18,6 +18,7 @@ namespace BaseGames.Editor.Modules
|
||||
public string ModuleId => "skill";
|
||||
public string DisplayName => "技能";
|
||||
public string IconName => null;
|
||||
public int DisplayOrder => 20;
|
||||
|
||||
private SoListPane<FormSkillSO> _listPane;
|
||||
private DetailHeader _header;
|
||||
@@ -193,16 +194,24 @@ namespace BaseGames.Editor.Modules
|
||||
T asset,
|
||||
string folder,
|
||||
string prefix,
|
||||
Action<T> onCreated,
|
||||
Action<T> onCloned,
|
||||
Action onDeleted) where T : UnityEngine.ScriptableObject
|
||||
Action<T> onCreated,
|
||||
Action<T> onCloned,
|
||||
Action onDeleted,
|
||||
Action<Action<T>> wizardCreate = null) where T : UnityEngine.ScriptableObject
|
||||
{
|
||||
var bar = MakeActionBar();
|
||||
|
||||
new Button(() =>
|
||||
{
|
||||
var c = AssetOperations.Create<T>(folder, prefix + "New");
|
||||
if (c != null) onCreated?.Invoke(c);
|
||||
if (wizardCreate != null)
|
||||
{
|
||||
wizardCreate(c => onCreated?.Invoke(c));
|
||||
}
|
||||
else
|
||||
{
|
||||
var c = AssetOperations.Create<T>(folder, prefix + "New");
|
||||
if (c != null) onCreated?.Invoke(c);
|
||||
}
|
||||
}) { text = "新建" }.AlsoAddTo(bar);
|
||||
|
||||
new Button(() =>
|
||||
|
||||
Reference in New Issue
Block a user