unity3d - 如何在移动设备的 x 或 y 轴上检测手指拖动?
问题描述
无论如何,为了获得或重新创建这种类型的移动触摸输入控件,我本质上不是在 y 上检测鼠标拖动,而是在 y 上检测手指拖动,老实说 x 也是?我是否必须通过脚本执行此操作,如果是这样,代码将是什么?
解决方案
此代码用于拖动(平移)和缩放。我将此代码用于我的游戏
using UnityEngine;
using UnityEngine.EventSystems;
public class PanZoom : MonoBehaviour
{
Vector3 touchStart;
// Minimum amount pan to move camera
public float panMinX = 2f;
public float panMinY = 2f;
// Minimum and Maximum zoom amount for camera
public float zoomOutMin = 5f;
public float zoomOutMax = 20f;
// Scroll speed of zoom of camera
public float scrollSpeed = 5f;
void Update()
{
if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
{
touchStart = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
#if UNITY_STANDALONE || UNITY_EDITOR || UNITY_WEBGL
if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject())
{
Vector3 direction = touchStart - Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Mathf.Abs(direction.x) > panMinX || Mathf.Abs(direction.y) > panMinY)
if (!CameraMovement.Instance.IsCameraInBorder)
{
Camera.main.transform.position += direction;
}
}
Zoom(Input.GetAxis("Mouse ScrollWheel") * scrollSpeed);
#endif
#if UNITY_ANDROID || UNITY_IOS
if (Input.touchCount == 2 && !EventSystem.current.IsPointerOverGameObject())
{
Touch touchZero = Input.GetTouch(0);
Touch touchOne = Input.GetTouch(1);
Vector2 touchZeroPrevPosition = touchZero.position - touchZero.deltaPosition;
Vector2 touchOnePrevPosition = touchOne.position - touchOne.deltaPosition;
float prevMagnitude = (touchZeroPrevPosition - touchOnePrevPosition).magnitude;
float currentMagnitude = (touchZero.position - touchOne.position).magnitude;
float difference = currentMagnitude - prevMagnitude;
Zoom(difference * 0.01f);
}
else if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject())
{
Vector3 direction = touchStart - Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Mathf.Abs(direction.x) > panMinX || Mathf.Abs(direction.y) > panMinY)
Camera.main.transform.position += direction;
}
#endif
}
void Zoom(float increment)
{
if(!EventSystem.current.IsPointerOverGameObject())
Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize - increment, zoomOutMin, zoomOutMax);
}
}
推荐阅读
- ios - Xcode 11 (beta 4) 无法编译我的其他编译项目(在 beta 3、2 和 1 下):无法识别的编译参数 -fstack-protector-all
- php - 如何检测运行环境中的死代码?
- linux - Yocto 编译
- sql - 如何让响应更有活力?
- python - 在 1.16.0 中破坏了结构化到非结构化 numpy 数组的转换
- r - 是否有一个功能可以自动将弹性表格置于特定内容占位符中?
- java - 我们可以访问 Oracle NetSuite 旧云版本吗?
- jquery - 未捕获的 RangeError:在实现所需的字段验证时超出了最大调用堆栈大小
- r - 将 Rintrojs 与 Shinydashboard 相结合
- python - 为什么不能用 PIL 和 pytesseract 获取字符串?