【转】Unity 之 移动设备的触控操作
http://blog.csdn.net/anyuanlzh/article/details/18367941
这篇博文将简单的记录,如何用unity处理在移动设备上的触控操作。
    iOS和Android设备能够支持多点触控。在unity中你可以通过Input.touches属性集合访问在最近一帧中触摸在屏幕上的每一根手指的状态数据。简单的触控响应实现起很简单,不过一些复杂的触控响应或触控手势什么的,还是使用一些第三方的插件吧,当然你也可以自己封装。不管什么情况,了解决unity原生api还是非常必要的。
相关的api
    1、Toch类:用来记录一个手指触摸在屏幕上的状态与位置的各种相关数据。这其它中只有两个属性是你要注意的,就是Touch.fingerId和Touch.tapCount。
               Touch.fingerId: 一个Touch的标识。Input.touches数组中的同一个索引在两帧之前,指向的可不一定是同一个Touch。用来标识某个具体的touch一定要用fingerId,在分析手势时、或处理多点触控时,fingerId是非常重要的。
               Touch.tapCount: 点击的总人数,这个属性可以用来模拟“双击”的效果。
               这里先普及一个概念吧,一个touch的生命周期是:当一个手指接触到触屏时,产生一个Touch,并分配它一个fingerId,到这个手指离开触屏这个touch就有了。在它整个生命周期里,它的figerId是不会变的。死掉的touch所使用过fingerId当也会被之后的touch多次使用。ps:其实也不是手指一离开,这个touch就立马死掉。还有一种特殊的情况就是:在手指敲开的地方,在一个很短的时间内,一个手指又回到这个地方的话,这个touch没不会死掉,这个也是Touch.tapCount属于的由来吧。这个touch生命周期,是我自己理解的,实际情况是不是这样就不知道了,料想也不会差的太多。
    2、TouchPhase枚举:它列表描述了手指触摸的几种状态。对应Touch类中的phase属性。这是状态分别是:Began、Move、Stationary、Ended、Canceled。
    3、Input.touches:一个Touch数组,代表着当前帧,所有手指在屏幕上的触碰状态与相关数据。(只读)
    4、Input.touchCount: 触摸数量,相当于Input.touches.Length。(只读)
    5、Input.multiTouchEnabled:设置与指示当前系统(注意不是指设备哦!)是否启用多点触控。不过这个属性有点怪,我在电脑上测试给它赋false不会报错但完全是没有用的,它的值一值是true. 不过在我的安卓手机上测试是正常的!Ture表示支持多点触控(一般是5点);False表示单点触控。
    6、Input.GetTouch(int index):安索引值获取一个Touch对象。
下面一个测试Demo
1、简述:
         这个Demo主要是让你的触摸可视化的显示在你的手机(或平板)屏幕上;
         并实时记录和显示了手指在屏幕上的状态和相关数据。
2、相关截图:
3、脚本就一个
- /*
 - * author: AnYuanLzh
 - * date: 2014/01/18
 - * */
 - using UnityEngine;
 - using System.Collections;
 - using System.Collections.Generic;
 - public class MyTouch : MonoBehaviour
 - {
 - /// <summary>
 - /// 定义的一个手指类
 - /// </summary>
 - class MyFinger
 - {
 - public int id = -1;
 - public Touch touch;
 - static private List<MyFinger> fingers = new List<MyFinger>();
 - /// <summary>
 - /// 手指容器
 - /// </summary>
 - static public List<MyFinger> Fingers
 - {
 - get
 - {
 - if(fingers.Count==0)
 - {
 - for(int i=0; i<5; i++)
 - {
 - MyFinger mf = new MyFinger();
 - mf.id = -1;
 - fingers.Add(mf);
 - }
 - }
 - return fingers;
 - }
 - }
 - }
 - // 小圈圈:用来实时显示手指触摸的位置
 - GameObject[] marks = new GameObject[5];
 - public GameObject markPerfab = null;
 - // 粒子效果:来所显示手指手动的大概路径
 - ParticleSystem[] particles = new ParticleSystem[5];
 - public ParticleSystem particlePerfab = null;
 - // Use this for initialization
 - void Start ()
 - {
 - // init marks and particles
 - for(int i=0; i<MyFinger.Fingers.Count; i++)
 - {
 - GameObject mark = Instantiate(markPerfab, Vector3.zero, Quaternion.identity) as GameObject;
 - mark.transform.parent = this.transform;
 - mark.SetActive(false);
 - marks[i] = mark;
 - ParticleSystem particle = Instantiate(particlePerfab, Vector3.zero, Quaternion.identity) as ParticleSystem;
 - particle.transform.parent = this.transform;
 - particle.Pause();
 - particles[i] = particle;
 - }
 - }
 - // Update is called once per frame
 - void Update ()
 - {
 - Touch[] touches = Input.touches;
 - // 遍历所有的已经记录的手指
 - // --掦除已经不存在的手指
 - foreach(MyFinger mf in MyFinger.Fingers)
 - {
 - if(mf.id == -1)
 - {
 - continue;
 - }
 - bool stillExit = false;
 - foreach(Touch t in touches)
 - {
 - if(mf.id == t.fingerId)
 - {
 - stillExit = true;
 - break;
 - }
 - }
 - // 掦除
 - if(stillExit == false)
 - {
 - mf.id = -1;
 - }
 - }
 - // 遍历当前的touches
 - // --并检查它们在是否已经记录在AllFinger中
 - // --是的话更新对应手指的状态,不是的放放加进去
 - foreach(Touch t in touches)
 - {
 - bool stillExit = false;
 - // 存在--更新对应的手指
 - foreach(MyFinger mf in MyFinger.Fingers)
 - {
 - if(t.fingerId == mf.id)
 - {
 - stillExit = true;
 - mf.touch = t;
 - break;
 - }
 - }
 - // 不存在--添加新记录
 - if(!stillExit)
 - {
 - foreach(MyFinger mf in MyFinger.Fingers)
 - {
 - if(mf.id == -1)
 - {
 - mf.id = t.fingerId;
 - mf.touch = t;
 - break;
 - }
 - }
 - }
 - }
 - // 记录完手指信息后,就是响应相应和状态记录了
 - for(int i=0; i< MyFinger.Fingers.Count; i++)
 - {
 - MyFinger mf = MyFinger.Fingers[i];
 - if(mf.id != -1)
 - {
 - if(mf.touch.phase == TouchPhase.Began)
 - {
 - marks[i].SetActive(true);
 - marks[i].transform.position = GetWorldPos(mf.touch.position);
 - particles[i].transform.position = GetWorldPos(mf.touch.position);
 - }
 - else if(mf.touch.phase == TouchPhase.Moved)
 - {
 - marks[i].transform.position = GetWorldPos(mf.touch.position);
 - if(!particles[i].isPlaying)
 - {
 - particles[i].loop = true;
 - particles[i].Play();
 - }
 - particles[i].transform.position = GetWorldPos(mf.touch.position);
 - }
 - else if(mf.touch.phase == TouchPhase.Ended)
 - {
 - marks[i].SetActive(false);
 - marks[i].transform.position = GetWorldPos(mf.touch.position);
 - particles[i].loop = false;
 - particles[i].Play();
 - particles[i].transform.position = GetWorldPos(mf.touch.position);
 - }
 - else if(mf.touch.phase == TouchPhase.Stationary)
 - {
 - if(particles[i].isPlaying)
 - {
 - particles[i].Pause();
 - }
 - particles[i].transform.position = GetWorldPos(mf.touch.position);
 - }
 - }
 - else
 - {
 - ;
 - }
 - }
 - // exit
 - if(Input.GetKeyDown(KeyCode.Home) || Input.GetKeyDown(KeyCode.Escape))
 - {
 - Application.Quit();
 - }
 - // // test
 - // if(Input.GetMouseButtonDown(0))
 - // {
 - // GameObject mark = Instantiate(markPerfab, Vector3.zero, Quaternion.identity) as GameObject;
 - // mark.transform.parent = this.transform;
 - // mark.transform.position = GetWorldPos(Input.mousePosition);
 - //
 - // ParticleSystem particle = Instantiate(particlePerfab, Vector3.zero, Quaternion.identity) as ParticleSystem;
 - // particle.transform.parent = this.transform;
 - // particle.transform.position = GetWorldPos(Input.mousePosition);
 - // particle.loop = false;
 - // particle.Play();
 - // }
 - }
 - /// <summary>
 - /// 显示相关高度数据
 - /// </summary>
 - void OnGUI()
 - {
 - GUILayout.Label("支持的手指的数量:" + MyFinger.Fingers.Count);
 - GUILayout.BeginHorizontal(GUILayout.Width(Screen.width));
 - for(int i=0; i< MyFinger.Fingers.Count; i++)
 - {
 - GUILayout.BeginVertical();
 - MyFinger mf = MyFinger.Fingers[i];
 - GUILayout.Label("手指" + i.ToString());
 - if(mf.id != -1)
 - {
 - GUILayout.Label("Id: " + mf.id);
 - GUILayout.Label("状态: " + mf.touch.phase.ToString());
 - }
 - else
 - {
 - GUILayout.Label("没有发现!");
 - }
 - GUILayout.EndVertical();
 - }
 - GUILayout.EndHorizontal();
 - }
 - public Vector3 GetWorldPos(Vector2 screenPos)
 - {
 - return Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, Camera.main.nearClipPlane + 10));
 - }
 - }
 
4、相关下载(点下面的链接)
           项目文件 和 发布好的apk,下载点这里(不需要下载积分)。
   注:这个apk对Android系统的要求是Android4.0及以上版本。
(如有转载请在文首注明出处,AnYuanLzh:http://blog.csdn.net/anyuanlzh/article/details/18367941)
【转】Unity 之 移动设备的触控操作的更多相关文章
- MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件
		
原文 MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...
 - Windows 8.1 应用开发 – 触控操作
		
与WPF相同Windows 8.1应用中也具有高级触控操作(Manipulation),其中包含了三种常见的触屏手势:平移.缩放.旋转,通过以下四种事件可为控件实现各种触控操作:Manipulatio ...
 - 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇04:如何实现触控操作》
		
4.如何实现触控操作 触控操作概述: 随着APPLE.Samsung.SONY等众多公司,将掌机.电脑和手机等产品在触控领域的不断探索,以触控为操作的机型越来越多的被投放到市场当中.触控游戏.触控软件 ...
 - 与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触控
		
原文:与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触 ...
 - amazeUI tab禁止左右滑动(触控操作)
		
参考:http://amazeui.clouddeep.cn/javascript/tabs/ 效果: html: <!DOCTYPE html> <html> <hea ...
 - 小强的HTML5移动开发之路(52)——jquerymobile中的触控交互
		
当使用移动设备进行触控操作时,最常用的就是轻击.按住屏幕或者手势操作,jQuery Mobile可以通过绑定的触控事件来响应使用者的特定触控行为. 一.轻击与按住 直接上代码(一切皆在代码中,细细品吧 ...
 - Windows phone 8 学习笔记(1) 触控输入(转)
		
Windows phone 8 的应用 与一般的Pc应用在输入方式上最大的不同就是:Windows phone 8主要依靠触控操作.因此在输入方式上引入一套全新的触控操作方式,我们需要重新定义相关的事 ...
 - Windows phone 8 学习笔记(1) 触控输入
		
原文:Windows phone 8 学习笔记(1) 触控输入 Windows phone 8 的应用 与一般的Pc应用在输入方式上最大的不同就是:Windows phone 8主要依靠触控操作.因此 ...
 - 安卓Tv开发(一)移动智能电视之焦点控制(触控事件)
		
前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大量使用,但是这些设备上的开发并不是和传统手机开发一样,特别是焦点控制和用户操作体验风格上有很大的区别,本系列博 ...
 
随机推荐
- html中rel标签是什么意思
			
<a> 标签的 rel 属性用于指定当前文档与被链接文档的关系.用于 <a> 标签的可选属性 rel 和 rev 分别表示源文档与目标文档之间正式的关系和方向.rel 属性指定 ...
 - 【转】HADOOP HDFS BALANCER介绍及经验总结
			
转自:http://www.aboutyun.com/thread-7354-1-1.html 集群平衡介绍 Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加 ...
 - safari的坑
			
当将图片src设置为空字符的时候,图片仍然还在:
 - 基于Extjs的web表单设计器 第五节——数据库设计
			
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
 - 转盘游戏[XDU1006]
			
Problem 1006 - 转盘游戏 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 87 Accep ...
 - BZOJ1099 : [POI2007]树Drz
			
首先1与i交换,n与i交换,i与i+1交换的可以$O(n)$算出. 然后只需要考虑i与x交换(1<i,x<n且|i-x|>1). 设 a[i]=h[i-1] b[i]=h[i+1] ...
 - POJ 1523 (割点+连通分量)
			
题目链接:http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. ...
 - 【wikioi】2800 送外卖(状压dp+floyd)
			
http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...
 - c++ namespace的使用
			
** namespace:命名空间就是为解决C++中的变量.函数的命名冲突而服务的. ** namespace定义的格式基本格式是: namespace identifier { entitie ...
 - Mybatis_mybatis常用jdbcType数据类型
			
MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED ...