feat: Add WorldStateFlagAttribute and custom property drawer for enhanced dialogue management

- Implemented WorldStateFlagAttribute to mark string fields as world state flags.
- Created NarrativeNPCEditor for custom inspector to visualize dialogue version activation states.
- Developed WorldStateFlagDrawer to provide dropdown menu for known flags in the inspector.
- Introduced ActorModule for managing DialogueActorSO assets, including viewing, creating, and deleting actors.
- Added DialogueModule for managing DialogueSequenceSO assets with detailed previews and action bars.
- Established QuestModule for managing QuestSO assets, including objectives and branches.
- Implemented QuestManagerPostprocessor to automatically refresh QuestManager's quest list on asset changes.
This commit is contained in:
2026-05-24 00:36:11 +08:00
parent 520f84999b
commit 446fd5dcd0
22 changed files with 1908 additions and 101 deletions

View File

@@ -99,15 +99,7 @@ namespace BaseGames.Editor.Modules
{ text = "克隆..." }.AlsoAddTo(bar);
var del = new Button(() => { if (AssetOperations.Delete(s)) _listPane.Refresh(null); }) { text = "删除" };
del.style.borderLeftColor = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
del.style.borderRightColor = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
del.style.borderTopColor = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
del.style.borderBottomColor = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
del.style.borderLeftWidth = 1;
del.style.borderRightWidth = 1;
del.style.borderTopWidth = 1;
del.style.borderBottomWidth = 1;
del.style.marginLeft = 8;
ApplyDeleteStyle(del);
del.AlsoAddTo(bar);
return bar;
@@ -171,6 +163,69 @@ namespace BaseGames.Editor.Modules
d.style.backgroundColor = new StyleColor(new Color(0.5f, 0.5f, 0.5f, 0.2f));
return d;
}
/// <summary>将删除按钮染成红色边框,统一各模块样式。</summary>
internal static void ApplyDeleteStyle(Button btn)
{
var red = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
btn.style.borderLeftColor = red;
btn.style.borderRightColor = red;
btn.style.borderTopColor = red;
btn.style.borderBottomColor = red;
btn.style.borderLeftWidth = 1;
btn.style.borderRightWidth = 1;
btn.style.borderTopWidth = 1;
btn.style.borderBottomWidth = 1;
btn.style.marginLeft = 8;
}
/// <summary>
/// 为任意 ScriptableObject 模块生成标准 ActionBar新建 / 定位 / 克隆 / 删除)。
/// 各模块可在返回后向 bar 追加额外按钮。
/// </summary>
/// <param name="asset">当前选中资产。</param>
/// <param name="folder">资产所在文件夹(用于新建 / 克隆)。</param>
/// <param name="prefix">新建资产的文件名前缀。</param>
/// <param name="onCreated">新建完成回调(传入新资产)。</param>
/// <param name="onCloned">克隆完成回调(传入克隆资产)。</param>
/// <param name="onDeleted">删除完成回调。</param>
internal static VisualElement BuildStandardActionBar<T>(
T asset,
string folder,
string prefix,
Action<T> onCreated,
Action<T> onCloned,
Action onDeleted) where T : UnityEngine.ScriptableObject
{
var bar = MakeActionBar();
new Button(() =>
{
var c = AssetOperations.Create<T>(folder, prefix + "New");
if (c != null) onCreated?.Invoke(c);
}) { text = "新建" }.AlsoAddTo(bar);
new Button(() =>
{
EditorGUIUtility.PingObject(asset);
Selection.activeObject = asset;
}) { text = "定位" }.AlsoAddTo(bar);
new Button(() =>
{
var c = AssetOperations.Clone(asset, folder);
if (c != null) onCloned?.Invoke(c);
}) { text = "克隆..." }.AlsoAddTo(bar);
var del = new Button(() =>
{
if (AssetOperations.Delete(asset)) onDeleted?.Invoke();
}) { text = "删除" };
ApplyDeleteStyle(del);
del.AlsoAddTo(bar);
return bar;
}
}
// ── Button 扩展(模块内共用)─────────────────────────────────────────────