最近在手机上玩我们正在开发的游戏时间比较多(之前主要运行的是 Windows 版),发现有许多操作值得改进。这里列举两个值得一提的交互优化。
第一,触摸屏上点击特别小的物件时很难精确。去年我提过一个解决方案 ,我们的游戏一直是这样处理的:连续 tap 屏幕同一个位置,会轮询这个位置附近的物件。这样,一次点不准的话,可以多点几次选到想要的焦点。这不仅可以解决小物件密集的时候,tap 不好区分的问题,还可以选到重叠的物件。这个方法其实在鼠标游戏中已有这么使用的了,比如 rimworld 就是用类似方法处理同一个格子上有多个可选物件的。
但实际用下来,玩家在处理小物件选取时,被培养的最好的操作习惯还是先用双指放大,推进镜头,让小物件在屏幕空间变得很大,然后才去选取。这不仅仅是因为触摸屏不够精确,还因为手指会挡住视线,如果物件过小,很难确定是否选中。
对于手指挡住视线的问题,我用额外的一个提示窗口显示在旁边来解决。选取这件事,我想应该照顾用户的操作直觉,并提供遍历。所以我最近换了一种交互方法:当用户长按屏幕,摄像机转到顶视角,并推进。作为一个 3d 游戏,处于视觉美观的原因,我们平常游戏时,摄像机不不是垂直向下的。而近距离选择物件,则用顶视角更好。这样,高大的建筑才不会挡住背后的东西。如果手指不离开屏幕的话,移动手指不再移动摄像机(即不再移动画布),而改为移动选取焦点。操作者可以通过移动手指选取刚刚按下时的地方附近的东西。因为镜头已经推的很近,所以可以轻易选择,物件在镜头内很大,所以也缓解了手指挡住视线的问题。当手指离开,摄像机则原路返回之前的状态。
这里有个小的技术问题:当手指按压的地方不是屏幕中心时,不能简单的旋转并推进相机。因为这是一个 3d 空间,简单的旋转摄像机,会让按压的地方偏离它的屏幕位置。我们应该一边旋转和推进摄像机,一边调整它的位置,保证整个过程中,手指按压的那个地方永远在屏幕的同一个地方。也就是让选取平面上的一个点成为摄像机镜头内的不动点。这是一个并不复杂的数学问题,这里就不展开了。
第二个问题是:当我们用手指移动焦点时,虽然脑子里想着水平或垂直移动,但实现操作却很难保持直线。对于建筑游戏来说,很多情况下我们都希望把建筑修成整齐的一排,公路平直,但手指远没有鼠标好控制,更比不上键盘控制方向。
在很多设计软件中,都有锁定运动轴,锁定平面的方法。你可以拖动一个被锁定的手柄,运动方向被限制在一个轴上,这样就不会因为手抖而移歪了。
直接把它照搬到游戏中是不合适的,尤其是触摸屏操作会更繁琐。我摸索了一天,找到了一个相对舒适的操作方法。当手指按下并移动时,程序监测移动的速度。只有当移动速度慢过一个阈值,且 X Y 两个轴上的移动距离差距较大(即倾向于轴向移动),自动开启轴锁定状态,这个状态一直持续到手指离开为止。
在轴锁定状态中,屏幕上有明显的标识表明处于这个状态,不至于让操作者觉得怪异。而解除锁定只需要放开手指即可。
实测下来,快速的长距离戳动屏幕移动画布不会受锁定的影响,而需要细致操作时,玩家只需要缓慢的向一个轴向移动,移动马上就会锁定在这个轴上,接下来可以放心的在这个轴上对位置,不用担心手抖错位。