今は、下記のようにスクリーン座標からRayを飛ばしてspriteを取得していますか?
この場合、UnityEngine.EventSystems
が自動的に処理してくれる重なり順を意識してくれません。
C#
1Ray ray = Camera.ScreenPointToRay(Input.mousePosition);
2RaycastHit2D hit = new RaycastHit2D();
3(省略)
解決方法は2通りあります。
1. uGUIが利用中か判定して利用中は処理しないようにする
今のコードにあまり修正を加えたくない場合はこちらです。EventSystem.current
で現在アクティブなEventSystem
を取得し、uGUIを操作しているか判定できるので操作中は処理しないようにすれば実現できます。
C#
1//PCやエディタの場合
2IsTouchUGUI = EventSystem.current.IsPointerOverGameObject();
3//モバイルの場合
4IsTouchUGUI = EventSystem.current.IsPointerOverGameObject(touch.fingerId);
2. spriteのクリック判定にEventSystemを使う
今のコードに大幅な変更が加わりますが余計な判定がいらないのがこちらです。EventSystem
のRaycasterを使うと自動的に重なり順を判定してくれます。実装方法やサンプルコードは過去に回答したのでそちらのリンクを共有します。
https://teratail.com/questions/92939#reply-144631
最小のサンプルコード
C#
1using UnityEngine;
2using UnityEngine.EventSystems;
3
4public class ClickSprite : MonoBehaviour, IPointerClickHandler
5{
6 public void OnPointerClick(PointerEventData eventData)
7 {
8 Debug.Log("Spriteがクリックされました。");
9 }
10}
実装例ではIPointerClickHandler
というオブジェクトをクリックする実装方法を記載しましたが、ドラッグやホバーなどたくさんの種類があります。
https://docs.unity3d.com/ja/2018.2/ScriptReference/EventSystems.IPointerClickHandler.html