使用 GameInstanceSubsystem 收集共同特征
我们如何集中 ProjectDT 的 UI 流程
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
当多个Widget和Actor重复执行相同的UI任务时,相互查找的代码直接增加。 ProjectDT 具有通用的 UI 流程UGameInstanceSubsystem集。
为什么要使用子系统?
UGameInstanceSubsystem与 GameInstance 具有相同的生命周期,由引擎自动创建。 您可以通过 GameInstance 从任何地方获取它,而无需自己创建单独的 Singleton 指针。
UDTUISubsystem* UISubsystem =
GetGameInstance()->GetSubsystem<UDTUISubsystem>();
if (UISubsystem)
{
UISubsystem->ProcessSolvedProblem(
ProblemData,
FVector2D::ZeroVector,
0.0f,
100.0f
);
}
副作用,例如问题答案处理后的对话和白板节点的创建,可以收集到一个函数中,而不是为每个小部件复制。
不要把所有东西都放进去
子系统也可以在全局范围内轻松访问,因此如果您不断添加职责,它就会成为另一个巨大的管理器类。
- UI 转换和 UI 事件是 UI 子系统
- 保存槽和当前SaveGame都是Save Subsystem
- 当前世界输赢规则为GameMode
- 玩家输入是 PlayerController
如果您在战斗中持有临时 Actor 指针,只是因为它的寿命很长,那么在世界各地移动后,旧对象可能会保留下来。 ProjectDT 的 MainUI 和 WhiteBoard 参考资料是:TWeakObjectPtr它被存储为
子系统是将远距离对象连接在一起的良好枢纽。 但在使用前必须检查数据的寿命和责任是否确实在GameInstance的范围内。