Есть скрипт "UICtrl" который всё это создаёт, организует и содержит функции как реагировать на разные нажатия.
Есть скрипт "UIBuilder", в котором содержатся функции создания элементов, например:
Синтаксис:
Используется csharp
public static Image MakeImage(string name, GameObject parent, Rect rect, Sprite image)
А UI.Button я не использую, потому что не вижу в этом смысла. Вместо этого, на каждый элемент интерфейса, который должен реагировать на нажатия, вешаю скрипт типа следующего. Он кроме момента нажатия и отпускания, определяет было ли это быстрое касание или долгое. Как то так:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;
public class TouchLength : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public float threshold = .1f;
bool isLong = true;
public int i;
public UICtrl.Delegate OnShortTouch, OnLongTouch, OnTouchEnd, OnTouchBegin;
PointerEventData eData;
public void OnPointerDown(PointerEventData d)
{
eData = d;
isLong = false;
if (OnTouchBegin != null)
OnTouchBegin(i);
}
void Update()
{
if (!isLong && Time.unscaledTime > eData.clickTime + threshold)
{
isLong = true;
if (OnLongTouch != null)
OnLongTouch(i);
}
}
public void OnPointerUp(PointerEventData d)
{
if (Time.unscaledTime < eData.clickTime + threshold && OnShortTouch != null)
OnShortTouch(i);
if(OnTouchEnd != null)
OnTouchEnd(i);
isLong = true;
}
}
using UnityEngine.EventSystems;
public class TouchLength : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public float threshold = .1f;
bool isLong = true;
public int i;
public UICtrl.Delegate OnShortTouch, OnLongTouch, OnTouchEnd, OnTouchBegin;
PointerEventData eData;
public void OnPointerDown(PointerEventData d)
{
eData = d;
isLong = false;
if (OnTouchBegin != null)
OnTouchBegin(i);
}
void Update()
{
if (!isLong && Time.unscaledTime > eData.clickTime + threshold)
{
isLong = true;
if (OnLongTouch != null)
OnLongTouch(i);
}
}
public void OnPointerUp(PointerEventData d)
{
if (Time.unscaledTime < eData.clickTime + threshold && OnShortTouch != null)
OnShortTouch(i);
if(OnTouchEnd != null)
OnTouchEnd(i);
isLong = true;
}
}
В скрипте "UICtrl" есть
Синтаксис:
Используется csharp
public delegate void Delegate(int i);
А в "UIBuilder"
Синтаксис:
Используется csharp
public static void RegisterTouch(GameObject gameObject, int i, UICtrl.Delegate OnTouchBegin, UICtrl.Delegate OnShortTouch, UICtrl.Delegate OnLongTouch, UICtrl.Delegate OnTouchEnd)
{
TouchLength component = gameObject.AddComponent<TouchLength>();
component.OnShortTouch = OnShortTouch;
component.OnLongTouch = OnLongTouch;
component.OnTouchEnd = OnTouchEnd;
component.OnTouchBegin = OnTouchBegin;
component.i = i;
}
{
TouchLength component = gameObject.AddComponent<TouchLength>();
component.OnShortTouch = OnShortTouch;
component.OnLongTouch = OnLongTouch;
component.OnTouchEnd = OnTouchEnd;
component.OnTouchBegin = OnTouchBegin;
component.i = i;
}