unity3d 多点触屏_unity触屏多点触控 - CSDN
精华内容
参与话题
  • unity3D】单点和多点触控

    万次阅读 2015-03-12 10:13:05
     Input.touchCount获取当前的触摸点数目,若为1则是单点触控,大于1则是多点触控  点击事件用:Input.GetTouch(num).phase == TouchPhase.Began这样的格式 代码:  using UnityEngine;  using System....


    总结:

        Input.touchCount获取当前的触摸点数目,若为1则是单点触控,大于1则是多点触控

        点击事件用:Input.GetTouch(num).phase == TouchPhase.Began这样的格式


    代码:


        using UnityEngine;

        using System.Collections;

        public class click2 : MonoBehaviour {

            //设置点击时显示的图片

            public Texture2D img;

                void Start () {

            }

                void Update () {

            }

                void OnGUI () {

            //记录当前触控点数目

            int count = Input.touchCount;

            //单点触控,首个触控点的标志是0

            if (count == 1) {

              //if(Input.GetTouch(0).phase == TouchPhase.Began){

                 }

                 float x = Input.GetTouch(0).position.x;

                 float y = Input.GetTouch(0).position.y;

                 GUI.DrawTexture(new Rect(x,y,100,100),img);

            }

            //多点触控,遍历每个触摸点

            for (int i = 0 ; i < count ; i++){

                //if(Input.GetTouch(i).phase == TouchPhase.Began){}

                   float x = Input.GetTouch(i).position.x;

                   float y = Input.GetTouch(i).position.y;

                   GUI.DrawTexture(new Rect(x,y,100,100),img);

            }

        }

    }


    注意:


    记得把脚本文件拖到Camera里面

    然后设置脚本的图片




    展开全文
  • 1)、声明允许多点触屏  2)判断手指触摸到屏幕的位置  3)判断手指触摸到屏幕的数目  input.touchCount =0  return  input.touchCount =1  我们让其来做点事: (移动摄像机左右移动)  1)用phase来...
      1)、声明允许多点触屏
      2)判断手指触摸到屏幕的位置
      3)判断手指触摸到屏幕的数目
        input.touchCount =0
          return
        input.touchCount =1
          我们让其来做点事: (移动摄像机左右移动)
            1)用phase来判断触碰的状态
              Began:表示手指已触摸屏幕
              Move:手指在屏幕上移动
              End:手指从屏幕上移开。这是一个触摸的最后状态
              Canceled:系统取消跟踪触摸,如用户把屏幕放到 他脸上或超过五个接触同时发生。这是一个触摸 的最后状态。
              Stationary:手指触摸屏幕,但并没有移动。
            2)当判断Input.touches[0].phase ==TouchesPhase.Began
              用一个Verctor2记录下Input.touches[0].position
            3)当判断Input.touches[0].phase == TouchesPhase.Move
              此时就可用来移动主摄像机了 Camin.main.tranform.translate(new Verctor3(Input.touches[0].position.x*Time.deltaTime, Input.touches[0].position.y*Time.deltaTime,0))

        input.touchCount>1


          我们让其来做点事 移动摄像机的Z轴控制 远近,而达到物体放大 缩小的目的
            1、定义变量来储存两个touchCount的开始位置 与所移动的距离
              Vector2 finger1 = new Vector2()
          Vector2 finger2 = new Vector2()
              Vector2 mov1 = new Vector2()
              Vector2 mov2 = new Vector2()
            2、想像一个我们划动屏幕的动作 我们的两个手指放下后一般会一个 手指定住,一个手指移动来放大, 当然也会有两个手指都移动,但我 们只取这种状态来作判断即可
              在一个for循环里定义一个touch类型变量来 接收Input.touches[i]
                1、对touch.phase作判断 如果touch.phase ==touches.Ended 则break
                2对touch.phase作判断 如果touch.phase ==touches.Move
                  0、定议一个floa mov 来接收最终经过判断所移动的值
                    mov = move.x+move.y
                  1、for循环作一个判断i==1时对finger1、mov1、赋值
                  2、else里对finger2、mov2赋值,并对比较finger1与finger2的X、Y

                其实无论touchCount的数目是多少 我们都只取两个点来做判断即可


    以下插入总体源码(这个与上面所讲有点不同,这个直接挂在与要旋转放大缩小的物体上)

    using UnityEngine;
    using System.Collections;
    
    public class mobileChane : MonoBehaviour {
    
    	// Use this for initialization
    
        private float mx;
        private float my;
    
        private float xSpeed =3;
        private float ySpeed =3;
    
        private Vector2 start;
        private Quaternion mRoation;
    
    	void Start () {
            Input.multiTouchEnabled = true;
    	
    	}
    	
    	// Update is called once per frame
    	void Update () {
            MoblieInput();
    	
    	}
    
        void MoblieInput()
        {
            if(Input.touchCount ==0 )
            {
                return;
            }
    
            if(Input.touchCount ==1)
            {
                if(Input.touches[0].phase ==TouchPhase.Began)
                {
                    start = Input.touches[0].position;
    
    
                }
    
                if(Input.touches[0].phase ==TouchPhase.Moved)
                {
                    mx += Input.touches[0].deltaPosition.x * xSpeed;
                    my += Input.touches[0].deltaPosition.y * ySpeed; ;
    
                }
    
                mRoation = Quaternion.Euler(mx, my, 0);
                transform.rotation = mRoation;
                
    
    
            }
    
            else if(Input.touchCount>1)
            {
                Vector2 finger1 = new Vector2();
                Vector2 finger2 = new Vector2();
    
                Vector2 mov1 = new Vector2();
                Vector2 mov2 = new Vector2();
    
              //  Vector2 mov = new Vector2();
    
                for(int i = 0;i<2;i++)
                {
                    Touch touch = Input.touches[i];
    
                    if(touch.phase == TouchPhase.Ended)
                    {
                        break;
                    }
                    
                    if(touch.phase == TouchPhase.Moved)
                    {
                        float mov = 0;
    
                        if(i==0)
                        {
                            finger1 = touch.position;
                            mov1 = touch.deltaPosition;
    
                        }
                        else
                        {
                            finger2 = touch.position;
                            finger2 = touch.deltaPosition;
    
                            //开始做移动判断
                            if(finger1.x>finger2.x)
                            {
                                mov = mov1.x;
    
                            }
                            else
                            {
                                mov = mov2.x;
                            }
    
                            if(finger1.y >finger2.y)
                            {
                                mov += mov1.y; 
                            }
                            else
                            {
                                mov += mov2.y;
                            }
    
                        }
    
                        Camera.main.transform.Translate(0, 0, mov * Time.deltaTime);//主要通过控制主摄像的远近来放大缩小
    
                    }
                }
    
    
            }
        }
    
    }
    



    展开全文
  • Unity判断手势触摸的类型 ,判断手势的滑动方向,并获取刚触摸以及触摸结束事的坐标 本章咱们一起来看下unity对有触摸手势做出的响应 单点触摸 Input.touchCount==1 移动触摸 Input.GetTouch(0)....
    Unity判断手势触摸的类型 ,判断手势的滑动方向,并获取刚触摸以及触摸结束事的坐标

    本章咱们一起来看下unity对有触摸手势做出的响应

    单点触摸

    Input.touchCount==1

    移动触摸

    Input.GetTouch(0).phase==TouchPhase.Moved

    多点触摸

    Input.touchCount > 1

    判断两只手指至少有一只为移动触摸

    Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved

     

    /**

         * 判断是否为单点触摸

         **/

        public static bool singleTouch()

        {

            if(Input.touchCount==1)

                return true;

            return false;

        }

     

        /**

         * 判断单点触摸条件下  是否为移动触摸

         **/

        public static bool moveSingleTouch()

        {

            if (Input.GetTouch(0).phase==TouchPhase.Moved)

                return true;

            return false;

        }

     

        /**

         *判断是否为多点触摸 

         **/

        public static bool multipointTouch()

        {

            if (Input.touchCount > 1)

                return true;

            return false;

        }

     

        /**

         *判断两只手指至少有一只为移动触摸

         **/

        public static bool moveMultiTouch()

        {

            if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)

                return true;

            return false;

    }

     

    /**

         * 

         * 新建一个公共方法用于判断手指的移动方向 

         * 假如是往左或者往上 则模型往各个轴的正方向位置移动 函数返回1

         * 加入是往右或者往下 则模型往各个轴的负方向位置移动 函数返回-1

         * 

         * **/

        int judueFinger(){

            if (Input.GetTouch(0).phase == TouchPhase.Began && startPosFlag == true)

            {

                //Debug.Log("======开始触摸=====");

                startFingerPos = Input.GetTouch(0).position;

                startPosFlag = false;

            }

            if (Input.GetTouch(0).phase == TouchPhase.Ended)

            {

                //Debug.Log("======释放触摸=====");

                startPosFlag = true;

            }

            nowFingerPos = Input.GetTouch(0).position;

            xMoveDistance = Mathf.Abs(nowFingerPos.x - startFingerPos.x);

            yMoveDistance = Mathf.Abs(nowFingerPos.y - startFingerPos.y);

            if (xMoveDistance>yMoveDistance)

            {

                if(nowFingerPos.x-startFingerPos.x>0){

                    //Debug.Log("=======沿着X轴负方向移动=====");

                    backValue = -1;         //沿着X轴负方向移动

                }

                else

                {

                    //Debug.Log("=======沿着X轴正方向移动=====");

                    backValue = 1;          //沿着X轴正方向移动

                }

            }

            else

            {

                if (nowFingerPos.y - startFingerPos.y>0)

                {

                    //Debug.Log("=======沿着Y轴正方向移动=====");

                    backValue = 1;         //沿着Y轴正方向移动

                }else{

                    //Debug.Log("=======沿着Y轴负方向移动=====");

                    backValue = -1;         //沿着Y轴负方向移动

                }

            }

            return backValue;

        }


    展开全文
  • 这里的多点触摸实现方式具有通用性,在提供触摸事件调用和触摸点数据的情况下都可实现。首先,我们需要继承复写ScrollRect的OnDrag方法,让其在一个触摸点的情况下,使用原有拖拽功能,在两个点的情况下,滑动缩放。...

     这里的多点触摸实现方式具有通用性,在提供触摸事件调用和触摸点数据的情况下都可实现。首先,我们需要继承复写ScrollRect的OnDrag方法,让其在一个触摸点的情况下,使用原有拖拽功能,在两个点的情况下,滑动缩放。


    		private int touchNum = 0;
    		public override void OnBeginDrag (PointerEventData eventData)
    		{
    			if(Input.touchCount > 1) 
    			{
    				return;
    			}
    
    			base.OnBeginDrag(eventData);
    		}
    
    		public override void OnDrag (PointerEventData eventData)
    		{
    			if (Input.touchCount > 1)
    			{
    				touchNum = Input.touchCount;
    				return;
    			}
    			else if(Input.touchCount == 1 && touchNum > 1)
    			{
    				touchNum = Input.touchCount;
    				base.OnBeginDrag(eventData);
    				return;
    			}
    
    			base.OnDrag(eventData);
    		}
    


    使用unity自己的触摸判断,Input.touchCount,在正常情况下调用SrollRect自己的方法处理。否则,执行自己的处理。OnDrag中touchCout从多个变回一个的时候,我们首先需要调用一下OnBeginDrag,然后下一帧在执行一个点的逻辑。在实测用,这是为了解决从多个点变回一个点,但这个点是后触摸的点,会造成跳动的问题。



    多点滑动的逻辑是写在Update方法里面。经过测试,发现如果写在OnDrag方法里面。会出现放到最大继续快速滑动,或是最小在快速缩小,出现突然缩放的情况。而实际上应该不能继续放大或缩小。


    		private float preX;
    		private float preY;
    
    		private void Update()
    		{
    		   if (Input.touchCount == 2)
    			{
    				Touch   t1   = Input.GetTouch(0);
    				Touch   t2   = Input.GetTouch(1);
      
    				Vector3 p1   = t1.position;
    				Vector3 p2   = t2.position;
    
    				float   newX = Mathf.Abs(p1.x - p2.x);
    				float   newY = Mathf.Abs(p1.y - p2.y);
    
    				if (t1.phase == TouchPhase.Began || t2.phase == TouchPhase.Began)
    				{
    					preX = newX;
    					preY = newY;
    				}
    				else if (t1.phase == TouchPhase.Moved && t2.phase == TouchPhase.Moved)
    				{	
    					RectTransform rt    = base.content;
    					float         scale = (newX + newY - preX - preY) / (rt.rect.width * 0.25f) + rt.localScale.x;
    
    					if (scale > 1.0f && scale < 2.5f)
    					{		
    						float ratio   = scale / rt.localScale.x;
    
    						rt.localScale = new Vector3(scale, scale, 0);
    
    						float maxX    = base.content.rect.width  * scale / 2 - this.viewRect.rect.width  / 2;
    						float minX    = -maxX;
    
    						float maxY    = base.content.rect.height * scale / 2 - this.viewRect.rect.height / 2;
    						float minY    = -maxY;
    
    						Vector3 pos   = rt.position * ratio;
    
    						if (pos.x > maxX)
    						{
    							pos.x = maxX;
    						}
    						else if (pos.x < minX)
    						{
    							pos.x = minX;
    						}
    
    						if (pos.y > maxY)
    						{
    							pos.y = maxY;
    						}
    						else if (pos.y < minY)
    						{
    							pos.y = minY;
    						}
    
    						rt.position = pos;
    					}
    				}
    
    				preX = newX;
    				preY = newY;
    			}
    		}


    float newX = Mathf.Abs(p1.x - p2.x); 

    float newY = Mathf.Abs(p1.y - p2.y);

    这里我们计算的是两个触摸点坐标差值的绝对值。用来粗略的判断两个点的位置关系。


    t1.phase == TouchPhase.Began || t2.phase == TouchPhase.Began

    这个条件判断是为了,在移动条件达成时候,初始化前一个坐标点的数据。


    float scale = (newX + newY - preX - preY) / (rt.rect.width * 0.25f) + rt.localScale.x;

    这是一个粗略的判断算法。用新的xy差值减去上次的xy差值,这个结果反映了两个手指的距离变化。然后除以rt.rect.width,得到这个距离变化与缩放目标宽度的比例。0.25f是一个调整系数,用来控制scale的变化率。这里的数值就是根据手势得到的缩放率,然后加上原有的缩放数值,得到的scale就是最终需要缩放的数值。


    scale > 1.0f && scale < 2.5f

    这个条件约束了,最终的缩放的范围。


    后面的算法,做了两个事情。

    设置最终的缩放,然后计算边界的约束,让缩放后位置仍然在边界内。不然,我放大拖到边界,然后缩小就会越界的情况。

    根据缩放的倍率,来设置新的位置。比如,原有位置不在00点,缩放了,那么位置也缩放同一个倍率,就能让缩放中心同步出现在手势操作位置上,而不是物体中心。


    float ratio   = scale / rt.localScale.x;

    这里新的缩放值除以原有缩放值,得到的就是缩放的倍率。


    Vector3 pos = rt.position * ratio;

    用原有的位置坐标乘以缩放倍率,得到新的位置。



    float maxX = base.content.rect.width * scale / 2 - this.viewRect.rect.width / 2; 

    float minX = -maxX;

    float maxY = base.content.rect.height * scale / 2 - this.viewRect.rect.height / 2; 

    float minY = -maxY;

    这里是计算位置的边界。



    if (pos.x > maxX) {

          pos.x = maxX;

     } else if (pos.x < minX) { 

         pos.x = minX;

     } 


    if (pos.y > maxY) { 

        pos.y = maxY;

     }  else if (pos.y < minY)  {

        pos.y = minY;

     }

     rt.position = pos;


    根据边界计算新的位置坐标。




    展开全文
  • unity3d 触屏多点触控(旋转与缩放) unity3d 触屏多点触控(旋转与缩放) /*Touch OrbitProgrammed by: Randal J. Phillips (Caliber Mengsk)Original Creation Date: 12/16/2011Last Updated:....
  • Unity3D [示例源码]Multi+Touches+Demo 多点触摸加演示案例
  • Unity3D 游戏引擎之实现平面多点触摸(二)

    万次阅读 多人点赞 2012-05-04 00:11:20
    Unity游戏引擎之实现平面多点触摸雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/466在上一章中已经介绍了Unity for 3D 游戏引擎的构建...
  • Unity 触摸屏操作(多点触摸)

    千次阅读 2019-11-01 10:53:15
    当IOS或Android设备上运行Unity游戏时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的。Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动...
  • 关于Unity3d多点触屏输入问题

    千次阅读 2012-12-13 11:28:17
    最近在用Unity3D做一个2D的android手机休闲游戏,游戏中用两个GUItexture来控制角色左右行走和跳跃,第一次接触U3D觉得还是蛮很容易上手的。我整理了一下Manual里面关于Input的介绍,权当自己的学习小笔记吧。  接...
  • 在Awake中执行就行 Input.multiTouchEnabled = false;//禁止多点触摸
  • Unity 之大屏幕多点触控插件

    千次阅读 2018-07-19 18:32:11
    场景初始化,创建一个空的场景把对应的Cursors和TouchManger拖入到场景中,点击Play运行场景,就会出现对应的效果   然后创建一个Cube 并在其gameobject上添加两个组件 TransformGesture与Transformer,...
  • 透明投影+红外线激光多点触摸+unity win7多点触摸案例     明投影+红外线激光多点触摸+unity win7多点触摸案例 迟点把这个多点触摸的资料分享给大家   密码:www.yeehot.com...
  • Unity禁止移动端多点触控

    千次阅读 2019-05-06 10:02:05
    Input.multiTouchEnabled= false;
  • Unity 3D实现多点触控源代码

    千次阅读 2013-04-13 10:48:38
    //用于绑定参照物对象 var target : Transform; //缩放系数 var distance = 10.0; //左右滑动移动速度 var xSpeed = 250.0; var ySpeed = 120.0; //缩放限制系数 var yMinLimit = -20; var yMaxLimit = 80;...
  • 自己书写,就是简单的代码,unity5以上的版本本身就支持window7的多点触屏,写的不好,请多指教。
  • unity3D实现多点触碰

    2019-08-21 04:36:47
    实现多点触碰是利用input这个类里面的方法实现的。 从edit-project settings-input就可以看到input能够得到的轴。 想要读取轴向可以使用Input.GetAxis方法获取下列默认轴: “Horizontal” 和“Vertical” 映射于...
  • 前段时间做了个Windows系统的大屏触控程序,最多同时支持十点触控,并且在各自的小窗口中要分别处理,即每个小窗口中的触点为一个处理组,判断其单点或多点操作。按以往移动端程序的触屏事件Input.GetTouch(int ...
  • Unity中单点和多点触控

    千次阅读 2018-05-31 10:35:28
    Input.touchCount获取当前的触摸点数目,若为1则是单点触控,大于1则是多点触控点击事件用:Input.GetTouch(num).phase== TouchPhase.Began这样的格式:1. usingUnityEngine;2. 3. usingSystem.Collections;4. 5...
  • FingerGestures最大的好处就是结合unity3d进行多点触控,手势识别,编写一次代码 ,通过配置来进行多平台发布   FingerGestures提供了3种不同的方法来检测由用户执行的拖动手势。   方法1:使用默认...
  • FingerGestures最大的好处就是结合unity3d进行多点触控,手势识别,编写一次代码 ,通过配置来进行多平台发布 FingerGestures提供了3种不同的方法来检测由用户执行的拖动手势。 方法1:使用默认的手势事件 ...
1 2 3 4 5 ... 16
收藏数 318
精华内容 127
关键字:

unity3d 多点触屏