作者:X婷婷Z | 来源:互联网 | 2023-09-02 14:36
Touch先上官方属性表:altitudeAngleazimuthAngle压力等级Type暂时没用上所以没做试验用的设备是ipadpro9.7altitude
Touch
先上官方属性表:altitudeAngle/azimuthAngle/压力等级/Type暂时没用上所以没做试验
用的设备是ipad pro 9.7
altitudeAngle | Value of 0 radians indicates that the stylus is parallel to the surface, pi/2 indicates that it is perpendicular. |
azimuthAngle | Value of 0 radians indicates that the stylus is pointed along the x-axis of the device. |
deltaPosition | The position delta since last change in pixel coordinates. |
deltaTime | Amount of time that has passed since the last recorded change in Touch values. |
fingerId | The unique index for the touch. |
maximumPossiblePressure | The maximum possible pressure value for a platform. If Input.touchPressureSupported returns false, the value of this property will always be 1.0f. |
phase | Describes the phase of the touch. |
position | The position of the touch in screen space pixel coordinates. |
pressure | The current amount of pressure being applied to a touch. 1.0f is considered to be the pressure of an average touch. If Input.touchPressureSupported returns false, the value of this property will always be 1.0f. |
radius | An estimated value of the radius of a touch. Add radiusVariance to get the maximum touch size, subtract it to get the minimum touch size. |
radiusVariance | This value determines the accuracy of the touch radius. Add this value to the radius to get the maximum touch size, subtract it to get the minimum touch size. |
rawPosition | The first position of the touch contact in screen space pixel coordinates. |
tapCount | Number of taps. |
type | A value that indicates whether a touch was of Direct, Indirect (or remote), or Stylus type. |
1.deltaPosition
手指静止时清零(按一定频率更新,值代表前一个点和后一个点位置差)
移动中(即phase是move时)产生非零值
2.deltaTime 自记录的 Touch 值上次更改以来经过的时间
个位的单位是s,整个是个float
touch内任意属性值发生变化均会刷新该数据
3.fingerId 触摸的唯一索引。
(交互连打可能出现误判——同一个fingerid因为递补记录了两个不同地方的点),手指不离开屏幕的话fingerid和手指对应关系不变,在某些帧上,存在的fingerId可能不连续(例如0,1,4),具体和input.getTouch的index的关系在下面gettouch部分说明
想跟踪触摸事件的话推荐使用fingerId,用getTouch(index)的话在多指同时操作时候会跟丢
4.phase 描述触摸阶段。
ended
任何时刻的手指抬起(包括连点中的每一下抬起)
moved
手指拖动,或者交互点击不同位置(连点判定间隔时间内)
stationary
手指放在板子上完全静止不动(手指角度变化/手指压力变化也可能会导致从这个状态跳到别的状态)
began
手指每次触摸屏幕
canceled
(暂时没试出来是怎么触发这个状态)
一般的一个phase周期是从began——moved/stationary循环——ended
快速连点则是上面的一个循环*n
5.position 触摸在屏幕空间中的位置(像素坐标)。
设备左下角(0,0),右上角为板子分辨率的最大值,如果要和GameObject的position做运算需要切换一下坐标类型(世界——像素)
6.radius 触摸半径的估计值。加上 radiusVariance 可获得最大触摸大小,减去它可获得最小触摸大小。
随放在板子上的接触面积变化,体测指尖大概是20.0,增加指肚接触面积大约能到200
radiusVariance是个固定值,测试机上大概是5.0xxxx
7.rawPosition 触摸触点在屏幕空间中的第一个位置(像素坐标)。
这个属性貌似有问题,测试时坐标变成了设备左上角为zero,右下角为1024x768
而且这个属性在手指在屏幕上连续拖动时候是会变化的
官方描述,反正试出来的2021.2.7f1c1上没有一条能对得上描述的(
8.tapCount 点击次数。
在大约间隔0.5s左右(可能有设置的地方,没找到)时间间隔内产生同范围(A)连续点击则累加(可以换不同手指,坐标范围ok就可以),松手或hold超过0.5s间隔则清零,抬手间隔内有范围(A)外点击时,该次点击(指同fingerId)的phase会有瞬间变成phase.move且tapcount变1,但如果在间隔时间内重新点回最开始的范围(A)则tapcount变为抬手前累计的次数+1
不抬手的话该值不再变化,每次出现phase.began时叠加
Input中和touch相关的:
1.touchcount
当前放在板子上的手指数量
2.touches
返回含有touchcount个Touch对象的数组,即当前所有触摸事件
3.gettouch(int index)
index一定是从0到touchcount,如果多指状况下抬起任意手指,则该index对应的fingerid移除,后面的fingerid向前平移(发生index 手指顺序触摸时,index顺序递增,fingerid从0开始查询,遇到空缺就标记新触摸为该空缺的fingerid,所有后面index对应的fingerid对应后移
简易例子如下:
按顺序放右手的食指中指无名指小指后:
gettouch(index) | index=0 | index=1 | index=2 | index=3 |
对应手指 | 食指 | 中指 | 无名指 | 小指 |
fingerid | 0 | 1 | 2 | 3 |
这时松开中指:
gettouch(index) | index=0 | index=1 | index=2 | - |
对应手指 | 食指 | 无名指 | 小指 | - |
fingerid | 0 | 2 | 3 | - |
再松开食指:
gettouch(index) | index=0 | index=1 | - | - |
对应手指 | 无名指 | 小指 | - | - |
fingerid | 2 | 3 | - | - |
任意地方放回一根指头(左手食指):
gettouch(index) | index=0 | index=1 | index=2 | - |
对应手指 | 左手食指 | 无名指 | 小指 | - |
fingerid | 0 | 2 | 3 | - |
任意地方再放回一根手指头(右手拇指):
gettouch(index) | index=0 | index=1 | index=2 | index=3 |
对应手指 | 左手食指 | 拇指 | 无名指 | 小指 |
fingerid | 0 | 1 | 2 | 3 |