Spriteのタッチ判定
環境
Unity2018.5f
最初に
uGUIのタッチ判定はEventSystemが管理してくれます。
ただすべてのオブジェクトをuGUIで表示するのは、まぁそれはそれでありなのでしょうが、用途次第では困ったりすることもあります。あるはずです。
なので、Spriteオブジェクトをタッチすることで操作する方法を今回は勉強しようと思います。
※普通に考えれば、Spriteはあくまで「描画するもの」であり、「操作するもの」ではありませんが。
なので本来なら操作するものはすべてUIで表示されるべきではあります。
今回は描画順序を操作するにあたり、Spriteで操作した方が遥かに楽そうだったので、この手法をとりました。
世の中のスマホアプリのオブジェクトをタッチして操作するゲーム(例えばカードゲームなど)はUIで表示しているのか、スプライトとして表示しているのかきになる点ではありますね。
そもそも描画順序とかだるいんですよねぇ。カードリストとかスクロールしなきゃいけないとして、そのスクロールエリアからドラッグで指定位置まで移動させるとなると、大抵は描画順序がキモになります。開発初期はまだしも、そこに別のボタンやら何やらが入ってくると・・・。まぁそんな小言は置いておきましょう(笑)
タッチ判定を取るために
今回はuGUIと同居することが前提です。
なので、これから実装するタッチ判定もすべてEventSystemに管理してもらいます。
すでにuGUIで何かオブジェクトを配置しているならHierarchyにEventSystemがあるはずですが、ない場合は作成しておきましょう。
まずRayを飛ばす、RayCasterをCameraにアタッチします。
どのCameraかは、タッチ判定をとりたいオブジェクトを描画するCameraにですね。
EventMaskやMax Ray Intersectionsは用途に応じて変更してください。
次にタッチ判定を取得したいオブジェクトに
BoxCollider、EventTriggerをアタッチします。
EventTriggerに取得したいイベントを登録する必要があるわけなのですが、それはエディタ上でもスクリプト上からでもどちらでも構いません。
Script上からやる場合は、IPointerClickHandlerなどのinterfaceを継承したクラスを作成し、タッチ判定を取得したオブジェクトにアタッチしましょう。
タッチ判定の順序
今回はSprite にEventTriggerをアタッチして、タッチ判定を取得しました。
その場合のタッチ判定オブジェクトが同一カメラ上で重なったときのタッチ処理の優先度は描画順と同一みたいですね。
Spriteの場合は、SortingLayer、OrderInLayer、z値(というよりカメラからの距離?)に準ずるみたいです。
おそらく3Dオブジェクトの場合も同じようになるのではないかと思います。
まとめ
意外と簡単にSpriteをタッチ判定をEventSystemと使って実現することができました。
これがuGUIと混同した場合はどうなるかとかありますが、おそらく描画順ではないのかとは思います。