Project AS Developer Doc Help

第4章 数据系统设计(Data Architecture)

数据系统设计旨在规范游戏中所有基础数据的结构、加载方式、开发期热重载与运行期使用机制,确保数据安全性、可维护性与一致性。该章节主要围绕 ScriptableObject 资产的组织管理、工具链支持与校验机制展开。

4.1 统一数据加载机制(ScriptableObject 管理器)

所有策划定义的数据(任务、设施、科技、剧情等)在构建期统一转化为 ScriptableObject,并打入 Resources/Configs/ 目录中。

在运行时,由 DataManager 加载并管理这些配置。

public class DataManager : MonoBehaviour { public static DataManager Instance; public Dictionary<string, QuestConfig> questMap; public Dictionary<string, FacilityConfig> facilityMap; public Dictionary<string, TechNodeConfig> techMap; public Dictionary<string, NarrativeEvent> narrativeMap; public void LoadAll() { questMap = Resources.LoadAll<QuestConfig>("Configs/Quest/").ToDictionary(q => q.questId); facilityMap = Resources.LoadAll<FacilityConfig>("Configs/Facility/").ToDictionary(f => f.facilityId); techMap = Resources.LoadAll<TechNodeConfig>("Configs/TechTree/").ToDictionary(t => t.techId); narrativeMap = Resources.LoadAll<NarrativeEvent>("Configs/Narrative/").ToDictionary(n => n.eventId); } }

所有系统仅通过 DataManager.GetX(id) 接口访问配置数据,避免重复加载与硬编码。

4.2 资源目录结构规范

所有配置数据统一存储于 Resources/Configs/ 目录下,按模块分类:

/Resources /Configs /Quest /Facility /TechTree /Narrative /ResidentTemplate /Faction

命名规范建议:

  • 文件名使用 ID 对应(如 FAC_SOLAR_01.asset

  • ID 命名规范见附录 A.2

4.3 数据热重载工具(开发期使用,Editor-only)

为提升策划数据迭代效率,推荐实现一套 Unity Editor 工具:

  • 支持 CSV/Excel/JSON 导入

  • 支持配置一键刷新 ScriptableObject

  • 支持资源 ID 自动生成与关联校验

工具功能示例:

public class DataImportTool : EditorWindow { [MenuItem("Tools/Data Importer")] static void Open() { ... } void ImportQuestData(string excelPath); void RegenerateScriptableObjects(); }

所有 Editor 工具均应位于 Editor/ 目录,并在正式构建时排除。

4.4 数据校验与依赖引用检测机制

为保证数据完整性与引用一致性,推荐实现数据校验机制:

  • 任务引用设施 ID 是否存在?

  • 科技是否引用合法的解锁内容?

  • 剧情是否引用合法任务 / 分支选项?

实现方式:

  • 在导入/构建阶段遍历所有 ScriptableObject

  • 对引用字段执行一致性校验

  • 输出日志 / 中断构建 / 标红错误项

可视化校验工具建议:

[MenuItem("Tools/Data Validator")] public static void ValidateAllConfigs() { foreach (var quest in DataManager.Instance.questMap.Values) { if (!facilityMap.ContainsKey(quest.unlockTargetId)) { Debug.LogError($"Quest {quest.questId} references invalid facility {quest.unlockTargetId}"); } } }
15 七月 2025