はじめに
Windowsのアプリケーションではお目にかかる機会も多いDialog Boxですが、Unityのアプリケーションを開発している際にも同様のDialog Boxを表示させたくなりました。Windows+UnityならWindowsのFormからMessageを呼び出せる様ですが(未確認です)、OSに依存したプログラムというのは汎用性が下がるので避けたいところです。本記事では、私が行ったUnityでDialog Boxを表示する方法を紹介させて頂きます。
デザイン

まずは一番シンプルなDialog Boxです。機能としては、ただメッセージを表示するだけです。WindowsのDialog Boxだとボタンが1つはあると思いますが、まずは最低限のシンプルなDialog Bosを用意してみます。図1はこのDialog Boxのデザインです。黄色の部分は背景でDialog Boxの本体は青色の部分です。メッセージの内容をスクリプトから変更できます。
Hierarchy構造

このDialog Boxの表示のためのUnity Hierarchyを図2に示します。NovaUtilsはDialog Boxを管理する階層で、その下にある”CanvasDialog”はDialog Box表示のためのCanvasです。CanvasDialogの下、PanelMessageが図1の青色部分です。その下、TextMessageはTextMeshPro(日本語フォント)のメッセージ表示部分です。
Canvas設定
CanvasDialogの設定内容を図3に示します。Sort Orderで他のCanvasよりも手前に表示されることを期待して110といった値を設定しています。これは他のCanvasの値次第ですので調整してください。Canvas Scalerは1920×1080のHD解像度にしています。モニターに期待する最低限の解像度をHDとしていますが自身の想定で決定してください。

スクリプト
図4では、PanelMessageの設定内容の一部を表示しています。ここに制御用のスクリプト(DialogBoxScript)がコンポーネントとしてアタッチされています。

そのDialogBoxScriptを示します。
using UnityEngine;
using TMPro;
public class DialogBoxScript : MonoBehaviour
{
[SerializeField] TextMeshProUGUI messageText;
public void Show(string message, bool error = false)
{
if (error) messageText.color = Color.red;
else messageText.color = Color.white;
messageText.text = message;
this.gameObject.SetActive(true);
}
public void Hide()
{
this.gameObject.SetActive(false);
}
}
動作確認
PanelMessageオブジェクトの表示/非表示をスクリプトから制御してみます。下に示すスクリプトで動作確認しました。
using System.Collections;
using UnityEngine;
public class DialogBoxTestScript : MonoBehaviour
{
[SerializeField] private DialogBoxScript _dialog;
private InputSystem_Actions _input;
void Awake()
{
_input = new InputSystem_Actions();
}
void Start() { }
void Update() { }
private void OnEnable()
{
_input.Enable();
_input.Player.Button1.performed += ctx => ShowHideDialogBox();
}
private void ShowHideDialogBox()
{
StartCoroutine(ShowHideDialogBoxCo());
}
private IEnumerator ShowHideDialogBoxCo()
{
_dialog.Show("ダイアログボックスを表示しました", true);
yield return new WaitForSeconds(3f);
_dialog.Hide();
}
}
図5が動作結果です。このダイアログは3秒間表示された後に非表示となります。

mukai へ返信する コメントをキャンセル