c1_unity/Assets/Scripts/Component/Touch/BFTouchSelectable.cs
2023-04-03 11:04:31 +08:00

169 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace BF
{
public enum SelectEventType
{
OnSelect = 0,
OnLongSelected,
OnDeselect,
OnLongDeselect,
OnSelectHit,
}
public class BFTouchSelectable : MonoBehaviour
{
BFEvent<SelectEventType, BFFinger> onEvent;
public BFEvent<SelectEventType, BFFinger> OnEvent
{
get
{
if (onEvent == null)
onEvent = new BFEvent<SelectEventType, BFFinger>();
return onEvent;
}
set
{
onEvent = value;
}
}
BFEvent<List<BFFinger>> onSelectGesture;
public BFEvent<List<BFFinger>> OnSelectGesture
{
get
{
if (onSelectGesture == null)
onSelectGesture = new BFEvent<List<BFFinger>>();
return onSelectGesture;
}
set
{
onSelectGesture = value;
}
}
public bool allowMutiFingers;
public bool allowOutOfRange;
public float longHitTime;
float timeCounter;
bool death;
public bool IsSelected { get; private set; }
public bool IsLongSelected { get; private set; }
List<BFFinger> selectFingers = new List<BFFinger>();
static List<BFFinger> filterFingers = new List<BFFinger>();
void OnEnable()
{
BFMain.Instance.TouchMgr.onFinger += OnFinger;
BFMain.Instance.TouchMgr.onGesture += OnFingerGuest;
}
void OnDisable()
{
BFMain.Instance.TouchMgr.onFinger -= OnFinger;
BFMain.Instance.TouchMgr.onGesture -= OnFingerGuest;
}
void OnFinger(TouchEventType eventType, BFFinger finger)
{
if (onEvent == null)
return;
switch (eventType)
{
case TouchEventType.Down:
OnFingerDown(finger);
break;
case TouchEventType.Touching:
OnFingerTouching(finger);
break;
case TouchEventType.Up:
OnFingerUp(finger);
break;
case TouchEventType.Hit:
OnFingerHit(finger);
break;
}
}
void OnFingerTouching(BFFinger finger)
{
if (!IsSelected || !selectFingers.Contains(finger))
return;
if (!death && !allowOutOfRange && finger.TargetTrans != transform)
death = true;
if (death)
return;
if (longHitTime > 0 && !IsLongSelected)
{
timeCounter += Time.deltaTime;
if (timeCounter >= longHitTime)
{
onEvent.Invoke(SelectEventType.OnLongSelected, finger);
timeCounter = 0;
IsLongSelected = true;
}
}
}
void OnFingerDown(BFFinger finger)
{
if (IsSelected && !allowMutiFingers)
return;
if (finger.startOverTargetLayer && finger.startTargetTrans == this.transform)
{
if (!IsSelected)
IsSelected = true;
onEvent.Invoke(SelectEventType.OnSelect, finger);
selectFingers.Add(finger);
}
}
void OnFingerUp(BFFinger finger)
{
if (selectFingers.Contains(finger))
{
selectFingers.Remove(finger);
if (selectFingers.Count == 0)
{
if (IsLongSelected)
{
onEvent.Invoke(SelectEventType.OnLongDeselect, finger);
IsLongSelected = false;
}
onEvent.Invoke(SelectEventType.OnDeselect, finger);
IsSelected = false;
timeCounter = 0;
}
death = false;
}
}
void OnFingerHit(BFFinger finger)
{
if (selectFingers.Contains(finger))
{
onEvent.Invoke(SelectEventType.OnSelectHit, finger);
}
}
void OnFingerGuest(List<BFFinger> fingers)
{
if (onSelectGesture == null)
return;
filterFingers.Clear();
for (int i = 0; i < selectFingers.Count; i++)
{
if (fingers.Contains(selectFingers[i]))
filterFingers.Add(selectFingers[i]);
}
if (filterFingers.Count > 0)
onSelectGesture.Invoke(filterFingers);
filterFingers.Clear();
}
}
}