通过蓝图使用UMG实现无状态UI

我来自React.JS世界,无状态UI目前是一种管理事物的好方法。 让我尝试对虚幻引擎4及其UMG以及事件分发程序和接口应用相同的方法。

无状态解决方案的最重要部分是防止所有UI窗口小部件自行保持游戏状态。 这些仅仅是用于显示和可能更改这种状态的。 通常,拥有一个可以充当真相权威并向感兴趣的各方发送更改的对象的方法要好得多。

让我们马上看一个例子。 我想显示代表玩家工具的按钮集。 播放器一次只能使用一种工具,因此这些按钮需要反映这一事实。 播放器应该可以单击按钮或按键盘快捷键,并且可以通过其他方式更改工具。

首先应创建工具切换逻辑,而无需在UI上进行任何尝试,因为它允许单独考虑。 有很多方法可以实现这一目标。 我将首先创建一个新界面。

这种方法提供了强大的功能,因为我不需要为此而阻塞继承链。 我可以创建Actor派生的类或实际上值得继承的东西,例如。 典当。 它们都可以携带工具信息而不会干扰继承。 除此之外,它可以为这种工具实现实际的逻辑和游戏外观。

为简单起见,我将工具名称用作字符串,但是它可以是例如任何种类的标识符。 在相关数据表中找到正确的行以读取该工具的值。

下一步是制定更换工具的实际逻辑。 可以在一些新角色中做到这一点,而新角色只能处理这种情况,或者任何具有全局性的对象(例如,玩家角色,玩家控制器)也可以做到。 请注意,我正在制作此私有变量,因为我认为这是避免对其进行不受控制的更改的一种好习惯。

在变量列表下的同一类中,创建一个新的Event Dispatcher。 我将其称为“ 当前工具已更改” 。 在详细信息面板中,添加带有ITool类型的输入,该输入将携带有关新工具的信息。 要实际更改工具,请创建一个新的公共功能,然后像这样简单地连接它。

每当需要更换工具时,就需要调用此函数,它将在发生这种情况以及新工具是什么时自动通知其他对象。