退廃的ソースコードコンテナ

ゲームシステムを組むのが好きな人の備忘録

【Unity】呼び出すだけでゲーム内にウィンドウが表示されるシステムを作ってみた

皆さんこんにちは。

今回は、Unityのゲーム内ウィンドウを表示するスクリプトを紹介します。

 

早速ですが、ゲーム内ウィンドウってどうやって表示していますか?

例えば、ゲーム終了時の「本当に終了しますか?」だったり、セーブデータを消去時の「本当に終了しますか?」の確認に使うウィンドウですが、表示方法は千差万別、様々あると思います。

 

今回は、Instantiateでウィンドウを生成するタイプのシステムで作ってみます。

また、処理もウィンドウ内で行うのでスクリプト簡潔に済みます。

 

ソースコード活用例も載っているので、よろしければ最後までお読みください。

 

目次

 

ウィンドウの一例

本当に終了しますか?の確認画面

基本のソースコード

gist989bbd3724e9a79b38fce66e025730c8

 

設定方法

ウィンドウの作成と呼び出し

+ボタン→UI→画像(Image)

まず、以下の手順でUI→画像(Image)UIオブジェクトを生成します。

 

画像(Image)をアタッチしたUIオブジェクトを用意

次に、生成されたオブジェクトにウィンドウの原型となる画像を貼り付けます。

このときの大きさがウィンドウサイズになるので、大きさはここから変更します。

 

ウィンドウに表示するテキストを用意する

また、今回生成したオブジェクトに先程のスクリプトをアタッチします。

 

子オブジェクトでテキストを用意する

次に、そのオブジェクトの子オブジェクトとしてテキストを用意してください。

テキストの形式はTextでもTextMeshProでも、画像で用意した文章でも構いません。

 

最後に、このオブジェクトをプレハブ化(Prefab)しておいてください。

 

呼び出し元のオブジェクトに画像のような変数を追加する

工程は呼び出し元のオブジェクトの方に移ります。

呼び出し元のオブジェクトにアタッチされたスクリプトに、ErrorWindow型(表示するウィンドウにアタッチしたスクリプトの変数を2つ用意します。

 

変数を2つ用意した理由は後ほど説明しますが、

片方はインスペクターからアタッチさせるため、インスペクターに表示する設定にしておいてください。

また、呼び出し元のスクリプトでは、インスペクターから先程作成したプレハブを選択してください。

 

呼び出す作業を行う

呼び出し元のスクリプトで、先程の変数を使ってウィンドウの生成を行います。

画像のような手順でInstantiateを行って、生成したオブジェクトを変数に格納してください。

 

格納される側の変数は、先ほど作成した変数のうち、

インスペクターに表示する方ではない変数でお願いします。

 

ウィンドウ表示中は操作を受け付けないようにする

ウィンドウ表示中は操作を受け付けないようにする

インスペクターに表示しない方の変数、つまりInstantiateで生成された情報を格納した変数は、

ウィンドウが削除されると自動的に変数の値がnullに書き換わります

 

つまり、ウィンドウ情報がnullの値は処理を行わない設定にしておくと、

ウィンドウ表示中は処理を停止することができます。

 

ウィンドウ表示中の誤作動防止などに役立つと思うので、ご活用ください。

 

ウィンドウ表示の際にコントローラーを振動させる

先程貼ったソースコードのうち、コメントアウトされている「ゲームパッド」関連のコードをコメント解除すると、ウィンドウ表示時にコントローラーが振動するようになります。

 

ただし、InputSystemの機能を使っているため、

UnityのInputSystemのパッケージがダウンロードされていることが前提です。

 

InputSystemの導入方法については、以下のページが分かりやすいです。

forpro.unity3d.jp

 

実行結果

こんな感じでウィンドウが表示される

ここまでの設定が上手く行っていれば、このような感じでウィンドウが表示されるはずです。

ウィンドウが表示されない場合、Debug.Logなどを使って、ウィンドウの生成箇所にプログラムが到達しているかを確認してみてください。

 

活用例

ウィンドウを揺らさないタイプの表示方法にする

「ウィンドウを揺らす」と書いてある箇所をコメントアウト

ウィンドウを揺らさない形式で表示したい場合、

Startに存在する「ウィンドウを揺らす」と書いてある箇所を削除してください。

 

また、ウィンドウを揺らす範囲などはインスペクターから調整できます。

 

選択肢が存在するタイプのウィンドウを作る

冒頭で貼った画像のように、「はい」と「いいえ」の選択肢が存在する場合の作り方も説明します。

 

ソースコード

まず、こちらのソースコードを別のクラスとして用意してください。

gistc5a911d4c71f2f3ccbe8c347b28d0f51

 

プレハブを作成

「はい」と「いいえ」の項目を子オブジェクトに追加する

次に、先程と同じ手順でプレハブ(Prefab)を作成します。

その際、子オブジェクトに「はい」と「いいえ」の空オブジェクトを用意します。

 

今回はテキストを画像で用意

なお、今回はテキストを画像(Image)形式で用意しています。

用意した「はい」と「いいえ」の項目に画像(Image)をアタッチしてください。

 

勿論、先程のウィンドウと同じようにテキスト形式で文字を入れることも可能です。

ソースコードにあるImageの変数をTextもしくはTextMeshPro変更してください。

 

作成した子オブジェクトを選択

最後に、インスペクターから、

SelectItemYesSelectItemNoに作った子オブジェクトを選択してください。

 

インスペクターのRoleから役割を変更する

一連の流れが終わったら、後は先ほどと同じ手順で呼び出すだけです。

呼び出し元のスクリプトから、InstantiateでPrefabを生成してください。

 

役割別に処理を変更する

EndProcess関数にRoleList別の処理を定義する

また、このスクリプトでは役割ごとに「はい」選択時の処理を変更することができます。

クラス内にあるenumRoleListの項目を増やして、EndProcess関数で処理を書き加えてください。

 

表示例

こんな感じでウィンドウが表示される

 

最後に

非常に長い記事となりましたが、今回は2パターンのウィンドウを紹介しました。

振動の有無も含めれば3パターンのウィンドウになりますし、汎用性も高いと思います。

 

もし、Unityの自作ゲームでゲーム内にウィンドウを表示する機会があったら、ご活用ください。

最後までお読み頂き、ありがとうございました。

 

システム系統の関連記事

islingtonsystem.hatenablog.jp