Unity实现触摸屏多人点击/拖动不受干扰


问题:Unity打包到触摸屏,多人互动桌或触摸屏,采用默认的eventsystem时会出现干扰情况,玩家A进行拖动时,玩家B点击屏幕会默认为拖动的结束点,原因unity默认的IDrag类接口只支持单点操作。

解决方法Lean Touch插件实现按下手指的检测

主要方法如下

1

private LeanFinger controllingFinger;

 void Start()
 {
    
     // 禁用Unity的Raycast Target,完全使用Lean Touch
     gameObject.AddComponent<LeanSelectable>();
     gameObject.AddComponent<LeanDragTranslate>();
  
 }

 void OnEnable()
 {
     LeanTouch.OnFingerDown += HandleFingerDown;
     LeanTouch.OnFingerUpdate += HandleFingerUpdate;
     LeanTouch.OnFingerUp += HandleFingerUp;
 }

 void OnDisable()
 {
     LeanTouch.OnFingerDown -= HandleFingerDown;
     LeanTouch.OnFingerUpdate -= HandleFingerUpdate;
     LeanTouch.OnFingerUp -= HandleFingerUp;
 }

 private void HandleFingerDown(LeanFinger finger)
 {
     //  Debug.Log("Finger Down: " + finger.Index);
     // 检查触点是否在当前物体上且未被占用
     if (IsTouchOnThisObject(finger) && controllingFinger == null)
     {
         controllingFinger = finger;
         BeginDrag();

     }
 }

 private bool IsTouchOnThisObject(LeanFinger finger)
 {
     // 使用Lean Touch的射线检测
     var results = LeanTouch.RaycastGui(finger.ScreenPosition);
     return results.Exists(r => r.gameObject == gameObject);
 }

 private void BeginDrag()
 {
//处理开始逻辑
 }

 private void HandleFingerUpdate(LeanFinger finger)
 {
     if (finger == controllingFinger)
     {
         // 使用Lean Touch的平滑屏幕坐标转换
         rectTransform.position = finger.ScreenPosition;
     }
 }

 private void HandleFingerUp(LeanFinger finger)
 {
     if (finger == controllingFinger)
     {
         controllingFinger = null;
         HandleDrop(finger);
     }
 }

 private void HandleDrop(LeanFinger finger)
 {
     // 检测释放位置的有效性
     var results = LeanTouch.RaycastGui(finger.ScreenPosition);
    //处理释放逻辑
}

通过区分不同玩家的点击来区分不同的输入,以此来避免玩家之间的互相干扰