using System; using System.Collections.Generic; using UnityEngine; namespace BF { public enum SelectEventType { OnSelect = 0, OnLongSelected, OnDeselect, OnLongDeselect, OnSelectHit, } public class BFTouchSelectable : MonoBehaviour { BFEvent onEvent; public BFEvent OnEvent { get { if (onEvent == null) onEvent = new BFEvent(); return onEvent; } set { onEvent = value; } } BFEvent> onSelectGesture; public BFEvent> OnSelectGesture { get { if (onSelectGesture == null) onSelectGesture = new BFEvent>(); 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 selectFingers = new List(); static List filterFingers = new List(); 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 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(); } } }