unity的触摸类touch使用

2023-10-27

    这篇博文将简单的记录,如何用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

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

unity的触摸类touch使用 的相关文章

随机推荐

  • TVM 0.9 在 ubuntu(任意版本)上的安装(简单且保姆级!)

    近一年来尝试过TVM在ubuntu16 04 ubuntu18 04 ubuntu20 04 以及windows上的安装 也看了官方教程和网上各种博客 踩坑无数 现在总结在Ubuntu上踩坑几率最小的安装流程如下 建议学习TVM一开始就在u
  • fisco-bcos使用caliper进行压力测试

    使用caliper对fisco bcos进行压力测试 通过Caliper进行压力测试程序 注意 官网给出的测试案例会出现错误 我会给出相应的解决方案 本文以centos系统为例进行测试 1 环境要求 第一步 配置基本环境 部署Caliper
  • 勇敢的人

    昨天刚写完做个勇敢的人 发现一篇博客写的非常好 于是果断给它转载一下 这位老师的发言 在某个瞬间打动了现在的我 请观看 https blog csdn net zkl99999 article details 46683535 关键字 毛尖
  • iOS检测网络连接状态

    请从Apple网站下载示例 点此下载 然后将Reachability h 和 Reachability m 加到自己的项目中 并引用 SystemConfiguration framework 就可以使用了 Reachability 中定义
  • Java 23种设计模式的分类和使用场景

    听说过GoF吧 GoF是设计模式的经典名著Design Patterns Elements of Reusable Object Oriented Software 中译本名为 设计模式 可复用面向对象软件的基础 的四位作者 他们分为是 E
  • Qt创建的子线程不断循环,主线程界面一直处于无响应状态

    说明 今天用子线程处理数据 但只创建了子线程 还没有来得及让子线程处理大量的数据 在子线程只作了简单处理 发现主线程界面一直不能响应 在主线程让子线程参数isStop true 也跳不出循环 while isStop emit mySign
  • KCF追踪器在opencv和RM中的应用

    1 理论部分 参考文档 KCF目标跟踪方法分析与总结 概念 1 判别式模型和生成式模型 判别式模型 根据训练数据得到分类函数和分界面 比如说根据SVM模型得到一个分界面 然后直接计算条件概率 P y x 我们将最大的 P y x 生成式模型
  • 模拟登陆 Selenium

    模拟登陆 使用爬虫实现登录操作 为何需要做模拟登陆 有些平台只有登录之后才可以访问其内部其他的子页面 如何实现模拟登陆 模拟点击登录按钮发起的请求即可 阻力 验证码的识别 验证码识别 使用线上的打码平台进行各种各样验证码的识别 不包含滑动验
  • eclipse创建动态web项目

    1 打开eclipse 2 依次选择File new Dynamic Web Project 点击new如果没有Dynamic Web Project 选择Other 3 在wizards下输入web 在下面的选框中选择 Dynamic W
  • 前端(十七)——gitee上开源一个移动端礼盒商城项目(前端+后台)

    博主 小猫娃来啦 文章核心 gitee上开源一个移动端礼盒商城项目 文章目录 前言 开源地址 项目运行命令 项目基本展示 前端效果细节展示视频 前端代码细节展示视频 后台效果展示 后台代码展示 经典优势 思维导图 实现思路 前言 项目样式老
  • 养娃探索记录

    0 3岁 搞好身体 3 6岁 培养好生活习惯 6 9岁 培养好学习习惯 9 12岁 培养自学能力 12 15岁 了解三百六十行 不同行业不同职业都是做什么的 15 18岁 确定未来发展方向和人生目标 自我决定理论对我们的教育有着重要的指导作
  • Anaconda安装Pytorch,以及在Pycharm中的配置

    Anaconda安装Pytorch 以及在Pycharm中的配置 有关Anaconda安装请移步安装Anaconda Python3 9 Tensorflow pytorch cpu 打开Anaconda Prompt 创建环境 这个步骤同
  • 八大排序(二)-----堆排序

    基本思想 1 将带排序的序列构造成一个大顶堆 根据大顶堆的性质 当前堆的根节点 堆顶 就是序列中最大的元素 2 将堆顶元素和最后一个元素交换 然后将剩下的节点重新构造成一个大顶堆 3 重复步骤2 如此反复 从第一次构建大顶堆开始 每一次构建
  • JavaScript 浅层克隆和深度克隆

    文章目录 JS 浅层克隆和深度克隆 1 相关知识点 2 浅层克隆 2 1 浅克隆函数 2 2 运用实例 3 深度克隆 3 1 深克隆步骤分析 3 2 深克隆函数 3 3 运用实例 3 4 hasOwnProperty JS 浅层克隆和深度克
  • 【自学笔记】后端01_Web服务器01_Tomcat

    一 web服务器 web服务器是一个应用程序 对HTTP协议的操作进行封装 使得程序员不必直接对协议进行操作 简化开发 主要功能是 提供网上信息浏览服务 说人话 服务器的作用就是封装了HTTP协议操作简化网站部署 让人可以在浏览器访问部署的
  • 【Leetcode笔记】重复的子字符串

    Leetcode原题链接 重复的子字符串 零 前情提要 自己写了个暴力法 LeetCode的一个巨长的字符串测试 然后嫌弃我时间太长了没通过 先放这里了 自己测试着没什么问题 代码 class Solution def repeatedSu
  • python基础:基本数据类型:整数,浮点数,字符串

    基本数据类型介绍 整数 浮点数 字符串 在介绍之前先来了解一个python在终端窗口运行的解释器 在你安装好python之后 运行终端命令行 输入python后回车 你会看到你的python版本以及提示信息和 gt gt gt 等待输入 你
  • 安卓刷机之pixel

    刷机记录 提示 本例子是pixel sailfish 刷rom 提示 刷rom及刷容比较简单一点 1 首先去谷歌的官网去下载手机对应的机型 2 下载刷机工具platform tools zip github地址好像404了 不过下载的地方很
  • windows 64位 apachect2.4+php5.5 无法加载php_curl模块

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 环境 windows2008 64位 单独装了apachect2 4 php5 5版本 今天服务迁移后 一直报call to undefined function curl
  • unity的触摸类touch使用

    这篇博文将简单的记录 如何用unity处理在移动设备上的触控操作 iOS和Android设备能够支持多点触控 在unity中你可以通过Input touches属性集合访问在最近一帧中触摸在屏幕上的每一根手指的状态数据 简单的触控响应实现起