0


基于Unity的EventSystem捕捉多指操作

目标

采集玩家操作,为后续游戏逻辑提供玩家的操作事件。包含的操作有
1、点击操作。玩家手指按下并未滑动的情况下抬起手指,最终返回点击位置。当有多个手指同时按下,只记录最后抬起的手指。
2、单指滑动。玩家单个手指按下并滑动,返回手指滑动的向量(二维向量)。单指滑动中,其他手指的操作将被忽略。
3、双指滑动。玩家同时按下两根手指并滑动,返回两根手指间距离的变化量。
注意点:
1、所有的返回值单位都是像素单位,基于当前设备的分别率
2、所有操作以手指按下开始,所有手指抬起结束,任何中间过程导致操作不满足条件,都要所有手指抬起后才能重新开始。比如,双指操作的时候,一根手指抬起再放下,将不再响应任何玩家操作,必须所有手指抬起后才能继续。
3、在PC上,用滚轮模拟双指操作

实现

using System;using UnityEngine;using UnityEngine.EventSystems;publicclassCanvasInput:MonoBehaviour, IPointerDownHandler
    , IPointerUpHandler
    , IDragHandler
    , IBeginDragHandler
    , IEndDragHandler
    , IScrollHandler
{public Action<float> OnPinch;public Action<Vector2> OnDrag;public Action<Vector2> OnClick;privateint pointerNum;privateint[] pointers =newint[2];private Vector2[] pointerPositions =newVector2[2];privatefloat fingerDistance;privateint state;privateint draggingCount;void IBeginDragHandler.OnBeginDrag(PointerEventData eventData){++draggingCount;if(state ==2){
            fingerDistance = Vector2.Distance(pointerPositions[0], pointerPositions[1]);}}void IDragHandler.OnDrag(PointerEventData eventData){switch(state){case1:{// 单指操作if(eventData.pointerId == pointers[0]){OnDrag(eventData.delta);}break;}case2:{// 双指操作int pointId = eventData.pointerId;if(pointers[0]== pointId){
                        pointerPositions[0]= eventData.position;}elseif(pointers[1]== pointId){
                        pointerPositions[1]= eventData.position;}else{break;}float distance = Vector2.Distance(pointerPositions[0], pointerPositions[1]);OnPinch(fingerDistance - distance);
                    fingerDistance = distance;break;}default:return;}}void IEndDragHandler.OnEndDrag(PointerEventData eventData){--draggingCount;}void IPointerDownHandler.OnPointerDown(PointerEventData eventData){if(pointerNum <2){
            pointers[pointerNum]= eventData.pointerId;
            pointerPositions[pointerNum]= eventData.position;}++pointerNum;if(state !=-1&& draggingCount==0){
            state = pointerNum;}}void IPointerUpHandler.OnPointerUp(PointerEventData eventData){--pointerNum;if(pointerNum ==0){if(draggingCount ==0){OnClick(eventData.position);}
            state =0;}elseif(state >1){
            state =-1;}}void IScrollHandler.OnScroll(PointerEventData eventData){OnPinch(eventData.scrollDelta.y *100);}}
标签: unity 游戏引擎

本文转载自: https://blog.csdn.net/whr12/article/details/123484238
版权归原作者 whr12 所有, 如有侵权,请联系我们删除。

“基于Unity的EventSystem捕捉多指操作”的评论:

还没有评论