您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页UGUI源码-Button

UGUI源码-Button

来源:爱够旅游网

UGUI源码-Button

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


到这里,就能够全面了解到点击发生的过程。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


在ProcessTouchEvent方法中,先GetPointerData,获取到后再进入ProcessTouchPress方法中处理point 、drag等的Execute,处理pointerClickHandler等事件。

未完待续。。。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务