何がしたいのか
モーダルとか出す時に、後ろに半透明のパネル引いて暗くしたりしますよね?
そこタップしてもボタンタップと同じ処理したいなーとか思うわけですよ。
閉じるとか、シナリオシーンの「次へ」とかね。
要するに、別のオブジェクトから他のボタンを押したいという事
どしたらいいか
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);
}
}
結果
普通の状態
半透明パネルにスクリプトを付け、targetにボタンを設定した
備考
ボタンを押した時のTransitionが不要なら、Selectable側のInterface実装は不要です
というか、その場合もう直接イベント叩こうよと。