当前位置:   article > 正文

【Unity触控】实现缩放和360度观察模型、单击、双击、滑动_unity 控制 game窗口 scale 滑动条

unity 控制 game窗口 scale 滑动条

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

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

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

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

工具 

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

Touch接口

altitudeAngle0 弧度值指示触笔平行于表面,pi/2 指示垂直。
azimuthAngle0 弧度值指示触笔指向沿着设备 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度旋转模型

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class suofang : MonoBehaviour
  5. {
  6. private Touch oldTouch1; //上次触摸点1(手指1)
  7. private Touch oldTouch2; //上次触摸点2(手指2)
  8. void Update()
  9. {
  10. //没有触摸,就是触摸点为0
  11. if (Input.touchCount <= 0)
  12. {
  13. return;
  14. }
  15. //单点触摸, 水平上下旋转
  16. if ( Input.touchCount ==1)
  17. {
  18. Touch touch = Input.GetTouch(0);
  19. Vector2 deltaPos = touch.deltaPosition;
  20. transform.Rotate(Vector3.down * deltaPos.x, Space.World);//绕Y轴进行旋转
  21. transform.Rotate(Vector3.right * deltaPos.y, Space.World);//绕X轴进行旋转,下面我们还可以写绕Z轴进行旋转
  22. }
  23. //多点触摸, 放大缩小
  24. Touch newTouch1 = Input.GetTouch(0);
  25. Touch newTouch2 = Input.GetTouch(1);
  26. //第2点刚开始接触屏幕, 只记录,不做处理
  27. if (newTouch2.phase == TouchPhase.Began)
  28. {
  29. oldTouch2 = newTouch2;
  30. oldTouch1 = newTouch1;
  31. return;
  32. }
  33. //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
  34. float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
  35. float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
  36. //两个距离之差,为正表示放大手势, 为负表示缩小手势
  37. float offset = newDistance - oldDistance;
  38. //放大因子, 一个像素按 0.01倍来算(100可调整)
  39. float scaleFactor = offset / 75f;
  40. Vector3 localScale = transform.localScale;
  41. Vector3 scale = new Vector3(localScale.x + scaleFactor,
  42. localScale.y + scaleFactor,
  43. localScale.z + scaleFactor);
  44. //在什么情况下进行缩放
  45. if (scale.x >= 0.5f && scale.y <= 2f)
  46. {
  47. transform.localScale = scale;
  48. }
  49. //记住最新的触摸点,下次使用
  50. oldTouch1 = newTouch1;
  51. oldTouch2 = newTouch2;
  52. }
  53. }

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class chuping : MonoBehaviour
  6. {
  7. public Text LeftRightTips; //左右划屏
  8. public Text UpDownTips; //上下划屏
  9. public Text DoubleClickTips; //双击
  10. private Vector2 DeltaArea; //二维向量,滑屏区域
  11. private bool BoolSecondClick; //是否为第二次点击
  12. private float FloFirstTime=0f; //第一次点击时间
  13. private float FloSecondTime=0f; //第二次点击时间
  14. // Use this for initialization
  15. void Start () {
  16. //初始化,测试数值
  17. DeltaArea = Vector2.zero;
  18. }
  19. // Update is called once per frame
  20. void Update () {
  21. /* 手指离开屏幕 */
  22. //Input.touchCount是静态整形变量,当一只手指接触到屏幕时返回1,二只手指返回2,以此类推。
  23. if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Ended))
  24. {
  25. DeltaArea = Vector2.zero;
  26. //DoubleClickTips.text = ""; //如果手指离开屏幕,双击效果消失
  27. }
  28. /* 识别手指滑屏 */
  29. if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Moved))
  30. {
  31. DeltaArea.x += Input.GetTouch(0).deltaPosition.x; //不断获取手指触屏时x,y轴的变化量并赋值给滑屏区域
  32. DeltaArea.y += Input.GetTouch(0).deltaPosition.y;
  33. if (DeltaArea.x > 150)
  34. {
  35. LeftRightTips.text = "右滑屏";
  36. }else if(DeltaArea.x < -150)
  37. {
  38. LeftRightTips.text = "左滑屏";
  39. }
  40. if (DeltaArea.y > 150)
  41. {
  42. UpDownTips.text = "上滑屏";
  43. }else if (DeltaArea.y <- 150)
  44. {
  45. UpDownTips.text = "下滑屏";
  46. }
  47. }
  48. /* 手指双击识别*/
  49. if (Input.touchCount == 1 && (Input.GetTouch(0).phase == TouchPhase.Began))
  50. {
  51. FloSecondTime = Time.time;
  52. if (FloSecondTime - FloFirstTime > 0.02F && FloSecondTime - FloFirstTime < 0.3F)
  53. {//当第二次点击与第一次点击的时间间隔在0.02秒至0.3秒之间时
  54. DoubleClickTips.text = "双击了屏幕!";
  55. }
  56. else
  57. {
  58. DoubleClickTips.text = "单击了屏幕!";
  59. }
  60. FloFirstTime = Time.time; //记录时间
  61. }
  62. }
  63. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/496338
推荐阅读
相关标签
  

闽ICP备14008679号