もんりぃ is undefined.

育児ネタとか、技術ネタとか。

Unity Case-Study / uGUI の当たり判定が効かない!?

はじめに

  • ちゃんと画像が描画されていて、RaycastTarget のチェックも付いていて、Canvas に GraphicRaycaster がアタッチされているのに、EventSystem が反応してくれない!という事案に遭遇。
  • 1時間くらいドハマリしたので、同じ事案でドハマリする人が一人でも減るように、恥を忍んで記録にしたためる。

前提

  • 実装としては以下の通り。
    • ランタイムで Texture2D から Sprite を生成して UnityEngine.UI.Image コンポーネントの sprite プロパティにセット。
    • RectTransform の anchoredPosition や localScale を変更。
    • 同じく RectTransform の SetSiblingIndex() で前後関係も変更。
  • 対象の Image コンポーネントの raycastTarget は true に設定されている。(デフォルトのまま)
  • Canvas には GraphicRaycaster をアタッチ済み。
    • 厳密には overwriteSorting を用いているので、ネストした子 Canvas にアタッチしている。
  • もちろん EventSystem コンポーネントと StandaloneInputModule コンポーネントもシーン内に存在している。

現象

  • 当たり判定がウンともスンとも反応しない。

原因

  • RectTransform.localScale 設定時に Vector2 な値をセットしていた。
  • RectTransform.localScale は Vector3 のプロパティであり、Vector2 を渡すと暗黙的変換により、 new Vector3(vector2.x, vector2.y, 0.0f) 的な値がセットされるコトになる。
  • この所為で、スケールの Z 値(すなわちオブジェクトの奥行き)がゼロになってしまい、「描画は行われるが当たり判定としては無視される」という状態になってしまった。

対応

  • 横着せずに Vector3 を渡しましょう。

所感

  • 暗黙的変換は便利なんだけど、警告も出ないからこの手のドハマリを引き起こす原因にもなったりするんだなぁ…。
  • 今回は割と直ぐに「ん…?ひょっとして…!?」と気付けたから良かったけど、気付けない時は全く気付けなかったりするから困る。