unity的触摸类touch使用

这篇博客介绍了如何在Unity3D中实现多点触控管理,包括创建手指对象容器、初始化触控标记和粒子效果,并在Update中处理触控事件,展示手指触摸位置和轨迹。同时,博主分享了如何根据触控阶段调整粒子效果,以增强游戏交互体验。
/*
 * 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));
    }


}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值