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

主要采用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. Liunxa安装Nignx,Git

    Linux安装Nignx 1.安装依赖 执行语句 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel open ...

  2. 国产化之Arm64 CPU+银河麒麟系统安装.NetCore

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,银河麒麟就是一个Linux发行版,数据库使用达梦V8,这个数据库很多概念和Oracle相似,CPU平台的范围:龙芯.飞腾.鲲鹏等. ...

  3. MAT工具分析Dump文件(大对象定位)

    前段时间线上服务经常发生卡顿,经过排查发现是大对象引起的Fullgc问题,特此记录排查逻辑. 目录 目的 一.获得服务进程 二.生成dump文件 三.下载mat工具 四.使用mat工具导入第二步生成的 ...

  4. React学习小结(一)

    一.React的发展 facebook在构建instagram网站的时候遇见两个问题: 1.数据绑定的时候,大量操作真实dom,性能成本太高 2.网站的数据流向太混乱,不好控制 于是facebook起 ...

  5. CA周记 2022年的第一课 - Rust

    现代编程语言有很多,在我的编程学习里面有小学阶段的 LOGO , 中学阶段的 Pascal ,也有大学阶段的 C/C++.Java..NET,再到工作的 Objective-C .Swift.Go.K ...

  6. tensorflow源码解析之framework-graph

    目录 什么是graph 图构建辅助函数 graph_transfer_info 关系图 涉及的文件 迭代记录 1. 什么是graph graph是TF计算设计的载体,如果拿TF代码的执行和Java代码 ...

  7. Scipy的stats模块包含了多种概率分布的随机变量,随机变量分为连续和离散两种。+忽略程序中警告信息+np.newaxis解释

  8. LGP1397题解

    并不是那么的有意思呢 首先,我们可以将题目给出的地推式看做一个一次函数 \(k * x+b\),来思考一个问题,如果给出两个一次函数 \(F(x)\) 和 \(G(x)\),那么 \(F(G(x))\ ...

  9. 使用WebService的优点

    1.支持跨平台,跨语言,远程调用 WSDL:web service definition language 直译 webservice定义语言 对应一种类型的文件.wsdl2.定义了web servi ...

  10. Intellij IDEA远程debug线上项目记录

    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过 ...