• unity 单指双指事件(单指点击移动,双指滑动拖放)


      1 using System.Collections;
      2 using System.Collections.Generic;
      3 using UnityEngine;
      4 
      5 public class TouchControl : MonoBehaviour {
      6 
      7     private Vector3 startFingerPos;
      8     private Vector3 endFingerPos;
      9     private float xMoveDistance;
     10     private float yMoveDistance;
     11     private int backValue = 0;
     12 
     13     private Vector3 target;
     14     private Vector3 offSet;
     15     private bool isOver = true;
     16 
     17     void FingerRotation()
     18     {
     19 
     20         xMoveDistance = Mathf.Abs(endFingerPos.x - startFingerPos.x);
     21         yMoveDistance = Mathf.Abs(endFingerPos.y - startFingerPos.y);
     22 
     23         if (xMoveDistance > yMoveDistance)
     24         {
     25 
     26             if (endFingerPos.x - startFingerPos.x > 0)
     27             {
     28                 backValue = -1; //沿着X轴负方向移动  
     29             }
     30             else
     31             {
     32                 backValue = 1; //沿着X轴正方向移动  
     33             }
     34 
     35         }
     36         if (backValue == -1)
     37         {
     38             transform.Rotate(Vector3.down * Time.deltaTime * 150, Space.Self);
     39         }
     40         else if (backValue == 1)
     41         {
     42             transform.Rotate(Vector3.up * Time.deltaTime * 150, Space.Self);
     43         }
     44 
     45 
     46     }
     47 
     48     void MoveTo(Vector3 tar)
     49     {
     50         if (!isOver)
     51         {
     52             Vector3 offSet = tar - transform.position;
     53             transform.position += offSet.normalized * 5 * Time.deltaTime;
     54             if (Vector3.Distance(tar, transform.position) < 0.5f)
     55             {
     56                 isOver = true;
     57                 transform.position = tar;
     58             }
     59         }
     60 
     61     }
     62 
     63 
     64     // Use this for initialization
     65     void Start()
     66     {
     67 
     68     }
     69 
     70     // Update is called once per frame
     71     void Update()
     72     {
     73 
     74         //没有触摸  
     75         if (Input.touchCount <= 0)
     76         {
     77             //MoveTo(target);
     78         }
     79 
     80         if(Input.touchCount==1)//单指操作
     81         {
     82             Touch t1 = Input.GetTouch(0);
     83             if ( t1.phase==TouchPhase.Began)
     84             {
     85                 //1. 获取鼠标点击位置
     86                 //创建射线;从摄像机发射一条经过鼠标当前位置的射线
     87                 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//Input.GetTouch(0).position);
     88                                                                             //发射射线
     89                 RaycastHit hitInfo = new RaycastHit();
     90                 if (Physics.Raycast(ray, out hitInfo))
     91                 {
     92                     //获取碰撞点的位置
     93                     if (hitInfo.collider.name == "Plane")
     94                     {
     95                         target = hitInfo.point;
     96                         target.y = 0.5f;
     97                         isOver = false;
     98                     }
     99                 }
    100                 transform.LookAt(target);
    101             }
    102             //2. 让角色移动到目标位置
    103             MoveTo(target);
    104         }
    105         else if(Input.touchCount>1)//多指操作
    106         {
    107             Touch t1 = Input.GetTouch(0);
    108             Touch t2 = Input.GetTouch(1);
    109             //单点触控记录初始点
    110             if (t1.phase == TouchPhase.Began)
    111             {
    112                 startFingerPos = t2.position;
    113             }
    114 
    115             endFingerPos = t2.position;//实时手指位置 
    116 
    117             if ((t1.phase == TouchPhase.Moved)&& (t2.phase == TouchPhase.Moved)) //双指滑动进行物体旋转
    118             {
    119                 FingerRotation();
    120                 return;
    121             }//物体旋转
    122 
    123         }
    124         MoveTo(target);
    125     }
    126 }

    Touch.position 是 一个 像素坐标(手机左下角为(0,0))

    Touch.phase {Began,Moved,Stationary,Canceled,Ended} 代表 手指点击的状态

    每次手指点击会在input.touches[]增加一个touch实例,记录手指的状态信息,当有一个手指退出屏幕,那么数组中的位置产生一个空缺,

    当有新手指加入时候,新手指将替代刚刚退出的手指在数组中的位置。记得在手指退出屏幕时候,将手指所绑定的跟踪信息重新初始化。

    Input.touchCount 触摸随之增长,一秒50次增量。

    Input.GetTouch(0).phase==TouchPhase.Moved 手指滑动中最后一帧滑动的状态是运动的。

    TouchPhase  触摸的几个状态。

    Touch.deltaPosition 增量位置(Input.GetTouch(0).deltaPosition)最后一帧滑动的值,只返回xy轴坐标,也可用vector3(z轴为0),所以一般用vector2接收。

  • 相关阅读:
    621
    Java里的日期和时间学习
    [置顶] 宏扩展和参数扫描
    android 按字母搜索
    使用Eclipse EE开发web项目
    免解压版的Mysql的启动脚本,并且执行导入(windows)
    高焕堂《android从程序员到架构师之路》 YY讲坛直面大师学习架构设计
    Android 计时与倒计时
    poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
    字符型驱动程序的结构框架
  • 原文地址:https://www.cnblogs.com/zyn95186/p/7341526.html
Copyright © 2020-2023  润新知