UGUI源码-Button
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等事件。