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

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

  1. 1 if (inputDown)//update()中
  2. 2 {
  3. 3 //记录初始位置
  4. 4 _beginTouch = true;
  5. 5 Vector2 pos;
  6. 6 RectTransformUtility.ScreenPointToLocalPointInRectangle(_moveTip.parent as RectTransform,
  7. 7 Input.mousePosition, null, out pos);
  8. 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. 1 else if (inputStay)
  2. 2 {
  3. 3 Vector2 pos;
  4. 4 RectTransformUtility.ScreenPointToLocalPointInRectangle(_moveTip.parent as RectTransform,
  5. 5 Input.mousePosition, null, out pos);
  6. 6 float angleCos = Vector2.Dot((pos - _moveTip.anchoredPosition).normalized, Vector2.down);
  7. 7 float angle = Mathf.Acos(angleCos) * Mathf.Rad2Deg;
  8. 8 float dis = pos.x < _moveTip.anchoredPosition.x ? -1 : 1;
  9. 9
  10. 10 }
  11. 11 else if (inputUp)
  12. 12 {
  13. 13 _beginTouch = false;
  14. 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. Linux命令篇 - nc(ncat) 命令

    nc (ncat) Ncat is a feature-packed networking utility which reads and writes data across networks fr ...

  2. [seaborn] seaborn学习笔记8-避免过度绘图Avoid Overplotting

    8 避免过度绘图Avoid Overplotting(代码下载) 过度绘图是散点图及几天常见图表中最常见的问题之一.如下图所示当数据集很大时,散点图的点会重叠,使得图形变得不可读.在这篇文章中,提出了 ...

  3. C#应用程序配置文件(XML序列化) - 开源研究系列文章

    上次写了一个C#线程池及管理器的博文( C#开发的线程池和管理器 - 开源研究系列文章 ),收到了不小的浏览量,在此感谢各位网友的支持.这次将另一个功能放出来单独讲解:C#应用程序的配置文件,使用的是 ...

  4. 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的

    译者注:这是Michal Strehovský大佬的一篇文章,他目前在微软.NET Runtime团队工作,主要是负责.NET NativeAOT功能的开发.我在前几天看到这篇文章,非常喜欢,虽然它的 ...

  5. cornerstone4.1破解版&#160;for&#160;mac

    百度网盘: https://pan.baidu.com/s/1l_0rHMF11mZsUP3qJrp7Uw  密码: 8ei9

  6. youtube-dl下载太慢了,我选yt-dlp

    前言 最近过年嘛,过年前照例来下载一些贺岁歌曲,现在国内没啥人做贺岁专辑,这方面还得看马来西亚华人,他们每年都有出专辑,质量很不错! 国内平台自然是没有(或者不全的),需要在YouTube下载~ 之前 ...

  7. 1.5万字长文:从 C# 入门 Kafka

    目录 1, 搭建 Kafka 环境 安装 docker-compose 单节点 Kafka 的部署 Kafka 集群的部署 2, Kafka 概念 基本概念 关于 Kafka 脚本工具 主题管理 使用 ...

  8. Flutter 3.7 正式发布

    新的 Flutter 稳定版加入了 Material 3 更新.iOS 平台优化及其他内容 新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区成员们继续在 Fl ...

  9. antd 3.x升4.x踩坑之路~

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 兼容性问题 第三方依赖兼容问题 React - 最低 v16.9,部 ...

  10. 获取对象的方式-Calendar类的常用成员方法

    获取对象的方式 java.utiL.calendar类:日历类caLendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR.MONTH.DAY_OF_MONTH.HOUR )CaLend ...