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

unity触摸模型 unity触控_c#

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

unity触摸模型 unity触控_unity触摸模型_02

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

工具 

我们主要使用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;       //记录时间
                                                                                                                                                                                                                                                                                                                                      
        }

    }

}