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

主要采用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. 【面经】Java面试突击

    基础语法 基本数据结构 Java 的基本数据类型有 8 种,包括 6 种数字类型.1 种字符类型和 1 种布尔类型. 基本数据类型总览 数字类型包括 4 种整数类型和 2 种浮点数类型,4 种整数类型 ...

  2. 矩池云安装gdal五种解决方案

    1.最快最靠谱的是conda conda install gdal 命令行conda/pip search gdal查看版本,选择合适的版本,例如:conda search gdal 命令行conda ...

  3. laravel 返回统一的json数据

    laravel 在Api接口开发中,可以使用 response()->json(["code"=>200,"msg"=>"ok&qu ...

  4. 华为三层交换机5700 DHCP配置

    交换机配置DHCP配置 1,交换机作DHCP Server『配置环境参数』1. PC1.PC2的网卡均采用动态获取IP地址的方式2. PC1连接到交换机的以太网端口0/1,属于VLAN10:PC2连接 ...

  5. AT1219题解

    题意 设 \(a\) 的价值为 \(a \times cnt_a\)(\(cnt_a\) 为 \(a\) 在区间中出现的次数),求区间种某种元素,使得这种元素的价值最大. 因为设计出现元素的次数,所以 ...

  6. python关于openpyxl的二次开发

    from openpyxl import load_workbook class Excel_util: def __init__(self,path): self.path=path # 加载输入路 ...

  7. 揭秘.NET Core剪裁器背后的技术

    十天前,我发布了对.NET Core程序进行瘦身的开源软件Zack.DotNetTrimmer,与.NET Core内置的剪裁器相比,Zack.DotNetTrimmer不仅对程序的剪裁效果更好,而且 ...

  8. 什么是Hystrix?

    防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)服务降级:双十一 提示 哎哟喂,被挤爆了. app秒杀 网络开小差了,请稍后再试.优先核心服务,非核心服务不可用 ...

  9. C# 如何让new 出来的form显示在最外层?

    /// <summary> /// 显示比对不同点的位置 /// </summary> public void showDiffImage() { //在此处弹出不一样图 Bi ...

  10. redis有哪些功能

    基于本机内存的缓存 为了解决调用API依然需要2秒的问题,经过排查,其主要原因在于使用SQL获取热点新闻的过程中消耗了将近2秒的时间,于是乎,我们又想到了一个简单粗暴的解决方案,即把SQL查询的结果直 ...