ボタンの実行処理自体は onClick に対して Invoke をすれば呼び出しはできます
Button.onClick.Invoke();
しかしこれはボタンが押せる状態じゃなくても実行することができてしまいます
そのためボタンに Ray が通ればボタンを押せると判定して押す処理を書いてみます
クリック処理は 下記順番で Handler を呼び出すことで可能になります
1. IPointerEnterHandler
2. IPointerDownHandler
3. IPointerClickHandler
4. IPointerUpHandler
5. IPointerExitHandler
<summary>
</summary>
private bool ButtonClick(PointerEventData eventData)
{
var eventData = new PointerEventData();
var hits = new List<RaycastResult>();
UnityEngine.EventSystems.EventSystem.current.RaycastAll(eventData, hits);
if (hits.Length <= 0)
return false;
var gameObject = FindParentIEventSystemObject(hits[0].gameObject);
if (gameObject == null)
return false;
return true;
}
private GameObject FindParentIEventSystemObject(GameObject gameObject)
{
var current = gameObject.transform;
while (current != null)
{
var target = current.gameObject.GetComponent<IEventSystemHandler>();
if (target != null)
return current.gameObject;
current = current.parent;
}
return null;
}
<summary>
</summary>
private void DoClick(GameObject gameObject, PointerEventData eventData)
{
ExecuteEvents.Execute<IPointerEnterHandler>(gameObject, eventData, (handler, ev) => handler.OnPointerEnter((PointerEventData)ev));
ExecuteEvents.Execute<IPointerDownHandler>(gameObject, eventData, (handler, ev) => handler.OnPointerDown((PointerEventData)ev));
ExecuteEvents.Execute<IPointerClickHandler>(gameObject, eventData, (handler, ev) => handler.OnPointerClick((PointerEventData)ev));
ExecuteEvents.Execute<IPointerUpHandler>(gameObject, eventData, (handler, ev) => handler.OnPointerUp((PointerEventData)ev));
ExecuteEvents.Execute<IPointerExitHandler>(gameObject, eventData, (handler, ev) => handler.OnPointerExit((PointerEventData)ev));
}