Unity - 为什么 iPhone 6 和 7 的触摸输入行为不同?
Unity - Why iPhone 6 and 7 behaves differently to touch input?
我在 Update() 中有以下代码来拖动相机并检测对对象的点击。当我们尝试 iphone 6 和 X 时一切正常,但是当我们尝试 iPhone7 时拖动屏幕反应非常迟钝,只有当您非常非常轻地触摸屏幕时才能单击对象。有人知道发生了什么事吗?
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {
fingerMoved = false;
if (_eventSystem.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
fingerMoved = true;
}
hit_position = Input.GetTouch(0).position;
camera_position = cam.position;
} else if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) {
current_position = Input.GetTouch(0).position;
LeftMouseDrag();
if (Vector2.Distance(hit_position, current_position) > 7f) {
fingerMoved = true;
}
cam.DOMoveY(target_position.y, 0.75f);
} else if (!fingerMoved && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) {
foreach (var item in storageList) {
if (Vector2.Distance(item.transform.position, Camera.main.ScreenToWorldPoint(hit_position)) < 0.5f) {
sideMenu.Open(item.myNo);
}
}
}
void LeftMouseDrag() {
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
direction.x = 0f;
direction = direction * -1;
target_position = camera_position + direction;
if (target_position.y > camMaxY) {
target_position.y = camMaxY;
}
if (target_position.y < camMinY) {
target_position.y = camMinY;
}
}
我不确定它是否有所作为,但对于此类内容,使用 EventSystems 和 OnPointerClick / OnPointerDrag 处理程序更容易、更可靠。这样,至少在理论上,Unity 本身可以消除任何灵敏度差异。 (我不知道天气是否会这样做只是
问题自己解决了,一开始不知道哪里出了问题。
我遇到了同样的问题并通过添加下面显示的代码的第二行修复了它。
else if (Input.GetTouch(0).phase == TouchPhase.Moved)
if (master.calcDelta(Input.GetTouch(0).position) > 0f)
这反过来会计算表示从先前位置到实际位置的错位的向量的长度。
calculatedDelta = Mathf.Abs(_touchPos.magnitude - pastPos.magnitude);
所做的是防止抖动干扰统一的内置功能“TouchPhase.Moved”。
我在 Update() 中有以下代码来拖动相机并检测对对象的点击。当我们尝试 iphone 6 和 X 时一切正常,但是当我们尝试 iPhone7 时拖动屏幕反应非常迟钝,只有当您非常非常轻地触摸屏幕时才能单击对象。有人知道发生了什么事吗?
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {
fingerMoved = false;
if (_eventSystem.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
fingerMoved = true;
}
hit_position = Input.GetTouch(0).position;
camera_position = cam.position;
} else if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) {
current_position = Input.GetTouch(0).position;
LeftMouseDrag();
if (Vector2.Distance(hit_position, current_position) > 7f) {
fingerMoved = true;
}
cam.DOMoveY(target_position.y, 0.75f);
} else if (!fingerMoved && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) {
foreach (var item in storageList) {
if (Vector2.Distance(item.transform.position, Camera.main.ScreenToWorldPoint(hit_position)) < 0.5f) {
sideMenu.Open(item.myNo);
}
}
}
void LeftMouseDrag() {
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
direction.x = 0f;
direction = direction * -1;
target_position = camera_position + direction;
if (target_position.y > camMaxY) {
target_position.y = camMaxY;
}
if (target_position.y < camMinY) {
target_position.y = camMinY;
}
}
我不确定它是否有所作为,但对于此类内容,使用 EventSystems 和 OnPointerClick / OnPointerDrag 处理程序更容易、更可靠。这样,至少在理论上,Unity 本身可以消除任何灵敏度差异。 (我不知道天气是否会这样做只是
问题自己解决了,一开始不知道哪里出了问题。
我遇到了同样的问题并通过添加下面显示的代码的第二行修复了它。
else if (Input.GetTouch(0).phase == TouchPhase.Moved)
if (master.calcDelta(Input.GetTouch(0).position) > 0f)
这反过来会计算表示从先前位置到实际位置的错位的向量的长度。
calculatedDelta = Mathf.Abs(_touchPos.magnitude - pastPos.magnitude);
所做的是防止抖动干扰统一的内置功能“TouchPhase.Moved”。