【Unity触控】实现缩放和360度观察模型、单击、双击、滑动

简介: Unity实现触控效果

话不多说,先看实现效果!

image.gif编辑

想要更牛X一点可以和AR增强现实技术相结合,如下效果

 若想实现以上的AR增强现实效果可参考以下文章

(2条消息) EasyAR实战项目图像识别与模型交互(全网首发,保姆级教程)_北村南的博客-CSDN博客_easyar

工具

我们主要使用Unity官方提供的Touch接口,里面已经包含了大量的触屏操作,完全满足我们的一般业务需求,该接口中主要方法如下

Touch接口

altitudeAngle 0 弧度值指示触笔平行于表面,pi/2 指示垂直。
azimuthAngle 0 弧度值指示触笔指向沿着设备 X 轴方向。
deltaPosition 自上次像素坐标更改以来的位置增量。
deltaTime 自记录的 Touch 值上次更改以来经过的时间。
fingerId 触摸的唯一索引。
maximumPossiblePressure 平台的最大可能压力值。如果 Input.touchPressureSupported 返回 false,此属性的值将始终为 1.0f。
phase 描述触摸阶段。
position 触摸在屏幕空间中的位置(像素坐标)。
pressure 当前应用于触摸的压力大小。1.0f 被视为平均触摸压力。如果 Input.touchPressureSupported 返回 false,此属性的值将始终为 1.0f。
radius 触摸半径的估计值。加上 radiusVariance 可获得最大触摸大小,减去它可获得最小触摸大小。
radiusVariance 此值确定触摸半径的精度。半径加上此值可获得最大触摸大小,减去它可获得最小触摸大小。
rawPosition 触摸触点在屏幕空间中的第一个位置(像素坐标)。
tapCount 点击次数。
type 用于指示触摸是 Direct、Indirect(或远程)还是 Stylus 类型的值。

TouchPhase

该变量是一个枚举类型,其中包含可能的手指触摸状态。这些状态表示手指在最近的帧更新时可以采取的操作。因为设备在整个“生命周期”中对触摸进行跟踪,所以触摸的开始和结束以及之间的移动可以在发生触摸的帧上报告。

Began 手指触摸了屏幕。
Moved 手指在屏幕上进行了移动。
Stationary 手指正在触摸屏幕但尚未移动。
Ended 从屏幕上抬起了手指。这是最后一个触摸阶段。
Canceled 系统取消了对触摸的跟踪。

详细解释见官方文档

UnityEngine.Touch - Unity 脚本 API

脚本代码

编写脚本,随后将脚本放置于模型上即可

脚本一:放缩+360度旋转模型

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class suofang : MonoBehaviour
{
    private Touch oldTouch1;  //上次触摸点1(手指1)
    private Touch oldTouch2;  //上次触摸点2(手指2)
    void Update()
    {
        //没有触摸,就是触摸点为0
        if (Input.touchCount <= 0)
        {
            return;
        }
        //单点触摸, 水平上下旋转
        if ( Input.touchCount ==1)
        {
            Touch touch = Input.GetTouch(0);
            Vector2 deltaPos = touch.deltaPosition;
            transform.Rotate(Vector3.down * deltaPos.x, Space.World);//绕Y轴进行旋转
            transform.Rotate(Vector3.right * deltaPos.y, Space.World);//绕X轴进行旋转,下面我们还可以写绕Z轴进行旋转
        }
        //多点触摸, 放大缩小
        Touch newTouch1 = Input.GetTouch(0);
        Touch newTouch2 = Input.GetTouch(1);
        //第2点刚开始接触屏幕, 只记录,不做处理
        if (newTouch2.phase == TouchPhase.Began)
        {
            oldTouch2 = newTouch2;
            oldTouch1 = newTouch1;
            return;
        }
        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
        //两个距离之差,为正表示放大手势, 为负表示缩小手势
        float offset = newDistance - oldDistance;
        //放大因子, 一个像素按 0.01倍来算(100可调整)
        float scaleFactor = offset / 75f;
        Vector3 localScale = transform.localScale;
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
                                    localScale.y + scaleFactor,
                                    localScale.z + scaleFactor);
        //在什么情况下进行缩放
        if (scale.x >= 0.5f && scale.y <= 2f)
        {
            transform.localScale = scale;
        }
        //记住最新的触摸点,下次使用
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;
    }
}

image.gif

脚本二:单击、双击、滑动页面

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class chuping : MonoBehaviour
{
    public Text LeftRightTips;          //左右划屏
    public Text UpDownTips;             //上下划屏
    public Text DoubleClickTips;        //双击
    private Vector2 DeltaArea;       //二维向量,滑屏区域
    private bool BoolSecondClick;           //是否为第二次点击
    private float FloFirstTime=0f;          //第一次点击时间
    private float FloSecondTime=0f;         //第二次点击时间
    // Use this for initialization
    void Start () {
        //初始化,测试数值
        DeltaArea = Vector2.zero;
  }
  // Update is called once per frame
  void Update () {
        /* 手指离开屏幕 */
        //Input.touchCount是静态整形变量,当一只手指接触到屏幕时返回1,二只手指返回2,以此类推。
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Ended))
        {    
            DeltaArea = Vector2.zero;
            //DoubleClickTips.text = "";          //如果手指离开屏幕,双击效果消失
        }
        /* 识别手指滑屏 */
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Moved))
        {
            DeltaArea.x += Input.GetTouch(0).deltaPosition.x;           //不断获取手指触屏时x,y轴的变化量并赋值给滑屏区域
            DeltaArea.y += Input.GetTouch(0).deltaPosition.y;
            if (DeltaArea.x > 150)
            {
                LeftRightTips.text = "右滑屏";
            }else if(DeltaArea.x < -150)
            {
                LeftRightTips.text = "左滑屏";
            }
            if (DeltaArea.y > 150)
            {
                UpDownTips.text = "上滑屏";
            }else if (DeltaArea.y <- 150)
            {
                UpDownTips.text = "下滑屏";
            }
        }
        /* 手指双击识别*/
        if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Began))
        {
            FloSecondTime = Time.time;
            if (FloSecondTime - FloFirstTime > 0.02F && FloSecondTime - FloFirstTime < 0.3F)            
            {//当第二次点击与第一次点击的时间间隔在0.02秒至0.3秒之间时
                DoubleClickTips.text = "双击了屏幕!";
            }
            else
            {
                DoubleClickTips.text = "单击了屏幕!";
            }
            FloFirstTime = Time.time;       //记录时间
        }
    }
}

image.gif

目录
相关文章
|
3月前
|
图形学
小功能⭐️Unity判断是否单击到了UI
小功能⭐️Unity判断是否单击到了UI
|
5月前
|
图形学
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
145 1
|
5月前
|
存储 图形学
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
93 0
|
5月前
|
存储 图形学
【unity实战】Unity实现2D人物双击疾跑
【unity实战】Unity实现2D人物双击疾跑
50 0
|
存储 图形学
浅谈Unity之模型裁剪shader
Unity之模型裁剪shader
|
图形学
浅谈Unity之ShaderGraph-模型膨胀流动
Unity之ShaderGraph-模型膨胀流动
|
图形学
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
526 0
【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
展示3D模型,同时实现模型自动旋转和触屏旋转和缩放
379 0
|
图形学
Unity 导入原神人物模型
Unity 导入原神人物模型
4316 2
Unity 导入原神人物模型
|
图形学
Unity 模型中心点偏移问题解决方法
Unity 模型中心点偏移问题解决方法
1166 1
Unity 模型中心点偏移问题解决方法