UGUI源码-Button

UGUI源码-Button

UGUI的部分UML图
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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
回溯到了EventSystem中的Update,(BaseInputModul)Process ->(TouchInputModul) ProcessTouchEvent -> ProcessToucePress -> Excecute -> OnPointHandler

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
到这里,就能够全面了解到点击发生的过程。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等事件。

未完待续。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值