【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

目录
相关文章
|
8月前
|
存储 图形学
浅谈Unity之模型裁剪shader
Unity之模型裁剪shader
|
8月前
|
图形学
浅谈Unity之ShaderGraph-模型膨胀流动
Unity之ShaderGraph-模型膨胀流动
|
9月前
|
图形学
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)
362 0
|
图形学
Unity 导入原神人物模型
Unity 导入原神人物模型
2761 2
Unity 导入原神人物模型
|
图形学
Unity 模型中心点偏移问题解决方法
Unity 模型中心点偏移问题解决方法
950 1
Unity 模型中心点偏移问题解决方法
|
图形学 开发者
Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理
Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理
284 0
Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理
“谁做虚拟仿真不得遇到个拆分模型呀”——分享如何使用Unity拆分3D模型
在仿真开发中,会遇到将模型进行移动、放大、旋转、拆分、合并等操作,其他的移动、放大、旋转都有比较多的例子进行参考,今天就分享一下如何将物体进行拆分
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
|
图形学 机器人
带你读《Unity游戏开发(原书第3版)》之三:模型、材质和纹理
本书主要介绍Unity2018的使用和游戏开发流程中涉及的各种知识。每一章的结构特别清晰,先综述该章要介绍的内容,然后一步步深入讲解,中间穿插着很多动手做的实践操作,可以让读者加深对某个概念、方法的理解,每章的最后还有一个小测验和一个稍微大一点的实践练习,用于巩固该章的学习内容。