目录

1.效果展示

2.博客介绍

3.具体思路和写法

(1)Touch类介绍

(2)编写Touch管理类

(3)修改摇杆控制

4.资源下载

5.推送

6.结语



1.效果展示


2.博客介绍

手游开发和端游总会有很多的差别,在端游中获取点击的方式我们会选择Input.GetMouseButton(index)。index=0,获取的就是鼠标左键;index=1,获取的就是鼠标右键;index=2,获取的就是鼠标的中键,但是在手机上可是没有鼠标的,我们有的只是手指的触碰,所以在手游开发的时候就需要在获取触碰的时候和端游用不同的方法,本篇博客基于作者上一篇UGUI摇杆的制作的文章,没有看过的同学可以简单的浏览下,本篇博客主要介绍了手游开发时,多点触控的一些操作。


3.具体思路和写法

(1)Touch类介绍

Touch类包含了手游中所有的触控信息,在PC端无意义,这里属性不一一介绍,想了解更对可自行查找API,同学们可以抽象的将Touch理解为手指,手指触摸屏幕,便实例化一个Touch,放在Input.touches数组内,我们可以通过Input.GetTouch(fingerId)来获取对应的手指信息,fingerId为Touch类的唯一标识。

(2)编写Touch管理类

基础知识我们介绍完了,我们现在来编写我们的Touch管理类,我们每次触碰屏幕的时候,需要从Input.touches中获取我们对应的手指,来拿到正确的信息,这里有一点需要注意,如果有两个手指同时在触碰屏幕,他们的fingerId分别是0和1,如果这个时候,你将fingerId为0的手指移开,那么Input.touches数组内就只有一个Touch就是fingerId为1的Touch,如果现在你再次触碰一个新手指,这个新手指分配的fingerId是0,并且在Input.touches内会排在第一位,在fingerId为1的Touch前面,这个算法会默认的将之前的空缺填补,所以获取手指信息的时候一定要注意。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// time:2018/12/16
/// author:King.Sun
/// description:Touch管理
/// </summary>
public class TouchManage
{/// <summary>/// 单例-方便获取/// </summary>private static TouchManage _instance;public static TouchManage Instance{get{if (_instance==null){_instance = new TouchManage();}return _instance;}}/// <summary>/// 该集合包含了已经被占用的手指/// </summary>public  List<Touch> useTouchList = new List<Touch>();                              /// <summary>/// 获取手指/// </summary>/// <returns></returns>public  Touch GetFinger(){Touch touch = new Touch();//在这里,如果数组内只有一个Touch你可以直接获取该手指if (Input.touchCount==1){touch = Input.GetTouch(0);}else{//如果Input.touches长度大于1,那么我们比对Input.touches和useTouchList的差异,//除去相同的,不相同的第一位就是我们要获取的手指Touchforeach (Touch tt in Input.touches){bool isUse = false;foreach (Touch utouch in useTouchList){if (tt.fingerId==utouch.fingerId){isUse = true;}}if (!isUse){touch = tt;}}}//我们获取Touch后将该Touch放在已使用的数组内,标记为已使用if (!useTouchList.Contains(touch)){useTouchList.Add(touch);}return touch;}/// <summary>/// 向已使用数组中删除手指--不用的时候我们删除手指/// </summary>/// <param name="touch"></param>public  void RemoveFinger(Touch touch){if (useTouchList.Contains(touch)){useTouchList.Remove(touch);}}
}

(3)修改摇杆控制

基于上次的摇杆控制,我们这里修改几个地方,增加摇杆的Touch,和Id

        /// <summary>/// 摇杆手指/// </summary>private Touch _joyFinger;/// <summary>/// 摇杆手指ID/// </summary>private int _joyFingerId;

并在Start中初始化和赋值

        void Start (){_joyFinger = new Touch();_joyFingerId = -1;}

在开始拖拽事件中,我们根据_joyFingerId是否为初始值来判断手否为第一次触碰,在这里从我们之前编写的TouchManager中获取手指,给摇杆位置赋值,并为_joyFingerId附上对应Touch的fingerId,这样在触碰中,即使有其他手指也不会再受影响,因为id不同,不会再进行判断。

        /// <summary>/// 开始拖动/// </summary>public void OnDragBegain(){if (_joyFingerId==-1){//获取手指_joyFinger = TouchManage.Instance.GetFinger();//移动中心点赋值_moveCenter = _joyFinger.position;//显示摇杆_joyBg.gameObject.SetActive(true);//摇杆背景位置修正到点击位置_joyBg.position = _moveCenter;//摇杆中心位置修正到点击位置_joyCenter.position = _moveCenter;_joyFingerId = _joyFinger.fingerId;}}

在拖拽进行事件中,变动不大,增加一层判断,如果手指Id不同不会进行判断,获取实时位置,采用的Input.GetTouch(index)的方法。

        /// <summary>/// 正在拖动/// </summary>public void OnDragMove(){if (_joyFinger.fingerId==_joyFingerId){//中心店到触摸点的向量赋值_mouseToCenterVect = Input.GetTouch(_joyFinger.fingerId).position - _moveCenter;//中心店到触摸点的距离计算_mouseToCenterDistance = Mathf.Clamp(_mouseToCenterVect.magnitude,0,100);//根据距离来判断摇杆中心的位置_joyCenter.position = _mouseToCenterVect.normalized * _mouseToCenterDistance + _moveCenter;//摇杆中心的X - 移动中心的x就是水平的变化值,这里 /100 控制_hor在(-1,,1)之间_hor = (_joyCenter.position.x - _moveCenter.x)/100;//摇杆中心的Y - 移动中心的Y就是垂直的变化值,这里 /100 控制_hor在(-1,,1)之间_ver = (_joyCenter.position.y - _moveCenter.y)/100;//角度就是 中心店到触摸点的向量 和 2D平面Y轴正方向的夹角,这里只能显示0——180度_rotAngle = Vector3.Angle(_mouseToCenterVect, Vector3.up);//这里根据_hor的正负来判断摇杆中心是位于移动中心左侧还是右侧,然后修改度数,显示在0——360之间if (_hor<0){_rotAngle = 360 - _rotAngle;}//Vector3.forward 以Vector3.up为中心旋转轴,旋转_rotAngle度,这里计算出主角的旋转度数_forwardTarget = Quaternion.AngleAxis(_rotAngle, Vector3.up) * Vector3.forward;}}

在拖拽结束事件当中,依旧增加一层判断,Id不同不会进行判断,判断后移除手指。

        /// <summary>/// 拖动结束/// </summary>public void OnDragEnd(){if (_joyFinger.fingerId==_joyFingerId){//水平移动值归零_hor = 0;//垂直移动值归零_ver = 0;//隐藏摇杆_joyBg.gameObject.SetActive(false);//归-1_joyFingerId = -1;//移除手指TouchManage.Instance.RemoveFinger(_joyFinger);}}

开头演示效果,只要复制一份代码和场景内物体就可以实现了,新的点击区域设置在右侧


4.资源下载

原工程:https://download.csdn.net/download/mr_sun88/10854434

测试请打包或者使用Remote

博主Unity版本号:2018.2.0


5.推送

先空着


6.结语

希望各位同学看过本篇博客后能有所收获,最好是先浏览一下前一篇文章,不然可能跳度有点大,另博主能力有限,文中若有错误的地方期望各位看家可以指点交流。

 QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

     本文属于原创文章,转载请著名作者出处并置顶!!!!!

【Unity3D】利用Touch类编写手游触控操作演示相关推荐

  1. [Unity] Input功能扩展:手游触控

    在使用Unity开发游戏时,免不了使用Input.GetAxis.Input.GetButtonDown等方法来检测玩家是否要执行前进后退.左右上下.攻击等操作. 但是在开发手游时这样不太好使了,比如 ...

  2. thinkpad触控笔怎么用_【ThinkPad X1 Yoga 2018笔记本电脑使用总结】键盘|手写笔|显示|触控板_摘要频道_什么值得买...

    ThinkPad X1 Yoga 2018笔记本电脑使用总结(键盘|手写笔|显示|触控板) 1.键盘 这篇原创全程有X1 Yoga 2018完成,X1的键盘手感应该来说很不错,比目前在用的MD223的 ...

  3. 英雄联盟怎么解除小窗口_英雄联盟手游亚索怎么操作-英雄联盟手游亚索操作攻略...

    英雄联盟手游亚索怎么操作?对于很多小伙伴来说,不换是英雄联盟手游还是端游,亚索都是一个很不错的英雄,既能快乐的玩耍,还能秀出操作,但是作为萌新就不知道亚索怎么操作了,那么英雄联盟手游亚索怎么操作?下面 ...

  4. Windows Phone 7 XNA触控操作之Gestures

    这一讲我将集中讨论Gestures(手势),以及如何在Silverlight应用程序中使用XNA程序集来简单地识别触控输入. 什么是XNA? 这整个系列的焦点是Silverlight,XNA技术可在W ...

  5. 从应用模式看 计算机应用经历了,触控操作堪比鼠标 Win 10平板电脑体验

    1Windows 10入市 经历种种艰辛 平板用户的操作交互主要是以触控为主,所以更倾向于移动端的iOS与Android更会得到平板用户们的心.反而是一直PC最强操作系统的Windows,只有在使用了 ...

  6. linux多点触摸屏驱动程序,Linux系统实现支持多点触控操作[视频]

    虽然大多数人目前还不会购买拥有触控屏的设备,不过在Windows 7的大力推动下,触控操作已经开始流行了起来.然而Linux目前却无法支持这一功能,这让很多用户十分郁闷,不过来自ENAC Intera ...

  7. 网易我的世界手机如何玩java 版_我的世界手游版如何操作 网易我的世界手游怎么玩...

    我的世界手游如何操作呢?我的世界手游公测了,那么手机版和pc版操作必然是有所不同的,手机版如何操作呢?下面我们一起来看看吧~ 第一点:基本移动 从图中我们可以看到,左边有上下左右中心五个键位,这是前后 ...

  8. Windows Phone 7 中TouchPanel的触控操作

    Windows Phone 7 有四种用户交互的方式: 按键 触控 手势 外设(例如重力感应等) 通常来说Windows Phone 7的按键一般只支持Back按键(返回键)的可控操作,其他的两个是不 ...

  9. vue 多点触控手势_涨姿势了!Appium也可以多点触控操作

    有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...

最新文章

  1. BZOJ1042 [HAOI2008]硬币购物
  2. 【分享】计算机视觉方向必备opencv基础知识总览
  3. 特征交互(Feature Interaction)及多项式特征(PolynomialFeatures)
  4. 2009-2019年全国大学生智能汽车竞赛获奖数据分析
  5. 基于xilinx vivado的XADC IP设置使用详解
  6. ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)
  7. 单链表的代码python_python版本单链表实现代码
  8. mysql-5.7.24-linux_Linux下安装mysql-5.7.24
  9. android4.4安全性,[原创]Android第二代加固(support 4.4-8.1)
  10. [转] Understanding and Solving Internet Explorer Leak Patterns
  11. 插入网站连接_网站开发与网页制作
  12. 为什么C语言简洁灵活方便,C语言语法简洁紧凑使用方便灵活具有丰富的运算.ppt...
  13. Java后端开发实习面试
  14. coreseek java_使用python测试sphinx(coreseek)做全文索引
  15. windows下的内存泄露检测工具VLD使用
  16. 计算方法--解线性方程组的直接法
  17. 如何才能不改变图片的像素大小,只改变图片的文件大小
  18. 双屏下微信截屏错位解决办法
  19. 【贪心-单调栈】中山纪念中学暑期游Day12——灵知的太阳信仰
  20. Unity-后期处理效果之Bloom

热门文章

  1. java 面向对象三大特性之多态 万字详解(超详细)
  2. 串的模式匹配算法(超详细)
  3. 数据库表名字段如何大小写转换
  4. 基于Java毕业设计眼科医疗室信息管理系统源码+系统+mysql+lw文档+部署软件
  5. ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)
  6. 玩转Windows下40款开源软件
  7. 云计算与大数据第11章 大数据隐私保护习题带答案
  8. 计算机机箱架硬盘托架是什么,36元给机箱加4个硬盘架合适吗——机箱硬盘架开箱...
  9. PYNQ-Z1 SDK TCF
  10. 恐怕我今天不能在计算机上工作英语,全新版大学英语综合教程3课后句子翻译(中英对照)...