InputTouch

使用Unity开发的游戏大多是移动端游戏,而一些移动端游戏完全使用触摸操作而不是点击Button

Unity使用Input.Touch来管理触摸操作

Input.TouchCount获得当前触摸的数量,这个数量多少取决于设备,通常使用触摸之前都用这个判断下

Input.GetTouch[index],下标决定了获取当前触摸点的哪一个(先后顺序)

针对触摸点,有很多状态,由枚举TouchPhase列出,Input.GetTouch[index].phase

TouchPhase.Began:开始触摸时触发,仅一次

TouchPhase.Moved:触摸保持触摸且移动的时候触发,注意如果仅仅保持触摸但是不移动,这个不会触发

TouchPhase.Stationary:触摸保持且静止时触发,和上面相反,如果不动则会触发这个,所以是否在触发中可以仅用TouchCount判断或者这两个条件同时满足时,都代表"按住"这个状态

TouchPhase.Ended:手指离开屏幕时触发,仅一次

TouchPhase.Canceled:奇怪的枚举,说是当触摸数量超过最大时,Unity会停止追踪触摸而触发

虚拟摇杆的简单实现

通过上面的APi和状态枚举,虚拟摇杆将变得简单

0:获取当前状态,这里加了个安卓用触摸,编辑器用鼠标的判断,ios一样的

 1              bool _beginTouch = false;//Update之外
2
3 //Update之内
4 bool windowsOrEditor = Application.isEditor || Application.platform != RuntimePlatform.Android;
5 bool inputDown = windowsOrEditor
6 ? (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
7 : (Input.touchCount > 0 && !_beginTouch && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId));
8 bool inputStay = windowsOrEditor
9 ? Input.GetMouseButton(0)
10 : _beginTouch && Input.touchCount > 0;
11 bool inputUp = windowsOrEditor
12 ? Input.GetMouseButtonUp(0) || !Input.GetMouseButton(0) : Input.touchCount <= 0 && _beginTouch;

1:在TouchPhase.Began状态下,可以获取当前点在屏幕的坐标,Input.GetTouch[index].position;,记录为坐标起点_startPos(我这里转到了UGUI某组件下的物体坐标系中)

1             if (inputDown)//update()中
2 {
3 //记录初始位置
4 _beginTouch = true;
5 Vector2 pos;
6 RectTransformUtility.ScreenPointToLocalPointInRectangle(_moveTip.parent as RectTransform,
7 Input.mousePosition, null, out pos);
8 }

2:在TouchPhase.Stationary和TouchPhase.Moved(或者直接判断TouchCount>0)状态中,用移动后的坐标减去起点_startPos(Input.GetTouch[index].position - _startPos,顺序不能变,由起点指向当前点),获得新向量_offsetPos,可以获得它们之间的距离(_offsetPos.magnitude,就是向量减法求模),可以根据距离大于多少后,做出之后的操作

3:同样在2的状态下,给起点一个默认方向_startDir,(如美术给的图默认向下,就是vector2.down),将_offsetPos归一化后和_startDir点乘(Vector2.Dot()),获得向量夹角的余弦CosA,利用反余弦(Mathf.Acos()结果是弧度,需要乘Mathf.Rad2Deg转角度)求出角度,给美术资源做旋转Z轴即可(正向还是反向通过坐标x对比)

 1             else if (inputStay)
2 {
3 Vector2 pos;
4 RectTransformUtility.ScreenPointToLocalPointInRectangle(_moveTip.parent as RectTransform,
5 Input.mousePosition, null, out pos);
6 float angleCos = Vector2.Dot((pos - _moveTip.anchoredPosition).normalized, Vector2.down);
7 float angle = Mathf.Acos(angleCos) * Mathf.Rad2Deg;
8 float dis = pos.x < _moveTip.anchoredPosition.x ? -1 : 1;
9
10 }
11 else if (inputUp)
12 {
13 _beginTouch = false;
14 }

[Unity]关于Unity中的触摸类Input.Touch以及简单的虚拟摇杆实现的更多相关文章

  1. Unity3D 将 Unity 嵌入WPF中的一些研究笔记

     一. 在 WPF 中使用 WebBrowser,直接打开 WebPlayer.html 以这种方式有一个问题是. 无法在 WebBrowser 的上面 放置其它的控件, 在运行时,都不会显示 . 以 ...

  2. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

  3. Unity项目开发过程中常见的问题,你遇到过吗?

    最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...

  4. 【Unity】6.7 向量和Vector3类

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...

  5. unity中虚拟摇杆的实现

    实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach  boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...

  6. DDD~Unity在DDD中的使用

    回到目录 上一讲介绍了DDD中的领域层,并提到下次要讲Unity,所以这篇文章当然就要介绍它了,呵呵,Unity是Microsoft.Practices中的一部分,主要实现了依赖注入的功能,或者叫它控 ...

  7. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  8. Unity 处理预设中的中文

    Unity 处理预设中的中文 需求由来 项目接入越南版本 需要解决的文本问题 获取UI预设Label里面的中文(没被代码控制)提供给越南 Label里面的中文替换成越南文 解决流程 迭代获取Asset ...

  9. Unity 4.0 中的新动画系统——MecAnim

    分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...

  10. Unity编辑器 - 资源批处理工具基类

    Unity编辑器 - 资源批处理工具基类 经常要对资源进行批处理,很多时候都是一次性的需求,于是弄个通用脚本. 工具是个弹出面板,处理过程有进度条,如下: 如图,子类只需要重写几个方法: using ...

随机推荐

  1. Flutter异常监控 - 壹 | 从Zone说起

    开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情 如果你正需要处理Flutter异常捕获,那么恭喜你,找对地了,这里从根源上给你准备了Flutter异常捕获 ...

  2. 大数据 - ADS 数据可视化实现

    之前数据分层处理,最后把轻度聚合的结果保存到 ClickHouse 中,主要的目的就是提供即时的数据查询.统计.分析服务.这些统计服务一般会用两种形式展现,一种是为专业的数据分析人员的 BI 工具,一 ...

  3. python之路53 ajax补充返回序列化数据,多对多创建三种方式,django内置序列化组件(drf前身),批量操作数据,自定义分页器,form组件

    ajax补充说明 主要是针对回调函数args接收到的响应数据 1.后端request.is_ajax() 用于判断当前请求是否由ajax发出 2.后端返回的三板斧都会被args接收不再影响整个浏览器页 ...

  4. 解决安装node-sass报错的方法

    1.下载源码放到本地搞~~ 适合内网开发的苦孩子们~~~ 先进入https://github.com/sass/node-sass/releases下载自己需要的包 可以点击tags然后找到自己需要的 ...

  5. 商城网站商品sku选择的js简易实现

    商城网站商品sku选择的js简易实现 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta c ...

  6. 【随笔记】FRAM 铁电随机存储器(MB85RC04VPNF)

    参考资料 器件规格书:https://atta.szlcsc.com/upload/public/pdf/source/20131104/1457706659695.pdf I2C总线规范:https ...

  7. Linux存储服务

    存储服务 一.概述 存储:用于存放用户上传的内容(数据),一般应用在网站集群中 为什么要存储? 如果不使用存储,用户上传的数据就直接存放在某一台网站服务器上了,用户下次访问就可能找不到 如果使用存储, ...

  8. Java + SikuliX 基于图像实现自动化测试

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/6d2908e8.html 你好,我是测试蔡坨坨. 由于目前大多数GUI工具均需要依赖于程序类型进行特征属性识别,例如:Sel ...

  9. MySQL-字段约束条件

    1.无符号.零填充 1.unsigned:用在生成表的过程中,表示不取负数,只取正数和0,负数会直接报错,eg:id int unsigned. 2.zerofill:用在生成表的过程中,跟在整形2后 ...

  10. STM32F0库函数初始化系列:PWM输出

    void TIM1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_Time1BaseStructure; TIM_OCInitTypeDef TI ...