169 lines
4.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|