Правильно ли я делаю интерфейс и распознование нажатий?

Графический интерфейс пользователя

Правильно ли я делаю интерфейс и распознование нажатий?

Сообщение AABB 13 фев 2018, 13:32

В проекте, который должен идти на Windows и Android, должно быть много всяких информативных окон, кнопок, рамочек. Использую UI с Canvas. И пока что все элементы интерфейса создаются скриптом на старте приложения.
Есть скрипт "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;
    }
}


В скрипте "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;
    }
AABB
UNIт
 
Сообщения: 134
Зарегистрирован: 05 фев 2014, 15:52

Вернуться в uGUI

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 2