【Unity3D】利用Touch类编写手游触控操作演示

 


目录

1.效果展示

2.博客介绍

3.具体思路和写法

(1)Touch类介绍

(2)编写Touch管理类

(3)修改摇杆控制

4.资源下载

5.推送

6.结语



1.效果展示


2.博客介绍

       手游开发和端游总会有很多的差别,在端游中获取点击的方式我们会选择Input.GetMouseButton(index)。index=0,获取的就是鼠标左键;index=1,获取的就是鼠标右键;index=2,获取的就是鼠标的中键,但是在手机上可是没有鼠标的,我们有的只是手指的触碰,所以在手游开发的时候就需要在获取触碰的时候和端游用不同的方法,本篇博客基于作者上一篇UGUI摇杆的制作的文章,没有看过的同学可以简单的浏览下,本篇博客主要介绍了手游开发时,多点触控的一些操作。


3.具体思路和写法

(1)Touch类介绍

        Touch类包含了手游中所有的触控信息,在PC端无意义,这里属性不一一介绍,想了解更对可自行查找API,同学们可以抽象的将Touch理解为手指,手指触摸屏幕,便实例化一个Touch,放在Input.touches数组内,我们可以通过Input.GetTouch(fingerId)来获取对应的手指信息,fingerId为Touch类的唯一标识。

(2)编写Touch管理类

       基础知识我们介绍完了,我们现在来编写我们的Touch管理类,我们每次触碰屏幕的时候,需要从Input.touches中获取我们对应的手指,来拿到正确的信息,这里有一点需要注意,如果有两个手指同时在触碰屏幕,他们的fingerId分别是0和1,如果这个时候,你将fingerId为0的手指移开,那么Input.touches数组内就只有一个Touch就是fingerId为1的Touch,如果现在你再次触碰一个新手指,这个新手指分配的fingerId是0,并且在Input.touches内会排在第一位,在fingerId为1的Touch前面,这个算法会默认的将之前的空缺填补,所以获取手指信息的时候一定要注意。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// time:2018/12/16
/// author:King.Sun
/// description:Touch管理
/// </summary>
public class TouchManage
{
	/// <summary>
	/// 单例-方便获取
	/// </summary>
	private static TouchManage _instance;
	public static TouchManage Instance
	{
		get
		{
			if (_instance==null)
			{
				_instance = new TouchManage();
			}
			return _instance;
		}
	}
	
	/// <summary>
	/// 该集合包含了已经被占用的手指
	/// </summary>
	public  List<Touch> useTouchList = new List<Touch>();							  

	/// <summary>
	/// 获取手指
	/// </summary>
	/// <returns></returns>
	public  Touch GetFinger()
	{
		Touch touch = new Touch();
		
		//在这里,如果数组内只有一个Touch你可以直接获取该手指
		if (Input.touchCount==1)
		{
			touch = Input.GetTouch(0);
		}
		else
		{
			//如果Input.touches长度大于1,那么我们比对Input.touches和useTouchList的差异,
			//除去相同的,不相同的第一位就是我们要获取的手指Touch
			foreach (Touch tt in Input.touches)
			{
				bool isUse = false;
				foreach (Touch utouch in useTouchList)
				{
					if (tt.fingerId==utouch.fingerId)
					{
						isUse = true;
					}
				}

				if (!isUse)
				{
					touch = tt;
				}
			}
		}
		
		//我们获取Touch后将该Touch放在已使用的数组内,标记为已使用
		if (!useTouchList.Contains(touch))
		{
			useTouchList.Add(touch);
		}
		return touch;
	}
	
	/// <summary>
	/// 向已使用数组中删除手指--不用的时候我们删除手指
	/// </summary>
	/// <param name="touch"></param>
	public  void RemoveFinger(Touch touch)
	{
		if (useTouchList.Contains(touch))
		{
			useTouchList.Remove(touch);
		}
	}
}

(3)修改摇杆控制

基于上次的摇杆控制,我们这里修改几个地方,增加摇杆的Touch,和Id

        /// <summary>
	/// 摇杆手指
	/// </summary>
	private Touch _joyFinger;
	/// <summary>
	/// 摇杆手指ID
	/// </summary>
	private int _joyFingerId;

并在Start中初始化和赋值

        void Start ()
	{

		
		_joyFinger = new Touch();
		_joyFingerId = -1;

	}

在开始拖拽事件中,我们根据_joyFingerId是否为初始值来判断手否为第一次触碰,在这里从我们之前编写的TouchManager中获取手指,给摇杆位置赋值,并为_joyFingerId附上对应Touch的fingerId,这样在触碰中,即使有其他手指也不会再受影响,因为id不同,不会再进行判断。

        /// <summary>
	/// 开始拖动
	/// </summary>
	public void OnDragBegain()
	{
		if (_joyFingerId==-1)
		{
			//获取手指
			_joyFinger = TouchManage.Instance.GetFinger();
			//移动中心点赋值
			_moveCenter = _joyFinger.position;
			//显示摇杆
			_joyBg.gameObject.SetActive(true);
			//摇杆背景位置修正到点击位置
			_joyBg.position = _moveCenter;
			//摇杆中心位置修正到点击位置
			_joyCenter.position = _moveCenter;
			_joyFingerId = _joyFinger.fingerId;
		}
	}

在拖拽进行事件中,变动不大,增加一层判断,如果手指Id不同不会进行判断,获取实时位置,采用的Input.GetTouch(index)的方法。

        /// <summary>
	/// 正在拖动
	/// </summary>
	public void OnDragMove()
	{
		if (_joyFinger.fingerId==_joyFingerId)
		{
			//中心店到触摸点的向量赋值
			_mouseToCenterVect = Input.GetTouch(_joyFinger.fingerId).position - _moveCenter;
			//中心店到触摸点的距离计算
			_mouseToCenterDistance = Mathf.Clamp(_mouseToCenterVect.magnitude,0,100);
			//根据距离来判断摇杆中心的位置
			_joyCenter.position = _mouseToCenterVect.normalized * _mouseToCenterDistance + _moveCenter;
			//摇杆中心的X - 移动中心的x就是水平的变化值,这里 /100 控制_hor在(-1,,1)之间
			_hor = (_joyCenter.position.x - _moveCenter.x)/100;
			//摇杆中心的Y - 移动中心的Y就是垂直的变化值,这里 /100 控制_hor在(-1,,1)之间
			_ver = (_joyCenter.position.y - _moveCenter.y)/100;

			//角度就是 中心店到触摸点的向量 和 2D平面Y轴正方向的夹角,这里只能显示0——180度
			_rotAngle = Vector3.Angle(_mouseToCenterVect, Vector3.up);

			//这里根据_hor的正负来判断摇杆中心是位于移动中心左侧还是右侧,然后修改度数,显示在0——360之间
			if (_hor<0)
			{
				_rotAngle = 360 - _rotAngle;
			}
			//Vector3.forward 以Vector3.up为中心旋转轴,旋转_rotAngle度,这里计算出主角的旋转度数
			_forwardTarget = Quaternion.AngleAxis(_rotAngle, Vector3.up) * Vector3.forward;
		}
		
	}

在拖拽结束事件当中,依旧增加一层判断,Id不同不会进行判断,判断后移除手指。

        /// <summary>
	/// 拖动结束
	/// </summary>
	public void OnDragEnd()
	{
		if (_joyFinger.fingerId==_joyFingerId)
		{
			//水平移动值归零
			_hor = 0;
			//垂直移动值归零
			_ver = 0;
			//隐藏摇杆
			_joyBg.gameObject.SetActive(false);
			//归-1
			_joyFingerId = -1;
			//移除手指
			TouchManage.Instance.RemoveFinger(_joyFinger);
		}
	
	}

 

开头演示效果,只要复制一份代码和场景内物体就可以实现了,新的点击区域设置在右侧


4.资源下载

原工程:https://download.csdn.net/download/mr_sun88/10854434

测试请打包或者使用Remote

博主Unity版本号:2018.2.0


5.推送

先空着


6.结语

        希望各位同学看过本篇博客后能有所收获,最好是先浏览一下前一篇文章,不然可能跳度有点大,另博主能力有限,文中若有错误的地方期望各位看家可以指点交流。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

       本文属于原创文章,转载请著名作者出处并置顶!!!!!

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值