たこすのunity雑記帳

unity初心者がunity関連の備忘録として書いています。

【UI】イベントトリガーが反応しなかった時の解決法

スマホゲーの複数解像度対応

いま非常に頭を悩ませているのが、スマホ向けゲームの複数解像度対応(正確にはアスペクト比かも)です。

昔は16:9がスマホの主流でしたが、どんどん縦長化が進み、今では19.5:9やら20:9、

もっと縦長の21:9(Xperia)、さらには22:9(Galaxy)なんてのもあります。

タブレットまで目を向けると4:3みたいな比較的おデブちゃん横長のものまでありますよね。

いろいろググりまくって迷走中です。上手く解決できそうだったらいいなぁ。

解像度の参考サイトを張りつけときますので参考までにご覧ください。

www.genz.jp

クリック時のイベントトリガーが反応しねぇ!→解決しました

結論:Main CameraにPhysics 2D Raycasterをつける

結論は先に書いた通りなので、過程をつらつらと書いていきます。

今回、僕は2D(URP)テンプレートでクリッカーゲームを作ろうと思いました。いわゆるポチポチゲーというものです。

当たり前ですが、画面をポチポチすることでポイントが入る仕組みになっています。

普段ならButtonを使うところですが、イベントトリガーで実装することにしました。

ポチポチする範囲はコライダーで調整したかったし、透明なオブジェクトなのでボタンは変かな?と思ったからです。

TapAreaという空のオブジェクトを作成し、ボックスコライダーとイベントトリガー、

TapManagerというスクリプトをアタッチしました。中身はテスト用で、以下の通りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;

public class TapManager : MonoBehaviour
{
    [SerializeField] TMP_Text cntText; // カウント用テキスト
    public int tapPoint = 1; // 1タップごとにもらえるポイント
    public static int count = 0;

    void Start()
    {
        cntText.text = count.ToString();
    }
    
    void Update()
    {
        
    }

    public void OnTap()
    {
        count += tapPoint;
        cntText.text = count.ToString();
        Debug.Log("タップ!");
    }
}

簡単なスクリプトですが、一応解説します。僕も初心者ですし、出来れば初心者にわかりやすく書きたいので。

僕の使っているエディタバージョン(2022.3.4)では、普通のTextがレガシー(過去の遺物的な?)扱いなので

TextMeshProのTextを使用しました。そのために以下2行をusingに追加しています。

using TMPro;
using UnityEngine.UI;

フィールドとしてポイントの表示用テキスト、1タップごとにもらえるポイント、タップした回数のカウント用

変数をそれぞれ用意しています。

publicと[SerializeField]が混在しているのは気にしないでください。気にしろ?

 [SerializeField] TMP_Text cntText; // カウント用テキスト
    public int tapPoint = 1; // 1タップごとにもらえるポイント
    public static int count = 0;

ポチポチするたびにポイントを追加する用のOnTapというメソッドを定義しました。

このメソッドはpublicにしないと次の作業が上手くいきません。

 public void OnTap()
    {
        count += tapPoint;
        cntText.text = count.ToString();
        Debug.Log("タップ!");
    }

続いて、下の図のようにTapManagerのcntTextに表示したいテキストをアタッチ、

イベントトリガーのAdd New Event Typeを押し、PointerClickを選択して+ボタンを押します。

TapManagerをアタッチして、黄色下線部のところをクリックすると、その中にTapManagerの

OnTapというメソッドがあるはずなので、それを選びます。

※さっきも言いましたが、OnTapのメソッドがpublicになっていないと一覧のところに表示されません!

出てこなかったらメソッドを確認しましょう。僕は何回もこれをやらかしています。

これで設定完了・・・ではありませんでした。何回クリックしても全く反応がありません。

何か透明なオブジェクトが遮ってるのか?と思ってチェックしましたが、そういうのもありません。

1時間ほど無駄にしてようやくたどり着いたのが、「Main CameraにPhysics 2D Raycasterをつけ忘れていた」ことでした。

Physics 2D Raycasterがないやつ

Physics 2D Raycasterをつけねば。

3DプロジェクトならPhysics Raycasterをアタッチすればいいと思います。知らんけど。

とにかく、この状態で起動してクリックすると・・・?

ちゃんとカウントされました!!!良かった~。

ちなみに、ボタンっぽい他のオブジェクトは現状置物です笑

まとめ?

その他、イベントトリガーが動かない要因としては、

  • シーンにEventSystemがない

  • イベントトリガーがアタッチされているオブジェクトにコライダーがない

  • イベントトリガーの設定がなされていない(Event設定をしていない、オブジェクトやメソッドの設定忘れなど)

などが考えられます。Main CameraにPhysics 2D Raycasterをつけるのと合わせて確認しましょう。

自戒の意味をふんだんに込めて終わりにします。unity、ムツカシイネェ。