话不多说,先看实现效果!
编辑
想要更牛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; } }
脚本二:单击、双击、滑动页面
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; //记录时间 } } }