• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity之手机端触控操作

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0407/448.html

Unity之手机端触控操作

 
本篇文章常州网站开发建设主要给大家引见如何用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、脚本就一个
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));
    }
 

上篇:上一篇:Unity贴图紧缩格式的选择
下篇:下一篇:Unity的canvas scaler组件