移动输入
在 iOS 和 Android 渠道,输入种类能够让您拜访触摸屏、加速度计及地舆/方位输入。通过iOS 键盘可供给移动设备键盘拜访。
多点触控屏幕
iPhone 和 iPod Touch 设备最多可一起追寻屏幕的五个触点。您能够拜访 Input.touches 特点数组,检索最终一帧每个触点的状况。
Android 设备对于追寻的触点数量没有统一约束。相反,它依据设备的而有所不同,某些老旧设备能够是两点,而最新的设备能够到五点。
每个触点都以一个 Input.Touch 数据结构表明:
手指索引 (fingerId) 每次触摸的仅有指数。
方位 (position) 触摸在屏幕中的方位。
增量方位 (deltaPosition) 最终一帧以来的屏幕方位改变。
增量时刻 (deltaTime) 最终一次状况改变以来的通过的时刻。
点击数 (tapCount) iPhone/iPad 屏幕能够分辩用户的疾速触摸。这个计数器能够让您晓得用户在不移动手指的情况下触摸屏幕的次数。
Android 设备不会核算触摸的次数,因而,这个字段始终为 1。
期间 (phase) 描绘所谓的触摸“期间 (phase)” 或状况。它有助于断定用户是不是刚开始触摸,是不是用户移动手指,是不是用户刚刚抬起手指。
期间首要分为以下几个有些:
开始 (Began) 手指刚刚触摸屏幕。
移动 (Moved) 手指在屏幕上移动。
停止 (Stationary) 手指触摸屏幕,但自最终一帧以来并未移动。
完毕 (Ended) 手指脱离屏幕,是触控的最终一个期间。
撤销 (Canceled) 体系已撤销触控盯梢,例如,用户将设备触摸面部或一起超过 5 个触摸点。这是触控的最终一个期间。
下面是一个用户轻触屏幕即射出光线的脚本示例:
var particle : GameObject;
function Update () {
for (var touch : Touch in Input.touches) {
if (touch.phase == TouchPhase.Began) {
// Construct a ray from the current touch coordinates
var ray = Camera.main.ScreenPointToRay (touch.position);
if (Physics.Raycast (ray)) {
// Create a particle if hit
Instantiate (particle, transform.position, transform.rotation);
}
}
}
}
鼠标模拟
除原生的触摸支持以外,Unity iOS/Android 还提供鼠标模拟。您可以使用标准输入类中的鼠标功能。
加速度计
在移动设备移动的过程中,内置的加速度计报告在三维空间三个主要轴上的线性加速度改变。硬件将直接报告每根轴的加速度作为重力值。值为 1.0 代表所给出的轴的负载约为 +1g,而 -1.0 则代表 -1g。如果设备垂直放置(Home 键位于下方)于身体正前方,那么 X 轴在右边是正值,Y 轴在上方是正值,Z 轴则在指向您本人的一方为正值。
可以访问 Input.acceleration 属性,检索加速度计值。
以下是使用加速度计移动对象的脚本示例:
var speed = 10.0;
function Update () {
var dir : Vector3 = Vector3.zero;
// we assume that the device is held parallel to the ground
// and the Home button is in the right hand
// remap the device acceleration axis to game coordinates:
// 1) XY plane of the device is mapped onto XZ plane
// 2) rotated 90 degrees around Y axis
dir.x = -Input.acceleration.y;
dir.z = Input.acceleration.x;
// clamp acceleration vector to the unit sphere
if (dir.sqrMagnitude > 1)
dir.Normalize();
// Make it move 10 meters per second instead of 10 meters per frame...
dir *= Time.deltaTime;
// Move object
transform.Translate (dir * speed);
}
低通过滤器
加速度计读数可能被颠簸和噪音影响。在信号中应用低通滤波器有助于使其更平滑,并去除高频噪音。
以下脚本展示了如何将低通滤波器应用到加速度计读数:
var AccelerometerUpdateInterval : float = 1.0 / 60.0;
var LowPassKernelWidthInSeconds : float = 1.0;
private var LowPassFilterFactor : float = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable
private var lowPassValue : Vector3 = Vector3.zero;
function Start () {
lowPassValue = Input.acceleration;
}
function LowPassFilterAccelerometer() : Vector3 {
lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
return lowPassValue;
}
LowPassKernelWidthInSeconds 的值越大,过滤值在当前输入样本中汇集的速度越慢(反之亦然)。
在获取加速度计读数时,我希望它能尽可能精确,我该怎么做?
读取 Input.acceleration 变量并不等于采样硬件。简而言之,Unity 以 60Hz 的频率采样硬件,并将结果储存到变量中。事实上,事情并非如此简单 —— 在大量 CPU 负荷的情况下,加速度计采样不会以相同的时间间隔发生。因此,系统可能一帧报告两个样本,而下一帧又只有一个样本。
您可以访问加速度计在每帧执行的所有测量。以下代码将举例说明最后一帧收集的所有加速度计事件的简单平均数:
var period : float = 0.0;
var acc : Vector3 = Vector3.zero;
for (var evnt : iPhoneAccelerationEvent in iPhoneInput.accelerationEvents) {
acc += evnt.acceleration * evnt.deltaTime;
period += evnt.deltaTime;
}
if (period > 0)
acc *= 1.0/period;
return acc;
进一步阅读
Unity 移动输入 API 最初基于 Apple 的 API。它可能有助于了解更多有关原生 API 的信息,以便更好地理解 Unity 的 输入 API. 您可以在下面的链接中找到 Apple 输入 API 文件:
编程指南:事件处理(Apple iPhone SDK 文件)
UITouch 类参考(Apple iOS SDK 文件)
注意:上方链接为您提供了本地安装的 iPhone SDK 参考文档,并将包含本地 Objective C 代码。在移动设备上使用 Unity 不一定要理解这些文档,但对于某些人来说可能非常有用。
本教程文章由游戏蛮牛游戏蛮牛论坛整理推荐