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个触摸点

下面通过一段代码来进行移动设备触摸操作的实现:

using UnityEngine;
using System.Collections; public class AndroidTouch : MonoBehaviour { private int isforward;//标记摄像机的移动方向
//记录两个手指的旧位置
private Vector2 oposition1=new Vector2();
private Vector2 oposition2=new Vector2(); Vector2 m_screenPos = new Vector2(); //记录手指触碰的位置 //用于判断是否放大
bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
{
//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (leng1 < leng2)
{
//放大手势
return true;
}
else
{
//缩小手势
return false;
}
} void Start()
{
Input.multiTouchEnabled = true;//开启多点触碰
} void Update()
{
if (Input.touchCount <= )
return;
if (Input.touchCount == ) //单点触碰移动摄像机
{
if (Input.touches[].phase == TouchPhase.Began)
m_screenPos = Input.touches[].position; //记录手指刚触碰的位置
if (Input.touches[].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机
{
transform.Translate(new Vector3( Input.touches[].deltaPosition.x * Time.deltaTime, Input.touches[].deltaPosition.y * Time.deltaTime, ));
}
} else if (Input.touchCount > )//多点触碰
{
//记录两个手指的位置
Vector2 nposition1 = new Vector2();
Vector2 nposition2 = new Vector2(); //记录手指的每帧移动距离
Vector2 deltaDis1 = new Vector2();
Vector2 deltaDis2 = new Vector2(); for (int i = ; i < ; i++)
{
Touch touch = Input.touches[i];
if (touch.phase == TouchPhase.Ended)
break;
if (touch.phase == TouchPhase.Moved) //手指在移动
{ if (i == )
{
nposition1 = touch.position;
deltaDis1 = touch.deltaPosition;
}
else
{
nposition2 = touch.position;
deltaDis2 = touch.deltaPosition; if (isEnlarge(oposition1, oposition2, nposition1, nposition2)) //判断手势伸缩从而进行摄像机前后移动参数缩放效果
isforward = ;
else
isforward = -;
}
//记录旧的触摸位置
oposition1 = nposition1;
oposition2 = nposition2;
}
//移动摄像机
Camera.main.transform.Translate(isforward*Vector3.forward * Time.deltaTime*(Mathf.Abs(deltaDis2.x+deltaDis1.x)+Mathf.Abs(deltaDis1.y+deltaDis2.y)));
}
}
}
}

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

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

Unity 移动端触摸屏操作的更多相关文章

  1. [Unity移动端]Touch类

    Touch类的信息只能在移动端(触摸屏)上能够获取,在编辑器上是不能获取到的.因此,为了方便测试,可以打包apk后在模拟器上跑: unity打包apk:https://www.jianshu.com/ ...

  2. (原创)OpenStack服务如何使用Keystone(一)---Keystone端的操作

    (一)Keystone端的操作 (二)如何在OpenStack服务上部署Keystone中间件 (三)详细配置keystonemiddleware OpenStack项目如果要使用Keystone作为 ...

  3. python selenium TouchAction模拟移动端触摸操作(十八)

    最近做移动端H5页面的自动化测试时候,需要模拟一些上拉,下滑的操作,最初考虑使用使用selenium ActionChains来模拟操作,但是ActionChains 只是针对PC端程序鼠标模拟的一系 ...

  4. Unity PC端发布失败解决办法

    Unity的PC端有时候发布的时候报错.原因可能是你的游戏里面使用了NGUI的label,而且字体选择的是unity自带的字体.因为支持中文.在选择unity自带的字体时最好都选一样的字体.如果一个l ...

  5. Unity 移动端的复制这么写

    游戏上线很久了,有些玩家慢慢就流失了,为了让刚流失的玩家再度回归所以做了召回功能!如果一个200级的玩家10天没上线且成功召回的,就会给予召回玩家丰厚的奖励! Q:那如何召回这个流失的玩家呢? A:召 ...

  6. Unity(2) 脚本简单操作

    生命周期(按顺序排列) Awake():脚本唤醒,系统执行的第一个方法,在脚本声明周期内只执行一次,初始化一般可以在这里 Start():Awake之后,Update之前,只执行一次,一般在awake ...

  7. bootstrap-table服务端分页操作

    由于数据库查询的数据过多,所以采取服务端分页的操作,避免一次性加载的数据量过多,导致页面加载缓慢. 后端数据的封装格式json数据 rows里的数据是当前页的数据,total是总条数: { " ...

  8. unity快捷放置物体操作

    https://connect.unity.com/p/zui-jia-shi-jian-dui-xiang-fang-zhi-he-wu-li-xiao-guo 最佳实践系列文章将探讨我们在与客户合 ...

  9. ES的java端API操作

    首先简单介绍下写这篇博文的背景,最近负责的一个聚合型的新项目要大量使用ES的检索功能,之前对es的了解还只是纯理论最多加个基于postman的索引创建操作,所以这次我得了解在java端如何编码实现:网 ...

随机推荐

  1. HTML 学习笔记 CSS样式(链接)

    我们能够以不同的方法为链接设置样式. 设置链接的样式 能够设置链接样式的 CSS 属性有很多种(例如 color, font-family, background 等等).链接的特殊性在于能够根据它们 ...

  2. wk_01

    Python 学习环境搭建 pyenv是个多版本python管理器,可以同时管理多个python版本共存,如pypy,miniconde等等.我们安装时其会将pyenv安装在当前用户家目录中的.pye ...

  3. hadoop怎么读?怎么发音

    hadoop不是一个英文单词,是作者发明的词,hadoop名称来源作者小孩的一个}h毛填充黄色大象玩具. 它的发音是:[hædu:p]

  4. Java手动添加SSL证书

    出现错误为 SSLHandshakeException - unable to find valid certification path to requested target 在服务器上找到对应的 ...

  5. Centos5.8 安装SVN并配置HTTP访问

    安装 svn sudo yum install subversion 测试 svn --version 安装 httpd 的 svn 模块 sudo yum install mod_dav_svn 前 ...

  6. 如何迁移Alwayson AG

    Windows cluster要求同一个cluster中的所有windows版本都是相同的,这样就出现一个问题,当我们要将对windows进行升级时,(例如从windows 2008 R2升级到win ...

  7. PAT 1067. Sort with Swap(0,*)

    1067. Sort with Swap(0,*) (25)   Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...

  8. c++ this *this

    在一个类里每个成员函数都有一个this指针.this指针指向调用对象.如果方法需要引用整个调用 对象可以使用*this.this是对象的地址,而不是对象本身. *this是对象本身.可以将*this ...

  9. 虚拟机开机提示Operating System not found解决办法

    为了更好体验windows更多操作系统,有些用户会在VMware虚拟机中安装XP.win7或win8等等系统,有用户反映在虚拟机中安装XP开机后提示"Operating System not ...

  10. Scala集合操作

    大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka.  ...