Как происходит событие UI. С точки зрения архитектуры Unity

Программирование на Юнити.

Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение Roman777 14 май 2019, 23:36

Добрый день!
У меня есть непонимание организации событий в Unity посредством EventSystem (возможно, и событий в С# в целом).
Как получается, что при наследовании интерфейса, например IPointerDownHandler, определяемая мной функция "OnPointerDown" в классе ButtnScrollMe будет вызываться именно в при конкретном событии нажатия. Я не очень понимаю как именно организовано такое событие...

кому не трудно, не могли бы вы примером как-то и ли доступной литературой натолкнуть?

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


[RequireComponent(typeof(Image))]
public class ButtnScrollMe : MonoBehaviour, IPointerDownHandler, IPointerUpHandler{
        public bool dragOnSurfaces = true;

//      private int Mode = 2;

        private bool bStrtTime = false;
        private float startTime = 0f;
        private float waitTime = 0.5f;
        private bool onbegin = false;
        private bool ongoing = false;
        private bool onend = false;

        public PointerEventData eData;

        public void OnPointerDown(PointerEventData eventData){
                if (!bStrtTime) {
                        startTime = Time.time;
                        bStrtTime = true;
                        eData = eventData;
//                      this.gameObject.GetComponent<ButtnDragMe> ().eData = eventData;
                }
        }
        public void Update(){
                //If starts counting time
                if (bStrtTime) {
                        if (!onbegin && !ongoing) {
                                if (Time.time > startTime + waitTime) {
                                        //onBegin
                                        onbegin = true;
                                }
                        }
                        if (onbegin) {
                                ongoing = true;
                                onbegin = false;
                                bStrtTime = false;
                                SetChangeEvent ();
                        }
                }
                if (onend) {
                        onend = false;
                }
        }

        public void OnPointerUp(PointerEventData eventData){
                bStrtTime = false;
                ongoing = false;
                onbegin = false;
                onend = true;
        }

        private void SetChangeEvent(){
                this.gameObject.GetComponent<ButtnDragMe>().enabled = true;
                this.enabled = false;
        }
}
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09

Re: Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение lawson 15 май 2019, 08:31

что конкретно вы не понимаете? как Input module обрабатывает события, как определяется элемент на канвасе с которым произошло событие или как определить, что элемент имеет конкретный интерфейс?
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение Roman777 15 май 2019, 21:20

Не совсем. Я имею в виду, что сама функция OnPointerDown, получается, вызывается в каком-то обработчике (я имею в виду, что закопано под обёрткой...). Или вероятно она используется в функциях АПИ (разные функции, в зависимости от компиляции под разные системы). Функция же сама определяется именно мной в классе, наследующем интерфейс. Вот и не ясно, как эта функция вызывается ещё до определения мной. Просто получается, что я свой код, описывая его в определении этой событийной функции, словно встраиваю в нужном месте, предусмотренном архитектурой движка. В общем я, наверное, бред несу. Но саму систему такую вызова не очень понимаю.

Что касается Input module, тоже не очень ясно что это такое. Я думал, что он должен получать сообщения при вводе, но:
"The module sends pointer events to components as a mouse / input device is moved around, and uses the Graphics Raycaster and Physics Raycaster to calculate which element is currently pointed at by a given pointer device. You can configure these raycasters to detect or ignore parts of your Scene, to suit your requirements."
и судя, по всему, он отвечает за предоставление информации "PointerEventData eventData" в функцию, например:
Синтаксис:
Используется csharp
OnBeginDrag(PointerEventData eventData)
.

Не очень понятно, модуль ввода всегда один или их много?
Если я к одному компоненту прицепляю 2 кода, один наследует одни интерфейсы, второй наследует другие интерфейсы, в этом случае будут разные модули информацию слать компоненту или один и тот же?
Не особо ясно, просто, что происходит с этими событиями, когда я отключаю один из этих двух скриптов (события которого уже начали обрабатываться). Такое чувство, что пока я не прекращу ввод, не завершу его надлежащим образом (если был OnBeginDrag, то должен обязательно произойти OnEndDrag), события отключённого скрипта будут продолжать исполняться.
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09

Re: Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение 1max1 15 май 2019, 21:26

Немного инфы не совсем по теме, но рядом...
https://blogs.unity3d.com/2015/12/23/1k-update-calls/
http://qaru.site/questions/295544/in-un ... interfaces
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение Roman777 15 май 2019, 22:28

Спасибо, статьи очень интересные и познавательные. Как ни странно, на английском статья была более понятная, чем та, которая с машинным переводом)))

Но что происходит с функциями событий при выключении кода и запущенном событии... я всё же пока не понимаю)
Roman777
UNIт
 
Сообщения: 95
Зарегистрирован: 06 мар 2016, 12:09

Re: Как происходит событие UI. С точки зрения архитектуры Unity

Сообщение Carhvax 11 июн 2019, 20:00

Но что происходит с функциями событий при выключении кода и запущенном событии... я всё же пока не понимаю)

Ничего с ними не происходит. События- это триггеры. Нажимаешь кнопку, конпонент подписанный на это событие, обрабатывает положение указателя мыши, и если оно в пределах коллайдера, то вызывается у потомков OnMouseDown, и если не происходит OnMouseUp на следующем апдейте, вызывается OnBeginDrag. Потянули еще мышкой - OnDrag, отпустили клавишу мыши - OnEndDrag. А вы создавая потомков компонента, сообщаете предку путем объявления интерфейса, что будете обрабатывать какое-либо событие, но в юньке возможно в деталях немного не так организованно, но смысл тот же. Отвечая на ваш вопрос: отключенный скрипт, не получает никаких событий и ничего не происходит. Вот пример:

Синтаксис:
Используется csharp
public class Drag : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
   
    public void OnBeginDrag(PointerEventData e)
    {
        Debug.Log("Drag begin");

        gameObject.SetActive(false);
    }

    public void OnEndDrag(PointerEventData e)
    {
        Debug.Log("Drag end");
    }

    public void OnDrag(PointerEventData e)
    {
        Debug.Log($"Dragged at {e.position}");
    }
}

OnDrag не наступает.

Синтаксис:
Используется csharp
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;

public class Drag : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
   
    public void OnBeginDrag(PointerEventData e)
    {
        Debug.Log("Drag begin");


        Loop("OnDragEnd never started.");
    }

    async void Loop(string msg) {
        await Task.Delay(System.TimeSpan.FromSeconds(1));

        Debug.Log(msg);

        if(Application.isPlaying)
            Loop(msg);
    }

    public void OnEndDrag(PointerEventData e)
    {
        Debug.Log("Drag end");
    }

    public void OnDrag(PointerEventData e)
    {
        gameObject.SetActive(false);
    }
}


И еще пример
Carhvax
UNец
 
Сообщения: 1
Зарегистрирован: 11 июн 2019, 19:20


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4