UGUI源码-Button

UGUI源码-Button

UGUI源码-Button_第1张图片
UGUI系统的所有组件都派生自UIBehaviour,Button、InputField、Scrollview等有交互功能的继承自Selectable,而其他Image、RawImage、Text继承自Graphic。
Selectable实现了交互的接口,EventSystem驱动交互。

Button源码

public class Button : Selectable, IPointerClickHandler, ISubmitHandler
    {
        /// Function definition for a button click event.
        // 它是unity的事件类	
        public class ButtonClickedEvent : UnityEvent {}

        // Event delegates triggered on click.
        private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();

        protected Button()
        {}
        public ButtonClickedEvent onClick
        {
            get { return m_OnClick; }
            set { m_OnClick = value; }
        }

        private void Press()
        {
            if (!IsActive() || !IsInteractable())
                return;

            UISystemProfilerApi.AddMarker("Button.onClick", this);
            m_OnClick.Invoke();
        }
       //OnPointerClick实现了IPointerClickHandler接口中定义的方法,
       //方法内部进行了判断,仅仅只有按下左键时才调用Press方法
        public virtual void OnPointerClick(PointerEventData eventData)
        {
            if (eventData.button != PointerEventData.InputButton.Left)
                return;

            Press();
        }
        
        public virtual void OnSubmit(BaseEventData eventData)
        {
            Press();

            // if we get set disabled during the press
            // don't run the coroutine.
            if (!IsActive() || !IsInteractable())
                return;

            DoStateTransition(SelectionState.Pressed, false);
            StartCoroutine(OnFinishSubmit());
        }

        private IEnumerator OnFinishSubmit()
        {
            var fadeTime = colors.fadeDuration;
            var elapsedTime = 0f;

            while (elapsedTime < fadeTime)
            {
                elapsedTime += Time.unscaledDeltaTime;
                yield return null;
            }

            DoStateTransition(currentSelectionState, false);
        }
    }
	UnityEvent类
	public class UnityEvent : UnityEventBase
    {
        [RequiredByNativeCode]
        public UnityEvent();

        public void AddListener(UnityAction call);
        public void Invoke();
        public void RemoveListener(UnityAction call);
        protected override MethodInfo FindMethod_Impl(string name, object targetObj);
    }

回溯到谁来调用OnPointerClick

UGUI源码-Button_第2张图片
UGUI源码-Button_第3张图片
UGUI源码-Button_第4张图片
在这里插入图片描述
UGUI源码-Button_第5张图片
回溯到了EventSystem中的Update,(BaseInputModul)Process ->(TouchInputModul) ProcessTouchEvent -> ProcessToucePress -> Excecute -> OnPointHandler

UGUI源码-Button_第6张图片
UGUI源码-Button_第7张图片
UGUI源码-Button_第8张图片

UGUI源码-Button_第9张图片
到这里,就能够全面了解到点击发生的过程。EventSystem的Update轮询执行BaseInputModule.Process ,如果是手势触摸,则调用到了子类TouchInputModule(父类BaseInputModule).Process,继续调用ProcessTouchEvent方法,再调用PorcessTouchPress,里面处理了一些point、drag等事件,处理point,调用ExecuteEvent.Execute(),函数中GetEvent()获取到target(点击到的物体)上的IPointerClickHandler,回调EventFunction(handler,data)执行OnPointerClick,调用到Press,onClick.Invoke。这样就执行到了Button.onClick.AddListener(func)的func。

EventSystem

UGUI源码-Button_第10张图片
在ProcessTouchEvent方法中,先GetPointerData,获取到后再进入ProcessTouchPress方法中处理point 、drag等的Execute,处理pointerClickHandler等事件。

未完待续。。。

你可能感兴趣的:(Unity-UGUI,Unity,UGUI)