问题: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);
//处理释放逻辑
}
通过区分不同玩家的点击来区分不同的输入,以此来避免玩家之间的互相干扰