Routationしてたらタッチイベントが取れなかった【Unity】【uGUI】

今回は、

UnityEngine.EventSystemsにあるIPointerDownHandlerだったりIPointerUpHandlerの実装クラス作って、 作ったスクリプトを適当なゲームオブジェクトにアタッチしたのにイベントが取れない!(タッチが反応してくれない!)

…ということがあったのでそれについてです。

この記事での環境

* Unity 2018.1.0f2 Personal(64bit)

前提(おさらい)

UnityEngine.EventSystemsにあるIPointerDownHandlerだったりIPointerUpHandlerを実装することで uGUIのImageButtonがタッチされたタイミングをとることができます。

public class PoyoPoyo : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public void OnPointerDown(PointerEventData eventData){
        //画面にタッチしたときの処理
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        //画面から手を離したときの処理
    }
}

マウスクリックとタッチを同じように扱ってくれるので、エディタ上ですぐ確認できて楽ちんです!

Routationしてたらタッチイベントが取れなかった

f:id:snoopopo:20180508072844p:plain

上記のような画像を組み合わせてコントローラーの十字キー風?に設置していたのですが、

f:id:snoopopo:20180508072842p:plain

その際に、上方向以外の方向の画像をタッチしてもイベントが取れませんでした。

上方向の画像以外はRectTransform#Rotationをいじって回転させている状態です。

対処法

f:id:snoopopo:20180508074404p:plain RectTransform#Rotationを変更していない親のゲームオブジェクトでラップすることで回避できます。

親のゲームオブジェクトに先ほど作ったIPointerDownHandlerを実装したスクリプトをアタッチします。 親のゲームオブジェクトのRectTransform#Rotationは変更しません。 注意が必要なのは、親のゲームオブジェクトにImage等のタッチに反応するコンポーネントを配置しないといけないことです。 ここではImageコンポーネントのカラーを透明にして親がもつImageは見えない(けど存在する)ようにしています。

f:id:snoopopo:20180508074401p:plain

回転させたい画像を持つゲームオブジェクトを作った親ゲームオブジェクトの子にします。

f:id:snoopopo:20180508074404p:plain

これでタッチイベントが取れるようになりました!