【unity】屏幕事件

SetInputSystem屏幕上点击的点位置为(x,y)

事件
public delegate void touchevent(Vector2[] touchesPos);

public static event touchevent touchMove;移动
public static event touchevent touchDown;按下
public static event touchevent touchUp;抬起

private static Camera targetCamera;

    public static Camera TargetCamera
    {
        get
        {
            if (targetCamera== null && GameStart.Instance.Eyes.Length != 0)
            {
                targetCamera= GameStart.Instance.Eyes[0].GetComponent<Camera>();
            }

            return targetCamera;
        }
    }
public class Point
{
    public float x;
    public float y;
}

public class GestureBean
{
    public int status = -1;
    public List<Point> pointList;
}

void SetInputSystem()
{
    var phase = TouchPhase.None;
        if (GetFirstPoint(gestureBean.pointList, out Vector2 touchPos))
        {
            Vector2 vector2 = GetScreenPos(TargetCamera, touchPos);
            switch (@gestureBean.status)
            {
                case 0: //单指DOWN
                    Debug.Log("单指DOWN");
                    phase = TouchPhase.Began;
                    break;
                case 1: //1:手指UP
                    Debug.Log("手指UP");
                    phase = TouchPhase.Canceled;
                    break;
                case 2: //2:手指MOVE
                    Debug.Log("手指MOVE");
                    phase = TouchPhase.Moved;
                    break;
                case 5: //5:多指DOWN
                    Debug.Log("多指DOWN");
                    phase = TouchPhase.Began;
                    break;
            }
            if (phase == default)
                return;
            InputSystem.QueueStateEvent(currentTouch, new TouchState
            {
                phase = phase,
                position = vector2   //GetScreenPos(LeftCamera, touchPos),
            });
        }
}
   static bool GetFirstPoint(List<Point> pointList, out Vector2 pos)
    {
        if (pointList != null && pointList.Count > 0)
        {
            pos = new Vector2(pointList[0].x, pointList[0].y);
            return true;
        }

        pos = Vector2.zero;
        return false;
    }

 public static Vector2 GetScreenPos(Camera targetCamera, Vector2 mousePercent)
    {
        Vector2 temp = new Vector2(mousePercent.x, 1 - mousePercent.y);
        return targetCamera.ViewportToScreenPoint(temp);
    }

invokeTouchEvent

void InvokeTouchEvent(GestureBean gestureBean)
{
    if (gestureBean.pointList.Count == 0)
        {
            return;
        }

        Vector2[] temp = new Vector2[gestureBean.pointList.Count];
        for (int i = 0; i < temp.Length; i++)
        {
            temp[i] = GetScreenPos(TargetCamera, new Vector2(gestureBean.pointList[i].x, gestureBean.pointList[i].y));

        }

        switch (@gestureBean.status)
        {
            case 0: //单指DOWN
                touchDown?.Invoke(temp);
                break;
            case 1: //1:手指UP
                touchUp?.Invoke(temp);
                break;
            case 2: //2:手指MOVE
                touchMove?.Invoke(temp);
                break;
            case 5: //5:多指DOWN
                touchDown?.Invoke(temp);
                break;
        }
}

OnEnable&&OnDisable

private void OnEnable()
    {
        TouchEventMsg.touchDown += TouchDown;
        TouchEventMsg.touchMove += TouchMove;
        TouchEventMsg.touchUp += TouchUp;
}

 private void OnDisable()
    {
        TouchEventMsg.touchDown -= TouchDown;
        TouchEventMsg.touchMove -= TouchMove;
        TouchEventMsg.touchUp -= TouchUp;
}

TouchDown

void TouchDown(Vector2[] touchesPos)
    {
        if (touchesPos.Length > 0)
        {
            DragDown(touchesPos[0]);
        }
        
    }

 void DragDown(Vector2 pos)
    {
        Vector2 viewPort = LeftCamera.ScreenToViewportPoint(pos);
        //整体初始位置 Camera.main.
        Ray ray = LeftCamera.ViewportPointToRay(viewPort);
        //从摄像机发出到点击坐标的射线
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo, 100,~ (1<< LayerMask.NameToLayer("ModelChild"))))
        {
            GameObject go = hitInfo.collider.gameObject;
            print("点击到模型:" + go.name);
            ...
        }
    }

TouchMove

 void TouchMove(Vector2[] touchesPos)
    {
        if (touchesPos.Length == 1)
        {
            Drags(touchesPos);
        }
        else if (touchesPos.Length == 2)
        {
            TouchCheck(touchesPos);
        }
    }
void Drags(Vector2[] touchesPos)
    {

        if (lastTouch_Single == Vector2.zero || lastTouch_Single == null)
            lastTouch_Single = touchesPos[0];
        
        Vector2 deltaPos = touchesPos[0]-lastTouch_Single;//触摸点位置,在两帧时间内的改变(即这一帧触摸点的位置,减去前一帧触摸点的位置)
        float angle = Mathf.Atan2(deltaPos.x, deltaPos.y) * 180.0f / Mathf.PI;
        Vector3 newVec = Quaternion.AngleAxis(-angle, LeftCamera.transform.forward) * LeftCamera.transform.right;
        float delta = 0.5f * Mathf.Sqrt(deltaPos.x * deltaPos.x + deltaPos.y * deltaPos.y);

        ...
        
        lastTouch_Single = touchesPos[0];
    }
void TouchCheck(Vector2[] touches)
    {
        if (lastTouch == null || lastTouch.Length!= 2)
            lastTouch = touches;

        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型    
        float oldDistance = Vector2.Distance(lastTouch[0], lastTouch[1]);
        float newDistance = Vector2.Distance(touches[0], touches[1]);
        //两个距离之差,为正表示放大手势, 为负表示缩小手势    
        float offset = newDistance - oldDistance;
        Debug.Log("offset:" + offset);

        MoveWithTwoFingures(touches);
        
        //LogText.text = offset.ToString();
        //放大系数  
        float scaleFactor = offset / 500f;

        Vector3 localScale = GameManager.Instance.list_cureentSelectGo[0].transform.localScale;
        Debug.Log("scaleFactor:" + scaleFactor + ";localScale" + localScale);
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
            localScale.y + scaleFactor,
            localScale.z + scaleFactor);
        ScaleWithTwoFingures(scale, 0.3f);
        //记住最新的触摸点,下次使用    
        lastTouch = touches;
    }
public void MoveWithTwoFingures(Vector2[] touches)
    {
        if (touches[0].x > lastTouch[0].x && touches[1].x > lastTouch[1].x)
        {
            Vector2 deltaPos = touches[0]-lastTouch[0];//触摸点位置,在两帧时间内的改变(即这一帧触摸点的位置,减去前一帧触摸点的位置)
           ...
        }
        if (touches[0].x < lastTouch[0].x && touches[1].x < lastTouch[1].x)
        {
            Vector2 deltaPos = touches[0]-lastTouch[0];//触摸点位置,在两帧时间内的改变(即这一帧触摸点的位置,减去前一帧触摸点的位置)
            ...
        }
        if (touches[0].y > lastTouch[0].y && touches[1].y > lastTouch[1].y)
        {
            Vector2 deltaPos = touches[0]-lastTouch[0];//触摸点位置,在两帧时间内的改变(即这一帧触摸点的位置,减去前一帧触摸点的位置)
           ...
        }
        if (touches[0].y < lastTouch[0].y && touches[1].y <lastTouch[1].y)
        {
            Vector2 deltaPos = touches[0]-lastTouch[0];//触摸点位置,在两帧时间内的改变(即这一帧触摸点的位置,减去前一帧触摸点的位置)
            ...
        }
    }
    //最小缩放到 a 倍   
    public void ScaleWithTwoFingures(Vector3 scale,float a)
    {
        if (scale.x > a && scale.y > a && scale.z > a)
        {
            ...
        }
    }

TouchUp

void TouchUp(Vector2[] touchesPos)
    {
        lastTouch = null;
        lastTouch_Single = Vector2.zero;
    }

相关推荐

  1. unity屏幕事件

    2024-01-06 03:40:02       68 阅读
  2. unity屏幕坐标转UI坐标

    2024-01-06 03:40:02       44 阅读
  3. Unity -简单键鼠事件

    2024-01-06 03:40:02       57 阅读
  4. Unity:UI进入离开事件

    2024-01-06 03:40:02       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-06 03:40:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-06 03:40:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-06 03:40:02       82 阅读
  4. Python语言-面向对象

    2024-01-06 03:40:02       91 阅读

热门阅读

  1. 最大似然与交叉熵之间的关系以及互相推导过程

    2024-01-06 03:40:02       65 阅读
  2. 测试:常见的虚拟机命令

    2024-01-06 03:40:02       50 阅读
  3. OpenCV-Python(28):基于GrabCut 算法交互式前景提取

    2024-01-06 03:40:02       60 阅读
  4. 宝塔安装的imagemagick不能用,必须自己手动安装

    2024-01-06 03:40:02       67 阅读
  5. 企业怎么打造私域转化闭环?

    2024-01-06 03:40:02       62 阅读
  6. CodeBus投稿落选代码——瓦片地图粗糙版 记录

    2024-01-06 03:40:02       60 阅读
  7. 【学习记录】找最低位1/模块多次例化

    2024-01-06 03:40:02       64 阅读
  8. 《微信小程序开发从入门到实战》学习七十二

    2024-01-06 03:40:02       61 阅读