Project AS Developer Doc Help

3.8 UI 系统架构(UISystem)

UI 系统负责承载所有玩家交互界面,包括资源面板、任务追踪、设施管理、居民面板、科研树、剧情播放等功能模块。UI 系统应采用模块化、解耦、事件驱动的架构设计,确保运行效率与界面可拓展性。

3.8.1 UI 管理器设计(UI 层级、模块生命周期)

建议采用统一 UIManager 控制所有 UI 模块的显示与状态。

public class UIManager : MonoBehaviour { public Dictionary<string, BaseUIPanel> panelMap; public void Open(string panelId); public void Close(string panelId); public bool IsOpen(string panelId); }

支持 UI 层级划分:

  • HUD 层(顶部资源条、状态面板)

  • 弹窗层(设施详情、居民信息)

  • 全屏层(科技树、剧情面板、设置界面)

  • 遮罩层(对话遮盖、警告提示)

UI 面板生命周期统一划分为:

  • OnInit() → 注册事件、预加载资源

  • OnOpen() → 激活面板,绑定数据

  • OnClose() → 注销事件,清理状态

3.8.2 面板注册与模块绑定机制

每个 UI 模块建议继承基础类 BaseUIPanel 并以资源路径形式进行自动注册。

public abstract class BaseUIPanel : MonoBehaviour { public abstract string PanelId { get; } public abstract void OnInit(); public abstract void OnOpen(); public abstract void OnClose(); }

面板初始化阶段加载至 UIManager:

panelMap[panel.PanelId] = panel;

模块通信接口:

  • UI 调用系统:如 FacilitySystem.GetStatus(facilityId)

  • 系统回调 UI:使用事件系统广播状态变更,由 UI 响应更新

3.8.3 UI 与数据系统的解耦(事件/观察者机制)

UI 模块不直接轮询数据系统 ,而通过观察者/事件机制响应更新,避免性能浪费与逻辑耦合。

常用事件结构:

public class ResourceChangedEvent { public ResourceType type; public int newAmount; } public class FacilityStatusEvent { public string facilityId; public FacilityState newState; }

注册示例:

EventBus.Subscribe<ResourceChangedEvent>((e) => { if (e.type == ResourceType.Water) waterUI.SetValue(e.newAmount); });

3.8.4 扩展建议

  • UI 热更新框架支持 :支持后期面板以 AB 包增量更新(用于 DLC)

  • 响应式布局系统 :支持多分辨率适配与 Steam Deck / 宽屏支持

  • UI 模块权限标记系统 :不同阶段模块是否可用(如科技树未解锁)

  • UI 指令调度支持 :用于自动化测试 / 引导流程(如 UIManager.Execute("ShowQuestHint")

14 七月 2025