Unityに関連する記事です

 シーン遷移の処理と、各シーン内の時間の設定と管理を行う機能を実装します。

 各シーンに管理用のスクリプトを作成する方法ではなくて、シーンの名前から自動的にシーンごとのゲーム時間を設定し、
時間のカウントダウン、残り時間が 0 になった際の処理までを1つのサイクルとして運用するようにしていく設計を考えます。


<実装動画(デバッグ用に同じシーンを読み込んでいます)>
動画ファイルへのリンク




設計


 ゲームシーンが遷移した場合、シーン内にあるゲームオブジェクトはすべて破棄されます。
そのため、「現在のシーンの名前」の情報については、シーンに紐づかないゲームオブジェクトで管理する必要があります。
そうしておかないと、管理しているゲームオブジェクトがシーンとともに破棄されて情報が失われてしまうためです。

 今回は新しく作成する SceneStateManager スクリプト内で、現在のシーンの管理を行うようにします。
シングルトンクラスのため、他のクラスから参照しやすいことと、 DontDestroyOnLoad メソッドを一緒に記述しているため、
シーンに紐づかないので、シーン遷移が発生しても破棄されないためです。

 なお、同じくシングルトンクラスである GameData クラスで管理を行っても問題はありません。

 さらにもう1つスクリプトを作成し、そちらでは現在のシーンの名前からゲーム時間を取得して、自動的に残り時間のカウントダウンを行います。
残り時間が 0 になったときには、やはり現在のシーンの名前から次に遷移するシーンを自動的に取得して、シーンの遷移を行います。

 この機能を実装することで、ゲーム内のシーンの時間管理と遷移処理とを、この2つのスクリプトのみで運用できるようにします。


時間表示用のゲームオブジェクトを作成する


 新しい Canvas ゲームオブジェクトを作成し、子オブジェクトに TextMeshPro コンポーネントを持つゲームオブジェクトを作成します。
この TextMeshPro コンポーネントにゲーム内の時間表示を行わせます。Outline コンポーネントなどの装飾は任意です。

 また数字のみで味気ない場合には、背景用の Image コンポーネントを作成してもよいと思います。

 配置する場所や、サイズなどは任意です。下記に実装サンプルを提示しておきます。

 この例では通常の UI として表示しています。
ワールド空間に表示してもよいですが、その場合、プレイヤーの視点が動いた際に時間表示が見えない位置に発生するため、
実装する際にはその辺りのユーザビリティのテストが必要になります。



ヒエラルキー画像



Canvas ゲームオブジェクト



TextMeshPro ゲームオブジェクト



 以上で完成です。


SceneStateManager スクリプトを作成する


 シーン遷移を専門に行うクラスとして、SceneStateManager スクリプトを作成します。
このクラスも GameData クラスと同じように、シングルトンクラスかつ、DontDestroyOnLoad メソッドを記述して破壊されないようにしておきます。
 

SceneStateManager.cs

<= クリックすると開きます



SceneStateManager ゲームオブジェクトを作成して、スクリプトをアタッチする


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty をして新しいゲームオブジェクトを作成します。
名前は SceneStateManager に変更し、SceneStateManager スクリプトをアタッチします。

 CurrentSceneName 変数には、ゲームを開始するシーンか、デバッグを行うシーンを設定しておきます。

 ScreenFade 変数はスクリプト内で取得を行うため、 None の状態のままで問題ありません。


インスペクター画像


 なお、他のシーンでもデバッグしやすいように、SceneStateManager ゲームオブジェクトはプレファブにしておくと使いやすいです。

 以上でこのゲームオブジェクトは完成です。


GameSceneManager スクリプトを作成する


 2つのパターンの実装例を示します。

 1つは UniRX を利用せず while 文を活用した場合の実装方法です。
もう1つは UniRX の ReactiveProperty などの機能を活用した実装方法です。

 どちらでも問題ありません。


GameSceneManager.cs  ( UniRX は使わない)

<= クリックすると開きます





GameSceneManager.cs  (◆UniRX を使う)

<= クリックすると開きます



GameSceneManager ゲームオブジェクトを作成して、スクリプトをアタッチする


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty をして新しいゲームオブジェクトを作成します。
名前は GameSceneManager に変更し、GameSceneManager スクリプトをアタッチします。

 searchTime 変数と invationAndEscapeTime 変数には初期値が入りますので、あとで調整してください。
また、デバッグ用の変数も用意してありますので、シーン遷移の確認用に利用してください。

 txtGameTime 変数には、Canvas ゲームオブジェクトの子オブジェクトである時間表示用の TextMeshPro コンポーネントがアタッチされているゲームオブジェクトをアサインします。
ただしこの情報は、GameSceneManager ゲームオブジェクト以外のゲームオブジェクトよりアサインしているため、シーン遷移時にアサインが外れます


インスペクター画像



 先ほど作成した Canvas を GameSceneManager ゲームオブジェクトの子オブジェクトにすることにより、
シングルトンクラスである親オブジェクトとともに Canvas ゲームオブジェクトと TextMeshPro ゲームオブジェクトが存在することになるため
時間表示のゲームオブジェクトごとシーン遷移させることが出来ます。


ヒエラルキー画像



 この構造にすることにより、GameSceneManager スクリプトの TxtGameTime 変数のアサインが外れなくなります。(常に一緒にシーン遷移するため)

 この辺りには細心の気配りが必要になります。シーン遷移の際には特に注意しておくことを覚えておきましょう。

 以上でこのゲームオブジェクトは完成です。


プレイヤー用のゲームオブジェクトの設定を確認する


 OVRPlayerController ゲームオブジェクト内にある OVRCameraRig / TrackingSpace / CenterEyeAnchor ゲームオブジェクトの Tag を確認します。
MainCamera タグが設定されていれば問題ありませんが、設定されていない場合には、タグの設定を行ってください。


インスペクター画像


 これは MainCamera タグを利用して、SceneStateManager スクリプトがフェード処理用の OVRScreenFade コンポーネントを見つけるようにするためです。

 SceneStateManager ゲームオブジェクト自体は DontDestroyOnLoad メソッドによりシーン遷移しても破壊されませんが、
OVRPlayerController ゲームオブジェクトはシーン遷移のたびに破棄されます。

 よって、SceneStateManager スクリプトにアサインしている OVRScreenFade コンポーネントの情報もアサインが外れてしまうため、
シーン遷移が発生するたび、その都度、ヒエラルキーにある MainCamera タグを検索して、OVRScreenFade コンポーネントを取得し直すようにしています。


ゲームを実行して動作を確認する


 以上で完成です。まずは、同じシーンに繰り返し遷移をするかどうか、デバッグ用の時間を使って試してみてください。


<実装動画>
動画ファイルへのリンク


 シーン遷移してもエラーなどが出ず問題なければ、他のシーンへの遷移も試しておくといいでしょう。
特に SceneStateManager スクリプトの OVRScreenFade コンポーネントの取得がシーン遷移時にちゃんと成功するかを確認しておきましょう。
取得に失敗する場合には、MainCamera タグの確認を行ってください。



 以上で、シーンの時間管理とシーン遷移の処理は完成です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます