今回は、プレイヤーがアイテムを取得したときに、メッセージボックスを表示して 「〇〇を取得した!」 と知らせる仕組みを作りたいと思います。
アクション、脱出、ホラーゲーム等アイテムを活用するゲームで便利に利用出来るかもしれませんので気になる方は試してみてください。
【Unity】アイテム取得時にメッセージボックスを表示する方法
① メッセージボックスのUIを作る
まずは外枠となるUIの部分から作っちゃいましょう。
Canvasを作成したら子要素としてPanelを作成します、名前はMessageBoxとしておきます。更にPanelの中にTextを作成して名前をMessageTextとします。このTextの内容は空にしておきます。Alignmentは中央にします。
PanelのColorからAlphaの値を0に変更します。
② メッセージボックスを制御するスクリプトを作る
スクリプト「MessageBoxUI」を作成します。
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class MessageBoxUI : MonoBehaviour
{
public TextMeshProUGUI messageText; // メッセージを表示するテキスト
public GameObject messagePanel; // メッセージボックス(Panel)
void Start()
{
messagePanel.SetActive(false); // 最初は非表示にしておく
}
// メッセージを表示する関数
public void ShowMessage(string message, float duration = 2f)
{
messageText.text = message;
messagePanel.SetActive(true);
StartCoroutine(HideMessageAfterTime(duration)); // 指定時間後に閉じる
}
// 指定時間後にメッセージを消す
private IEnumerator HideMessageAfterTime(float duration)
{
yield return new WaitForSeconds(duration);
messagePanel.SetActive(false);
}
}
スクリプトを作成したらPanelにアタッチします。
インスペクターからmessageTextにはmessageTextオブジェクトを、messagePanelにはmessageBoxオブジェクトを設定します。
取得した旨のメッセージを表示する関数を実行して、メッセージの設定を行いパネルを表示します。
メッセージはいつまでも表示しておくわけにはいかないので、一定時間経過した後にコルーチンを使ってメッセージを消すようにします。
③ アイテム取得時にメッセージを表示
各種アイテムにプレイヤーが触れた場合に、先ほどのShowMessage()メソッドを呼び出すようにするにで、アイテムにアタッチするスクリプトを作成します。
using UnityEngine;
public class ItemPickup : MonoBehaviour
{
public string itemName = "ポーション"; // 取得するアイテム名
private MessageBoxUI messageBox; // メッセージボックスUI
void Awake()
{
// シーン内の MessageBoxUI を探して取得
messageBox = FindObjectOfType();
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) // プレイヤーが触れたら
{
messageBox.ShowMessage(itemName + " を手に入れた!"); // メッセージ表示
Destroy(gameObject); // アイテムを消す
}
}
}
itemNameには、取得するアイテム名を設定します。アイテムがポーションの場合は、スクリプトのように「ポーション」と設定するわけですね。
今回は、例として「Sphere」をアイテムと見立ててシーン上に配置します。
このスクリプトをSphereにアタッチして、itemNameをポーションからSphereに変更します。
SphereのIs Triggerのチェックを入れてゲームを実行してみます。
するとこんな感じです。私のゲームでは、FPSControllerをプレイヤーとしているので、キー入力で移動させてSphereに接触すると画面中央に「〇〇を取得した!」と表示されます。
テキストを表示させる時間を変更したい場合には、ShowMessageのdurationの値を変更すればOKですね。
この辺りは、クリックに応じて非表示にするとか、アイテムの画像も一緒に表示させるとか応用することが出来ると思うので、是非やってみてください。