10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity] uGUIのボタンイベントを他のボタンに流す

Posted at

何がしたいのか

モーダルとか出す時に、後ろに半透明のパネル引いて暗くしたりしますよね?
そこタップしてもボタンタップと同じ処理したいなーとか思うわけですよ。
閉じるとか、シナリオシーンの「次へ」とかね。

要するに、別のオブジェクトから他のボタンを押したいという事

どしたらいいか

uGUIのButtonはSelectableと、IPointerClickHandler, ISubmitHandler継承していてます。
Selectableは以下のインターフェイスを継承しています。

  • IMoveHandler
  • IPointerDownHandler
  • IPointerUpHandler
  • IPointerEnterHandler
  • IPointerExitHandler
  • ISelectHandler
  • IDeselectHandler

これらのInterfaceで定義されたイベントを受け流して上げれば良いのです。

コード

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class BypassButtonEvent : MonoBehaviour, 
        IPointerClickHandler, ISubmitHandler,
        IMoveHandler,
        IPointerDownHandler, IPointerUpHandler,
        IPointerEnterHandler, IPointerExitHandler,
        ISelectHandler, IDeselectHandler
{
    public Button target;

    public void OnPointerClick(PointerEventData eventData)
    {
        target.OnPointerClick(eventData);
    }
    public void OnSubmit(BaseEventData eventData)
    {
        target.OnSubmit(eventData);
    }

    public void OnDeselect(BaseEventData eventData)
    {
        if (target != null)
            target.OnDeselect(eventData);
    }

    public void OnMove(AxisEventData eventData)
    {
        if (target != null)
            target.OnMove(eventData);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        if (target != null)
            target.OnPointerDown(eventData);
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        if (target != null)
            target.OnPointerEnter(eventData);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        if (target != null)
            target.OnPointerExit(eventData);
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if (target != null)
            target.OnPointerUp(eventData);
    }

    public void OnSelect(BaseEventData eventData)
    {
        if (target != null)
            target.OnSelect(eventData);
    }
}

結果

普通の状態

2395503194b6df757f592adcbf61032c.gif

半透明パネルにスクリプトを付け、targetにボタンを設定した

ec120f01624a7bd7494cffa05fa24d18.gif

備考

ボタンを押した時のTransitionが不要なら、Selectable側のInterface実装は不要です
というか、その場合もう直接イベント叩こうよと。

10
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?