UI框架应该算是这次开发内容种,进程比较靠后的内容了,也因为这样,UI框架算是我在现在游戏中,比较满意的代码框架之一。在这里记录一下,
以下,先进行成果展示。
这里只先进行物品栏部分的UI界面展示。玩家操作界面当然也会有很多的UI相关元素,这些留待后续进行其他内容记录时再一一展示吧。
接下来记录一下其中用到的一些效果和关于其中组件我所使用的一些管理方案。
1.外观内容
- 如上所示的内容中,背景的云雾效果是用三层噪点图叠加来实现的。当然,这里所实现的效果实在不好。我也是看到资源包下有一些其他地方所用的噪点图,随手拿来用了。
- 角色图使用单独摄像机渲染,用材质球的方式挂载到ui。
- (本应该有的UI动画,例如弹出,缩放等)时间问题,暂时没做,后续做了相关效果会放出并且补全这一块的内容。
2.模块管理
这一块比较着重的记录一下吧。因为这一块也是比较繁杂和散乱的部分。
众所周知,比较麻烦的矛盾点就在于,在进行游戏开发的过程中,玩家可能会有许多的数据项和类似技能,物品一样的衍生物。这些衍生物一个个的嵌套在不同的界面之中,这些界面本身又会有不同的联动效果。
例如:界面一打开,显示等级,经验,血量等内容,界面二打开是药品,装备等。玩家在界面二使用了装备,回到界面一时,数值理所当然的会发生变化。否则一些衍生物带来的效果就不能直观的体现出来。
当然,这个矛盾其实时普遍存在的,但是在开发的过程中,尤其是不太熟悉的时候,容易将这部分的更新逻辑和玩家的数值更新写到一块,从而产生耦合。
也就是:使用物品一->数值运算->更新数值到UI->下一段逻辑
这样产生耦合的方式,使得ui框架在开发过后进行测试时,也会依赖于实际的游戏环境。也就是,没有游戏数据,这个ui框架将无法运行。而且,在改动游戏逻辑时,很容易牵扯到ui内容。
针对这种麻烦,比较流行的解决方式有许多。这里记录一下我的解决方式。
首先在我的UI框架中,有一个UiManager作为UI控制单元的主体。所有子模块会继承UiElement的基类,在游戏开始的阶段,将自己以字典元素的方式写入到UiManager中。接下来UiManager就可以在游戏的状态发生转变时,以绑定事件的方式,将需要更新的Ui内容,绑定到逻辑模块的各个监听之中,在事件发生的时候,数据便会自己写入到ui中,而不需要主动调用ui内部的方法。
这样做的好处有:
1.降低耦合。在逻辑模块中使用观察者模式提供事件监听并通知ui内容实现更新,这样能让耦合降低,并且在必要的单元测试阶段可以屏蔽掉UiManager中事件绑定的代码,来实现ui模块的单元测试。
2.向顶层内聚。此处因为UiManager中存储了子模块的对象,因此在发生ui显示错误或者事件绑定错误时,能够将错误发生范围定位到UiManager中,更利于排错。
3.模块之间相对独立。上文提到,UiManager中存储的是所有子模块的对象,但事实上还会有很多的ui内容并不会被UiManager存储并管理。这些ui内容便是子模块所管理的元素。例如,玩家物品栏是一个子模块,那么它底下的物品便是它的子元素。我们在UiManager中并不能直接获取到玩家物品栏中的子元素,但却可以通过对玩家物品栏的操纵,来对它的子元素产生,移除实现控制。这样既有效的降低ui框架内部的耦合,也可以更方便的给各个ui框架的实体模块搭载各种效果(因为子元素是不在最顶层被存储的,那么它可以同时拥有多个子元素Component,例如,既是物品栏元素,又是可实现鼠标停留后显示弹窗和鼠标点击后按钮弹窗的多个元素。)
转载:https://blog.csdn.net/qq_35465882/article/details/114501847