这篇文章介绍Unity应用在全面屏下Home Indicator延迟响应(也叫二次响应)的设置,iOS部分使用OC编写。
使用场景
虽然说游戏开发也是软件开发的一种,但游戏开发在交互设计及开发着重点等方面与传统移动应用开发有很多不一样。游戏非常注重交互,需要尽可能提高玩家的沉浸感、真实感,尽可能减少各种事件对玩家操作的打断。上滑下滑等手势操作在游戏里是非常常见的,操作的幅度也会比传统应用大许多,也经常会出现从屏幕边缘滑动的需求,然而当游戏内的手势与系统手势冲突时,系统会优先执行系统手势,这显然不是开发者们想要的。在iPhone X及以上型号的手机取消了实体home键,转而使用一个叫Home Indicator的条条来代替,于是我们需要实现Home Indicator延迟响应,避免在屏幕边缘滑动时玩家误操作退出应用,提升玩家的沉浸感。
红色箭头指着的就是Home Indicator
实现方法
这篇文章会用两种方法来实现这个功能,一是在Unity打出XCode工程后,更改OC代码实现;二是使用Unity 2017.3及以上的版本,用Unity自带的方法实现。第一种方法适合运行在Unity 2017.3版本以下,不方便升级的工程;第二种方法适合使用Unity 2017.3及以上的版本开发的工程。
1. OC实现
首先到苹果开发者官网看看手势相关的API,找到我们需要的那个接口:Human Interface Guidelines,从这个网址进去可以看到以下的这么一段话。
主要看看画了黄线的那几句话
Avoid using standard gestures to perform nonstandard actions. Unless your app is a game in active gameplay...
除非您的软件为游戏应用,否则应避免使用标准手势去执行非标准行为...
...In rare cases, immersive apps like games might require custom screen-edge gestures that take priority over the system's gestures—the first swipe invokes the app-specific gesture and a second swipe invokes the system gesture.
在极少数情况下,像游戏这样的沉浸式应用程序可能需要自定义屏幕边缘手势,这些手势优先于系统手势。第一次轻扫调用应用程序特定的手势,第二次轻扫则调用系统手势。
For developer guidance, see the preferredScreenEdgesDeferringSystemGestures property of UIViewController.
有关开发人员指南,请参阅UIViewController的preferredScreenEdgesDeferringSystemGestures属性。
第二段说明了这就是我们要找的手势延迟响应。接下来我们按照文档说明,点进preferredScreenEdgesDeferringSystemGestures
这个属性,看看如何修改它才能满足我们的要求。
依然是看黄色划线部分:
If you change the edges preferred by your view controller, update the value of this property and call the setNeedsUpdateOfScreenEdgesDeferringSystemGestures method to notify the system that the edges have changed.
如果更改了视图控制器首选的边缘操作,请更新此属性的值,并调用setNeedsUpdateOfScreenEdgesDeferringSystemGestures方法通知系统边缘已更改。
那接下来的操作就很简单了,在Unity导出的XCode工程里全局搜索preferredScreenEdgesDeferringSystemGestures
函数,一般来说是在Classes/UI/UnityViewControllerBase+iOS.mm
中,将函数内的返回值改为UIRectEdgeAll
:
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
// UIRectEdgeAll指手机的四个边均为延迟响应(推荐使用)
// UIRectEdgeBottom为只延迟响应底部的Home Indicator
return UIRectEdgeAll;
}
保存后打包出来,手势延迟响应就能够生效了。
注意事项
- 在
preferredScreenEdgesDeferringSystemGestures
函数的下方有一个函数,名为prefersHomeIndicatorAutoHidden
,需要注意的是修改这个函数并不能实现手势的延迟响应效果,并且由于prefersHomeIndicatorAutoHidden
的优先级比preferredScreenEdgesDeferringSystemGestures
高,如果修改prefersHomeIndicatorAutoHidden
为return YES
,Home Indicator会自动隐藏,但当玩家上扫屏幕时,APP会马上进入后台,手势不会被延迟响应,因此注意这两个不要同时设置。注意一下这个函数的返回值,如果默认是return YES
或return UnityGetHideHomeButton()
,需要手动改为return NO
,才会使手势延迟生效。
-(BOOL)prefersHomeIndicatorAutoHidden
{
return NO;
}
2. Unity自带的方法实现
这个方法比较简单,Unity 2017.3及以上的版本是有自带的选项可以实现手势延迟响应的,具体操作如下:
-
顺序点击
Edit -> Project Settings -> Player
-
选择iOS的tab页(一个像iPhone 4s一样的小图标),展开
Other Settings
-
找到
Defer system gestures on edges
,勾上需要延迟响应的边(推荐全部勾上),注意前四个才是屏幕边缘的选项,第五个选项不要勾选
-
如果有
Hide home button on iPhone X
选项,必须取消勾选Hide home button on iPhone X
,原因看OC实现方法的注意事项 -
保存后打包出来,手势延迟响应就能够生效了。
网友评论