You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
6.6 KiB
C#
171 lines
6.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine;
|
|
|
|
namespace Autohand
|
|
{
|
|
public class AutoInputModule : BaseInputModule
|
|
{
|
|
private List<HandCanvasPointer> pointers = new List<HandCanvasPointer>();
|
|
private PointerEventData[] eventDatas;
|
|
|
|
AutoInputModule _instance;
|
|
private bool _isDestroyed = false;
|
|
|
|
/// <summary>Returns the current pointer being checked when triggering input events, should only be used during built in UI input events</summary>
|
|
public HandCanvasPointer currentPointer { get; private set; }
|
|
|
|
public AutoInputModule Instance
|
|
{
|
|
get
|
|
{
|
|
if (_isDestroyed)
|
|
return null;
|
|
|
|
if (_instance == null)
|
|
{
|
|
if (!(_instance = AutoHandExtensions.CanFindObjectOfType<AutoInputModule>()))
|
|
{
|
|
_instance = new GameObject().AddComponent<AutoInputModule>();
|
|
_instance.transform.parent = AutoHandExtensions.transformParent;
|
|
}
|
|
|
|
|
|
|
|
EventSystem[] system = null;
|
|
BaseInputModule[] inputModule;
|
|
|
|
inputModule = AutoHandExtensions.CanFindObjectsOfType<BaseInputModule>();
|
|
if (inputModule.Length > 1)
|
|
{
|
|
for (int i = inputModule.Length - 1; i >= 0; i--)
|
|
{
|
|
if (!inputModule[i].gameObject.GetComponent<AutoInputModule>())
|
|
Destroy(inputModule[i]);
|
|
Debug.LogWarning("AUTO HAND: REMOVING ADDITIONAL EVENT SYSTEMS FROM THE SCENE");
|
|
}
|
|
}
|
|
|
|
system = AutoHandExtensions.CanFindObjectsOfType<EventSystem>();
|
|
if (system.Length > 1)
|
|
{
|
|
for (int i = system.Length - 1; i >= 0; i--)
|
|
{
|
|
if (!system[i].gameObject.GetComponent<AutoInputModule>())
|
|
Destroy(system[i]);
|
|
Debug.LogWarning("AUTO HAND: REMOVING ADDITIONAL EVENT SYSTEMS FROM THE SCENE");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
}
|
|
|
|
protected override void OnDestroy()
|
|
{
|
|
_isDestroyed = true;
|
|
}
|
|
|
|
public int AddPointer(HandCanvasPointer pointer)
|
|
{
|
|
if (!pointers.Contains(pointer))
|
|
{
|
|
pointers.Add(pointer);
|
|
eventDatas = new PointerEventData[pointers.Count];
|
|
|
|
for (int i = 0; i < eventDatas.Length; i++)
|
|
{
|
|
eventDatas[i] = new PointerEventData(eventSystem);
|
|
eventDatas[i].delta = Vector2.zero;
|
|
eventDatas[i].position = new Vector2(Screen.width / 2, Screen.height / 2);
|
|
}
|
|
}
|
|
|
|
return pointers.IndexOf(pointer);
|
|
}
|
|
|
|
public void RemovePointer(HandCanvasPointer pointer)
|
|
{
|
|
if (pointers.Contains(pointer))
|
|
pointers.Remove(pointer);
|
|
foreach (var point in pointers)
|
|
{
|
|
point.SetIndex(pointers.IndexOf(point));
|
|
}
|
|
eventDatas = new PointerEventData[pointers.Count];
|
|
for (int i = 0; i < eventDatas.Length; i++)
|
|
{
|
|
eventDatas[i] = new PointerEventData(eventSystem);
|
|
eventDatas[i].delta = Vector2.zero;
|
|
eventDatas[i].position = new Vector2(Screen.width / 2, Screen.height / 2);
|
|
}
|
|
}
|
|
|
|
public override void Process()
|
|
{
|
|
#pragma warning disable
|
|
for (int index = 0; index < pointers.Count; index++)
|
|
{
|
|
try
|
|
{
|
|
if (pointers[index] != null && pointers[index].enabled)
|
|
{
|
|
currentPointer = pointers[index];
|
|
pointers[index].Preprocess();
|
|
// Hooks in to Unity's event system to handle hovering
|
|
eventSystem.RaycastAll(eventDatas[index], m_RaycastResultCache);
|
|
eventDatas[index].pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
|
|
|
|
HandlePointerExitAndEnter(eventDatas[index], eventDatas[index].pointerCurrentRaycast.gameObject);
|
|
|
|
ExecuteEvents.Execute(eventDatas[index].pointerDrag, eventDatas[index], ExecuteEvents.dragHandler);
|
|
}
|
|
|
|
}
|
|
catch { }
|
|
}
|
|
#pragma warning restore
|
|
}
|
|
|
|
public void ProcessPress(int index)
|
|
{
|
|
pointers[index].Preprocess();
|
|
// Hooks in to Unity's event system to process a release
|
|
eventDatas[index].pointerPressRaycast = eventDatas[index].pointerCurrentRaycast;
|
|
|
|
eventDatas[index].pointerPress = ExecuteEvents.GetEventHandler<IPointerClickHandler>(eventDatas[index].pointerPressRaycast.gameObject);
|
|
eventDatas[index].pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(eventDatas[index].pointerPressRaycast.gameObject);
|
|
|
|
ExecuteEvents.Execute(eventDatas[index].pointerPress, eventDatas[index], ExecuteEvents.pointerDownHandler);
|
|
ExecuteEvents.Execute(eventDatas[index].pointerDrag, eventDatas[index], ExecuteEvents.beginDragHandler);
|
|
}
|
|
|
|
public void ProcessRelease(int index)
|
|
{
|
|
pointers[index].Preprocess();
|
|
// Hooks in to Unity's event system to process a press
|
|
GameObject pointerRelease = ExecuteEvents.GetEventHandler<IPointerClickHandler>(eventDatas[index].pointerCurrentRaycast.gameObject);
|
|
|
|
if (eventDatas[index].pointerPress == pointerRelease)
|
|
ExecuteEvents.Execute(eventDatas[index].pointerPress, eventDatas[index], ExecuteEvents.pointerClickHandler);
|
|
|
|
ExecuteEvents.Execute(eventDatas[index].pointerPress, eventDatas[index], ExecuteEvents.pointerUpHandler);
|
|
ExecuteEvents.Execute(eventDatas[index].pointerDrag, eventDatas[index], ExecuteEvents.endDragHandler);
|
|
|
|
eventDatas[index].pointerPress = null;
|
|
eventDatas[index].pointerDrag = null;
|
|
|
|
eventDatas[index].pointerCurrentRaycast.Clear();
|
|
}
|
|
|
|
public PointerEventData GetData(int index) { return eventDatas[index]; }
|
|
}
|
|
} |