うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】スクリプトからボタンのクリック処理を呼び出してみる

ボタンの実行処理自体は 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;
     
    // ヒットした中で上位の Interface 継承 オブジェクトを探す
    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));
}