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#

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]; }
}
}