Unity用户界面导航
在鼠标与键盘操作的模式下,用户界面导航似乎是个不存在的问题,想要操作哪个组件只要把鼠标挪过去,通过点击改变当前焦点,使用键盘输入一些数据即可。
但即便如此,用户界面导航也并非一无是处,最起码的一点,许多游戏中的用户界面都会用特定的效果展示来告诉玩家他们当前正在操作的是什么组件,比如说按钮的高亮以及选项的边框等等。
如果先撇开比较复杂的场景来考虑的话,Unity其实自带了一套用户界面导航的机制,它基于Untiy中的UI组件之一Selectable,继承自该类的UI组件控制器都包含一系列和“选中”以及“反选”相关的字段与方法,能协助游戏系统实现对用户界面的导航。
事实上到Unity的输入管理设置菜单里就能看到一个虚拟操作项叫做“Submit”,它便是用来描述用户界面导航时哪个按钮的输入被认为是“确认”含义的,如果修改它的映射,那么游戏中就能用指定的按钮来进行包括Dropdown,Toggle,InputField以及Button等组件的操作。
而Selectable组件的使用方法也很简单,如果没有复杂的自定义场景的话,通过组件属性栏里Navigation项目设置即可简单地实现用户界面导航,通常而言Automatic已经足够应付基础场景,该模式会自动识别当前组件周围的其它Selectable组件并与之建立关系,玩家可以使用配置好的水平和垂直轴来切换不同组件。
大部分继承自Selectable的组件都会有Transition属性,通过它可以设置该组件在不同状态下的样式区别,默认情况下会是选择Color Tint模式,即颜色切换模式,让按钮之类的组件在被选中时有一个轻微的灰度变化来提示玩家,按下时也会让按钮变暗。
通过合理设置Navigation和Transition两项属性后,一个基础的用户界面导航功能便可以使用了,玩家进入游戏之后只要输入方向轴或者按下Submit以及Cancel按钮便能导航和操作用户界面了,而无需鼠标的介入,这对于手柄适配是个不错的开始。
复杂界面和组件
简单的界面和组件可以使用Unity自带的界面导航功能,但这往往并不能满足所有需求,尤其是当界面上存在一些特殊组件的时候,比如说列表,尤其是一些由开发者自行编写的,具备自动更新和回收功能的列表组件,由于其实际显示的项目和数据表达的项目不一致,几乎不可能通过Navigation实现操作适配。
这种情况下大概只能通过自定义组件的方式来处理了,能想到的也就是在自定义组件中继承Selectable并且实现相关方法,或者是留出对外的接口来方便操作。
至于各种组件拼起来的整个界面如何导航恐怕就得具体情况具体分析了,比如将自定义组件和Unity原生UI组件混用,通过标记来手动跟踪玩家的操作并且予以适当的反馈,这固然十分低效而且繁杂,但考虑到界面较少而且不打算使用第三方插件的场景,为每个界面编写固定的一套导航机制或许是一种可能的解决方案。
如果要考虑框架性的东西,那么这样的工具大概需要考虑这么几个方面。
第一点是焦点控制,UI界面以及上面展示的组件究竟哪一个当前处于激活可操作状态,记录其相关数据对实现适配工具非常重要。
能想到的有两种实现方案,一种是全局储存,一种则是局部储存,全局储存很好理解,就是让每个可操作组件都将自身注册到一个全局管理器中,并且为每个组件分配唯一标识来管理。
此后每当组件状态发生改变时,只需要向管理器发送一个通知,让管理器取出指定组件并修改数据即可。
而局部储存相对而言要更繁琐一些,需要针对游戏的界面需求进行考虑,比如说将游戏内的界面分成面板和窗口两类,然后通过UI管理器来获取当前栈顶界面,而特定界面的可操作组件状态就保存在界面控制器之内。
如此一来,每个界面只需要处理自身的组件状态信息即可,也没有全局储存的需求,几乎不存在任何意义上的耦合,非栈顶UI界面只需暂停用户输入检测即可实现屏蔽。
暂无关于此日志的评论。