月份:2022年7月

Unity3d 实现移动端的触摸屏操作-场景的缩放移动

通过Input.touchCount来判断触控点位,通过Input.GetTouch(0).phase来判断移动的类型。

其中phase(状态)有以下这几种:
Began:手指刚刚触摸屏幕
Moved:手指在屏幕上移动
Stationary:手指触摸屏幕,但自最后一阵没有移动
Ended:手指离开屏幕
Canceled:系统取消触控跟踪,原因如把设备放在脸上或同时超过5个触摸点

代码中主要用到的是TouchPhase.Began和TouchPhase.Moved。
完整代码如下,放置到主摄像机上即可:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MobileTouch : MonoBehaviour
{
    //是否缩放
    private bool IsZoom = false;
    //当前双指触控间距
    private float DoubleTouchCurrDis;
    //过去双指触控间距
    private float DoubleTouchLastDis;

    //记录手指触碰的位置
    Vector2 m_screenPos = new Vector2();

    void Start()
    {

    }

    void Update()
    {
        if ((Input.touchCount > 1) && (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved))
        {
            // 多点触控
            Touch touch1 = Input.GetTouch(0);
            Touch touch2 = Input.GetTouch(1);

            DoubleTouchCurrDis = Vector2.Distance(touch1.position, touch2.position);

            if (!IsZoom)
            {
                DoubleTouchLastDis = DoubleTouchCurrDis;
                IsZoom = true;
            }

            float distance = DoubleTouchCurrDis - DoubleTouchLastDis;
            Camera.main.fieldOfView += (distance > 0 ? -1 : 1) * 1;//更改了摄像头的高度
            DoubleTouchLastDis = DoubleTouchCurrDis;
        }
        else if (Input.touchCount == 1)
        {
            // 单点移动
            if (Input.touches[0].phase == TouchPhase.Began)
            {
                //记录手指刚触碰的位置
                m_screenPos = Input.touches[0].position;
            }
            if (Input.touches[0].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机
            {
                transform.Translate(new Vector3(Input.touches[0].deltaPosition.x * Time.deltaTime * -1, Input.touches[0].deltaPosition.y * Time.deltaTime * -1, 0));
            }
        }
    }
}