多点触控的方法,两边的触控互不干扰;

主要采用Input.touches的相关属性进行操作;

而采用IPointerDrag接口会造成两个drag的相互干扰;

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class TouchFunc : MonoBehaviour
{
//左边的
Vector3 beginDragPos_Left;
Vector3 dragVector_Left;
Vector3 dragVectorOne_Left;
bool isDraging_Left; //右边的
Vector3 beginDragPos_Right;
Vector3 dragVector_Right;
Vector3 dragVectorOne_Right;
bool isDraging_Right; //控制的对象
Vector3 mousePosition_Current;
Vector3 mousePosition_Mobile; float mouseMoveSpeed;
GameObject moveCenter_Mobile;
GameObject aimCenter_Mobile; GameObject fireButton_Mobile;
public static bool isDragFromFireButton; //某点触控
void TouchPoint( int index)
{
//左边
if (Input.GetTouch(index).position.x < Screen.width / 2)
{
if (Input.GetTouch(index).phase == TouchPhase.Began)
{
beginDragPos_Left = Input.GetTouch(index).position;
}
if (Input.GetTouch(index).phase == TouchPhase.Moved)
{
dragVector_Left += new Vector3(Input.GetTouch(index).deltaPosition.x, Input.GetTouch(index).deltaPosition.y,0);
dragVectorOne_Left = dragVector_Left.normalized; isDraging_Left = true;
}
//右边
if (Input.GetTouch(index).phase == TouchPhase.Ended)
{
dragVector_Left = Vector3.zero;
dragVectorOne_Left = Vector3.zero;
isDraging_Left = false;
}
}
else
{
if (Input.GetTouch(index).phase == TouchPhase.Began)
{
beginDragPos_Right = Input.GetTouch(index).position;
}
if (Input.GetTouch(index).phase == TouchPhase.Moved)
{
dragVector_Right+= new Vector3(Input.GetTouch(index).deltaPosition.x, Input.GetTouch(index).deltaPosition.y, 0);
dragVectorOne_Right = dragVector_Right.normalized;
isDraging_Right = true;
}
if (Input.GetTouch(index).phase == TouchPhase.Ended)
{
dragVector_Right = Vector3.zero;
dragVectorOne_Right = Vector3.zero;
isDraging_Right = false;
}
}
} void TouchMethod()
{
if (Input.touchCount == 1) TouchPoint(0);
if (Input.touchCount == 2) { TouchPoint(0); TouchPoint(1); }
} void DragFrom()
{
float width = fireButton_Mobile.GetComponent<Image>().rectTransform.rect.size.x;
float height = fireButton_Mobile.GetComponent<Image>().rectTransform.rect.size.y;
Vector3 pos = fireButton_Mobile.transform.position;
if (beginDragPos_Right.x > pos.x - width / 2 && beginDragPos_Right.x < pos.x + width / 2 && beginDragPos_Right.y > pos.y - height / 2 && beginDragPos_Right.y < pos.y + height / 2)
{ isDragFromFireButton = true; }
else { isDragFromFireButton = false; } if (isDraging_Right) PlayerBehavior.Instance.fireButtonDown_Mobile = true;
else PlayerBehavior.Instance.fireButtonDown_Mobile = false;
}
//判断是否在拖动、修复判定bug
void StateJudge()
{
if (Input.touchCount == 0)
{
isDraging_Left = false;
isDraging_Right = false;
}
}
void RightDrag()
{
//if (isDragFromFireButton) mouseMoveSpeed = 0.5f;
//else mouseMoveSpeed = 1f; //瞄准按钮中心移动
if (isDraging_Right)
aimCenter_Mobile.transform.localPosition = Vector3.Lerp(aimCenter_Mobile.transform.localPosition, dragVectorOne_Right * Mathf.Clamp(dragVector_Right.magnitude, 0, 90), 0.2f);
if (!isDraging_Right)
aimCenter_Mobile.transform.localPosition = Vector3.Lerp(aimCenter_Mobile.transform.localPosition, Vector3.zero, 0.2f); //光标位置
if (isDraging_Right)
{
Vector3 tempVec = new Vector3(Screen.width / 2, Screen.height / 2, 0) + dragVector_Right * mouseMoveSpeed;
mousePosition_Mobile = new Vector3(Mathf.Clamp(tempVec.x, 0, Screen.width), Mathf.Clamp(tempVec.y, 0, Screen.height), 0);
}
if (!isDraging_Right)
{
mousePosition_Current = new Vector3(Screen.width / 2, Screen.height / 2, 0);
mousePosition_Mobile = Vector3.Lerp(mousePosition_Mobile, mousePosition_Current,0.1f);
} //把触控输入传给Player,以控制玩家转向和瞄准
PlayerBehavior.Instance.mousePosition_Mobile = mousePosition_Mobile;
}
//控制运动、运动按钮的动作
void LeftDrag()
{
//移动按钮中心移动
if (isDraging_Left)
moveCenter_Mobile.transform.localPosition = Vector3.Lerp(moveCenter_Mobile.transform.localPosition, dragVectorOne_Left * Mathf.Clamp(dragVector_Left.magnitude, 0, 90), 0.2f);
if (!isDraging_Left)
moveCenter_Mobile.transform.localPosition = Vector3.Lerp(moveCenter_Mobile.transform.localPosition, Vector3.zero, 0.2f);
//数据传入,以控制玩家移动
PlayerBehavior.Instance.moveVectorOne_Mobile = dragVectorOne_Left;
//是否移动中的判定
if (isDraging_Left && dragVector_Left.magnitude > 10) PlayerBehavior.Instance.isMoving_Mobile = true;
else PlayerBehavior.Instance.isMoving_Mobile = false; } // Start is called before the first frame update
void Start()
{
moveCenter_Mobile = GameObject.Find("MoveCenter_Mobile");
aimCenter_Mobile = GameObject.Find("AimCenter_Mobile");
mousePosition_Mobile = new Vector3(Screen.width / 2, Screen.height / 2, 0);
fireButton_Mobile = GameObject.Find("FireButton_Mobile");
//光标移动速度
mouseMoveSpeed = 1f; } // Update is called once per frame
void Update()
{
if (!GameManager.Instance.isInputMobileShow) return;
if (PlayerBehavior.Instance.leveUp || (!PlayerBehavior.Instance.isAlive)) return;
TouchMethod(); StateJudge();
RightDrag();
LeftDrag(); } }

Unity用Input.touches实现手机端多点触控的更多相关文章

  1. 手机端html5触屏事件(touch事件)

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  2. (转)手机端html5触屏事件(touch事件)

    本文转载自:http://blog.sina.com.cn/s/blog_51048da70101f0ex.html touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时 ...

  3. 与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触控

    原文:与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触 ...

  4. 转:手机端html5触屏事件(touch事件)

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  5. 新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案

    在 appium2.0 之前,在移动端设备上的触屏操作,单手指触屏和多手指触屏分别是由 TouchAction 类,Multiaction 类实现的. 在 appium2.0 之后,这 2 个方法将会 ...

  6. windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放

    http://blog.csdn.net/wangrenzhu2011/article/details/7732907 (转) 实现方法: 对Manipulation进行抽象化 使不同容器可共用多点缩 ...

  7. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  8. MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

    原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...

  9. 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)

    touchstart     手指触摸动作开始 touchmove    手指触摸后移动 touchcancel  手指触摸动作被打断,如来电提醒,弹窗 touchend      手指触摸动作结束 ...

随机推荐

  1. VirtualBox虚拟机-安装增强功能

    virtualbox中win10虚拟机怎么安装增强功能 安装VBoxGuestAdditions增强功能后,可增加以下功能: 鼠标集成: 可以无缝的在宿主机与虚拟机之间移动鼠标. 自适应窗口:可以任意 ...

  2. MM32F0140 GPIO驱动LED灯(MM32F0140 GPIO)

    目录: 1.MM32F0140简介 2.MM32F0140系统时钟配置 3.MM32F0140的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0140 GPIO驱 ...

  3. Jmeter混合场景压力测试

    性能测试设计混合场景,一般有几种方式 分别是:1:每个场景设置一个线程组:2:使用if控制器:3:使用吞吐量控制器. 不同的方式实现机制不一样,个人觉得"使用吞吐量控制器"比较方便 ...

  4. react的”Hello World !“

    本文主要简述react的开始使用 1.引入js文件 <!-- 1.核心文件 --> <script crossorigin src="https://unpkg.com/r ...

  5. javaScript阻止浏览器F5刷新

    1 <script type="text/javascript"> 2 //禁止用F5键 3 document.onkeydown = function (e) { 4 ...

  6. LOTO新型号支持串口蓝牙示波器

    LOTO串口/蓝牙示波器面世 LOTO一直专注在虚拟示波器领域,以USB虚拟示波器为基础,扩展了很多功能模块,可以把Windows示波器,信号源,逻辑分析仪,频谱分析,数据记录,安卓手机平板支持,隔离 ...

  7. python之pyc

    pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后, 加载的速度有所提高,而且pyc是一种跨平台的字节码,是由Python的虚拟机来执行的, ...

  8. 前端—我的第一篇博客 梦开始的地方(面向对象版tab栏)

    这是我的第一篇博客 博客生涯才开始 但是人生已经过去了二十个年头了 才开始弄这个 也没搞得太懂 我原本的想法是想搞个源代码上来 但是看了半天好像就只能传html源代码 那我还有css js的部分呢 我 ...

  9. ArcGIS Server 禁用/rest/services路径(禁用服务目录)

    ArcGIS Server服务目录(路径如:http://<hostname>:6080/arcgis/rest/services)默认可以不需要登陆直接打开.效果如下图. ArcGIS服 ...

  10. VMware安装win7后,安装VMware Tools时报错安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1

    具体报错: 倘若你用的是这样的镜像:cn_windows_7_enterprise_x64_dvd_x15-70741.iso 换镜像源.换镜像源.换镜像源! 换成带sp1的iso镜像:cn_wind ...