首页 > 解决方案 > 如何在移动设备的 x 或 y 轴上检测手指拖动?

问题描述

无论如何,为了获得或重新创建这种类型的移动触摸输入控件,我本质上不是在 y 上检测鼠标拖动,而是在 y 上检测手指拖动,老实说 x 也是?我是否必须通过脚本执行此操作,如果是这样,代码将是什么?

输入管理器鼠标 Y,但我想要手指 Y ha :'D

标签: unity3d

解决方案


此代码用于拖动(平移)和缩放。我将此代码用于我的游戏

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);
    }
}

推荐阅读