🍮

[Unity] TMP_Dropdownはプレースホルダーを設定できる

に公開

UnityでTMP_Dropdownを使用していて、プレースホルダーの設定に手間取ったので、設定方法を記録しておきます。

UnityのTMP_Dropdown(TextMeshPro2.1以降)では、プレースホルダーを設定することができます。
ただし、レガシーのDropdownではプレースホルダーを設定することはできません。

検証環境

  • MacBookAir M1
  • Unity 2022.3.12f1
  • TextMeshPro 3.0.6

プレースホルダーの設定方法

実装方法の一例を述べます。

1. TMP_Dropdownの配置

ヒエラルキー上でUI > Dropdown - TextMeshProを選択して、ドロップダウンを配置します。

2. プレースホルダー用テキストの作成

プレースホルダー用のテキストを作成します。ここでは、すでにDropdownオブジェクトの子として存在するLabelというオブジェクトを複製して使い回すことにします。

"PlaceHolderLabel"という名前にしてみました。このオブジェクトのTextMeshProUGUIコンポーネントを自由に編集して、好きなテキスト、色にします。

このような見た目にしてみました。

3. インスペクターでの設定

作成したDropdownをインスペクタで開き、Placeholderに、作成したプレースホルダー用のオブジェクト(のTextMeshProUGUIコンポーネント)を配置してください。また、Value-1に設定してください。

この状態でシーンを再生すると、以下のように、初めはプレースホルダーが表示されており、一度選択した後はプレースホルダーを選択できなくなっていることが確認できると思います。

後は、ゲームに合うようにデザインを修正して完了です。

注意点

TMP_Dropdownのplaceholderの設定はTextMeshPro 2.1 (2019.1~)から追加されたもので、それ以前のTMProには存在していなかったようです(参考:TextMeshPro2.0のドキュメント)

placeholder追加以前に書かれたと思われる記事では、日本語・英語いずれでも「標準のTMP_Dropdownではプレースホルダーを実現できません(意訳)」のような記事が多く見つかるため、それを間に受けて実装してしまうと、遠回りになってしまうかもしれません(私はしました)

インスぺクタを見るとすぐに気づけるかもしれませんが、私は気づきませんでした。(TMP_Dropdownの継承クラスを使っており、エディタ拡張が適切に継承されていなかったため、PlaceHolderがインスペクタに表示されていないというオチでした)

まとめ

TMP_Dropdownでプレースホルダーを設定する方法を説明しました。

ググって出てくる情報が必ずしも正しいとは限らない(バージョンアップで仕様が変わることもある)ので、ドキュメントをちゃんと読む+自分が使用しているソフトとドキュメントのバージョンを合わせることは重要だなあと感じました。

Discussion