Unity 手机触屏事件

2023-10-27

Unity 触屏操作  
当将Unity游戏运行到IOS或Android设备上时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的。Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动设备触屏操作的各种功能,下面介绍一下Input类在触碰操作上的使用。  
  
首先介绍一下Input.touches结构,这是一个触摸数组,每个记录代表着手指在屏幕上的触碰状态。每个手指触控都是通过Input.touches来描述的:  
  
fingerId  
  
触摸的唯一索引  
  
position  
  
触摸屏幕的位置  
  
deltatime  
  
从最后状态到目前状态所经过的时间  
  
tapCount  
  
点击数。Andorid设备不对点击计数,这个方法总是返回1  
  
deltaPosition  
  
自最后一帧所改变的屏幕位置  
  
phase  
  
相位,也即屏幕操作状态  
  
其中phase(状态)有以下这几种:  
  
Began  
  
手指刚刚触摸屏幕  
  
Moved  
  
手指在屏幕上移动  
  
Stationary  
  
手指触摸屏幕,但自最后一阵没有移动  
  
Ended  
  
手指离开屏幕  
  
Canceled  
  

系统取消触控跟踪,原因如把设备放在脸上或同时超过5个触摸点  



  1. 下面通过一段代码来进行移动设备触摸操作的实现:  
  2.   
  3. using UnityEngine;  
  4. using System.Collections;  
  5.   
  6. public class AndroidTouch : MonoBehaviour {  
  7.   
  8.     private int isforward;//标记摄像机的移动方向  
  9.     //记录两个手指的旧位置  
  10.     private Vector2 oposition1=new Vector2();  
  11.     private Vector2 oposition2=new Vector2();  
  12.   
  13.     Vector2 m_screenPos = new Vector2(); //记录手指触碰的位置  
  14.   
  15.     //用于判断是否放大  
  16.     bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)  
  17.     {  
  18.         //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势  
  19.         float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));  
  20.         float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));  
  21.         if (leng1 < leng2)  
  22.         {  
  23.             //放大手势  
  24.             return true;  
  25.         }  
  26.         else  
  27.         {  
  28.             //缩小手势  
  29.             return false;  
  30.         }  
  31.     }  
  32.   
  33.     void Start()  
  34.     {  
  35.         Input.multiTouchEnabled = true;//开启多点触碰  
  36.     }  
  37.   
  38.     void Update()  
  39.     {  
  40.         if (Input.touchCount <= 0)    
  41.             return;  
  42.         if (Input.touchCount == 1) //单点触碰移动摄像机  
  43.         {  
  44.             if (Input.touches[0].phase == TouchPhase.Began)  
  45.                 m_screenPos = Input.touches[0].position;   //记录手指刚触碰的位置  
  46.             if (Input.touches[0].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机  
  47.             {  
  48.                 transform.Translate(new Vector3( Input.touches[0].deltaPosition.x * Time.deltaTime, Input.touches[0].deltaPosition.y * Time.deltaTime, 0));  
  49.             }  
  50.         }  
  51.   
  52.         else if (Input.touchCount > 1)//多点触碰  
  53.         {  
  54.             //记录两个手指的位置  
  55.             Vector2 nposition1 = new Vector2();  
  56.             Vector2 nposition2 = new Vector2();  
  57.   
  58.             //记录手指的每帧移动距离  
  59.             Vector2 deltaDis1 = new Vector2();  
  60.             Vector2 deltaDis2 = new Vector2();  
  61.   
  62.             for (int i = 0; i < 2; i++)  
  63.             {  
  64.                 Touch touch = Input.touches[i];  
  65.                 if (touch.phase == TouchPhase.Ended)  
  66.                     break;  
  67.                 if (touch.phase == TouchPhase.Moved) //手指在移动  
  68.                 {  
  69.   
  70.                     if (i == 0)  
  71.                     {  
  72.                         nposition1 = touch.position;  
  73.                         deltaDis1 = touch.deltaPosition;  
  74.                     }  
  75.                     else  
  76.                     {  
  77.                         nposition2 = touch.position;  
  78.                         deltaDis2 = touch.deltaPosition;  
  79.   
  80.                         if (isEnlarge(oposition1, oposition2, nposition1, nposition2)) //判断手势伸缩从而进行摄像机前后移动参数缩放效果  
  81.                             isforward = 1;  
  82.                         else  
  83.                             isforward = -1;  
  84.                     }  
  85.                     //记录旧的触摸位置  
  86.                     oposition1 = nposition1;  
  87.                     oposition2 = nposition2;  
  88.                 }  
  89.                 //移动摄像机  
  90.                 Camera.main.transform.Translate(isforward*Vector3.forward * Time.deltaTime*(Mathf.Abs(deltaDis2.x+deltaDis1.x)+Mathf.Abs(deltaDis1.y+deltaDis2.y)));  
  91.             }    
  92.         }  
  93.     }  
  94. }  

将这个脚本绑定在主摄像机上,发现单触摸操作可上下左右移动摄像机,双触摸操作可以缩放。  

  

导出Android 在手机上运行,可以发现触摸起了效果。  


转载出处:http://blog.csdn.net/u014550279/article/details/50537713

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 手机触屏事件 的相关文章

  • Unity用Vuforia做AR实现脱卡效果

    有时在识别目标丢失后我们仍希望虚拟物体能够出现在摄像机前 或者到一个特定的位置 我们能对其进行操作 这就是脱卡功能 自带的脱卡功能应该是ExtendedTracking 允许模型在识别图丢失的时候还存在 位置不变 在丢失的时候的位置 这样也
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge

随机推荐

  • Multisim实现555计时器模拟简易电子琴

    555计时器模拟简易电子琴 一 元器件介绍 二 原理分析 三 仿真实验 四 仿真错误 一 元器件介绍 这里用到的元器件有 DIgital power VCC 数字电源 频率计数器 XFC 示波器 XSC ground 数字地 Capacit
  • cmake建立自己的package

    通过cmake建立自己的package cmake提供了CMakePackageConfigHelpers来方便实现我们的需求 详细文章参考如下 1 https blog csdn net xiaoxiaozengz article det
  • go协程、管道

    请感受一下协程的强大 使用了管道序列 package main import fmt time 创建一个管道 用于写入数据 func writeChantest writeChan chan int for i 0 i lt 20 i wr
  • ISO 26262:保障驾驶安全的汽车功能安全标准

    来源 中豪认证 随着汽车科技的迅猛发展 越来越多的电子系统和功能被引入汽车中 为驾驶体验和安全性带来了巨大的改进 然而 这些复杂的电子系统也带来了潜在的风险和安全挑战 为了确保现代汽车在各种情况下的安全性 国际标准化组织于2011年发布了I
  • 实现浏览页面时校验用户是否已经完成登录的功能

    一 实现原理 实现步骤 1 创建自定义过滤器LoginWebFilter java 2 在启动类上加入注解 ServletComponentScan 用来扫描web相关的注解 3 完善过滤器的处理逻辑 二 代码实现 首先在main java
  • 关于Xilinx下载器驱动安装及常见问题解决方法

    PC操作系统平台 Win7x64 ISE14 4 ISE14 7 下载器工作状态指示灯说明 如果Xilinx的下载器与电脑连接之后 下载器上面的指示灯不亮 说明PC上安装的下载器驱动有问题或者是下载器坏掉了 如果下载器与电脑连接之后 并与开
  • CTFshow 每日一练

    一 web签到题 打开链接 查看源码 利用base64解码得到flag 二 web2 看到有提示 SQL注入 先试着使用万能密码登陆 发现有回显 直接sql注入 or 1 1 order by 3 发现到4时不回显 开始爆库名 看看哪个位置
  • 2、ubuntu18.04安装cmake

    本文以安装cmake3 18 0为例 1 获取安装包 wget https cmake org files v3 18 cmake 3 18 0 Linux x86 64 tar gz 2 解压压缩包 tar zxvf cmake 3 18
  • GD32F3x0 USB CDC应用案例

    GD32F3x0 USB CDC应用 本文有点长 描述了从0开始移植驱动到应用的过程和思路 准备工作 因项目需求这两天需要做个USB的虚拟COM口发卡器 实现双向通讯 由于功能较为简单我们选择GD32F350来开发 先跑跑官方例程 GD32
  • 分享程序员在囧途网站

    不知不觉的在博客园看到了失业的程序员系列文章 我就带着好奇的看了几章 然后发现类似创业的文章的经历的文章 都是程序员爱看到的文章 同时把这样的经历加上一点修饰 是很多程序员喜欢的话题 也是程序员想看到的文章 不知道不觉到了第六章的时候 文章
  • LayUI数据表格 通用工具栏 分页+搜索+排序

    完成效果 1 接收和展示后端接口传来的数据 2 分页和跳页 设置每页的数量 3 工具栏 查看 修改 删除 4 工具栏 筛选列 导出Excel 打印 5 搜索功能 6 后端排序功能 本实例只展示了实现功能的必须代码 后端代码的非必须部分未贴出
  • 第十三届蓝桥杯 ——刷题统计

    题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛 他计划周一至周五每天做 a a a 道题目 周六和周日每天做 b b b 道题目 请你帮小明计算 按照计划他将在第几天实现做题数大于等于
  • 【C++】 STL库list容器

    STL库list容器 1 list中的构造函数 2 begin 和end list 容器的iterator 3 增 3 1 push back 末端插入 3 2 push front 头部插入 3 3 insert 在指定位置插入n个元素
  • android:checkBox的监听

    CheckBox cb project CheckBox findViewById R id cb project cb project setText 测试是否被选中 cb project setOnCheckedChangeListen
  • [源码和文档分享]基于Keras和tensorflow深度学习Python实现的支持人脸识别和情绪分类的社区APP网站和微信小程序...

    1 项目介绍 1 1 背景 视觉使人类得以感知和理解周边的世界 人的大脑皮层大约有 70 的活动在处理 视觉相关信息 计算机视觉即通过电子化的方式来感知和理解影像 以达到甚至超 越人类视觉智能的效果 从 1966 年学科建立 MIT The
  • Xtrabackup实现数据的备份与恢复

    目录 Xtrabackup实现数据的备份与恢复 Xtrabackup介绍 Xtrabackup优点 Xtrabackup备份原理 Xtrabackup增量备份介绍 Xtrabackup安装 创建测试数据 Xtrabackup全量备份与恢复
  • 14.【Linux】如何在ubuntu18.04下安装Firefox中国版解决Ubuntu与Windows下Firefox账号同步问题(已解决)

    一 下载最新版本火狐Linux版 下载地址 http firefox com cn download 选择火狐Linux64 bit版 下载后文件为 Firefox latest x86 64 tar bz2 二 首先卸载自带的国际版火狐浏
  • 华为-判断两个IP是否属于同一子网

    java实现 问题 题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据 子网掩码与IP地址结构相同 是32位二进制数 其中网络号部分全为 1 和主机号部分全为 0 利用子网掩码可以判断两台主机是否中同一子网中 若两
  • VMware虚拟机怎么用U盘装win7系统

    VMware Workstation虚拟机可以在一台电脑上模拟运行多种不同的操作系统 实现与实际电脑完全一样的操作 包括读取U盘 连接网络等 很多用户想用U盘启动盘给VMware安装win7系统 但是不知道怎么操作 本文系统城小编就教大家在
  • Unity 手机触屏事件

    Unity 触屏操作 当将Unity游戏运行到IOS或Android设备上时 桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作 但如多点触屏等操作却是无法利用鼠标操作进行的 Unity的Input类中不仅包含桌面系统的各种输入功能 也包含