Unity用Input.touches实现手机端多点触控
多点触控的方法,两边的触控互不干扰;
主要采用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实现手机端多点触控的更多相关文章
- 手机端html5触屏事件(touch事件)
touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...
- (转)手机端html5触屏事件(touch事件)
本文转载自:http://blog.sina.com.cn/s/blog_51048da70101f0ex.html touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时 ...
- 与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触控
原文:与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触 ...
- 转:手机端html5触屏事件(touch事件)
touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...
- 新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案
在 appium2.0 之前,在移动端设备上的触屏操作,单手指触屏和多手指触屏分别是由 TouchAction 类,Multiaction 类实现的. 在 appium2.0 之后,这 2 个方法将会 ...
- windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
http://blog.csdn.net/wangrenzhu2011/article/details/7732907 (转) 实现方法: 对Manipulation进行抽象化 使不同容器可共用多点缩 ...
- Android开发实例之多点触控程序
智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...
- MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件
原文 MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...
- 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)
touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 touchend 手指触摸动作结束 ...
随机推荐
- typora 使用Markdown语法编辑文本
MarkDown语法 标题 一级标题# 二级标题## ============= 三级标题### 四级标题 依此类推 Markdown 段落格式 Markdown 段落没有特殊的格式,直接编写文字,段 ...
- CSAPP shell Lab 详细解答
Shell Lab的任务为实现一个带有作业控制的简单Shell,需要对异常控制流特别是信号有比较好的理解才能完成.需要详细阅读CS:APP第八章异常控制流并理解所有例程. Slides下载:https ...
- NOIP集训题目解析
11.01 子段和 题目大意 给定一个长度为 \(n\) 的序列 \(a\) ,\(a_i=\{ -1,0,1 \}\) ,需要将 \(a\) 中的 \(0\) 变为 \(1\) 或 \(-1\) , ...
- 一比一还原axios源码(六)—— 配置化
上一章我们完成了拦截器的代码实现,这一章我们来看看配置化是如何实现的.首先,按照惯例我们来看看axios的文档是怎么说的: 首先我们可以可以通过axios上的defaults属性来配置api. 我们可 ...
- C++ 接口的实现方式
一.接口的定义 有时候,我们得提供一些接口给别人使用.接口的作用,就是提供一个与其他系统交互的方法.其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供 给外部的接口来与你进行通信.根据 ...
- Java基础—字符串的比较
1."=="方法进行比较时有以下两种情况: 基础数据类型:比较的是数据值是否相同 引用类型:比较的是地址值是否相同 字符串是对象,它比较内容是通过一个方法实现的,equals() ...
- 配置 PackMan 镜像
一.参考链接 阿里云镜像站 二.PackMan 镜像介绍 Packman 是 OpenSUSE 最大的第三方软件源,主要为 OpenSUSE 提供额外的软件包,包括音视频解码器.多媒体应用.游戏等. ...
- 手把手带你使用ZigBee——通过爱智控制EFR32,以及 Simplicity Studio 使用过程中注意事项
前言 兄弟们,我发现一个有意思的东西,我在爱智官网翻资料的时候,发现他们终于终于把官网文档的索引优化了!有一说一,真是方便不少,终于不再是一堆文档糊在一坨了. 另外我还发现他们居然做了一个EFR32的 ...
- 【论文阅读】CVPR2021: MP3: A Unified Model to Map, Perceive, Predict and Plan
Sensor/组织: Uber Status: Reading Summary: 非常棒!端到端输出map中间态 一种建图 感知 预测 规划的通用框架 Type: CVPR Year: 2021 引用 ...
- C++获取设备 PID,VID 信息
可直接编译(设置成:使用多字节字符集) 转来的,代码: /* http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.h ...