Unityに関連する記事です

 シーンの再読み込みをせずに、同一シーン内において異なる設定を行ってシーン内容を切り替える機能を実装します。
今回は、探索シーンと侵入シーンにおいて同じステージの情報を利用するため、これらを各シーンに分けるのではなく、
1つのシーン内に探索パートと侵入パートを設定し、探索パートが終了したら、シーン遷移ではなく、同じシーン内で異なる設定を行うようにしています。


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




設計


 各パートの情報を登録するためのクラスを作成し、それを複数管理するためのスクリプトを作成し、ステージデータとしてスクリプタブル・オブジェクトにします。

 ステージデータにしておくことで、異なるステージの情報を複数登録し、管理できるようにします。
スクリプタブル・オブジェクトを利用できる状態にするため、DataBaseManager クラスの修正を行います。

 また、GameSceneManager クラスを修正して、これらのステージの情報を活用し、各パートの設定を行うようにします。
探索パートにおいては、探索パート用の Skybox、ゲーム時間、スタート地点用などを設定します。

 探索パートが終了したら、同一シーン内ではありますが、今度は侵入パートの設定をステージの情報から読み込んで、
探索パートと同じように、侵入パート用の Skybox、ゲーム時間、スタート地点用などを設定します。

 侵入パートが終了したら、そこで初めてシーン遷移を行い、リザルトシーンへと移行するように修正しています。

 いままであるメソッドを上手く活用しつつ、新しい処理をつくっていますので、設計の部分の見直しが重要になっています。


PartData スクリプトを作成する


 同一シーン内で内容を切り替える際に利用するためのクラスを作成します。
このクラス1つがシーンの切り替えに利用されることになりますので、
今回のケースでは探索パートと侵入パートの2つの PartData を作り、
次に作成する StageData クラス内で List にして管理して運用を行います。


PartData.cs

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


 スクリプトを作成したらセーブします。


StageDataSO スクリプトを作成する


 StageData クラスを内包(入れ子クラス)にした StageDataSO スクリプトを作成します。
このスクリプトはスクリプタブル・オブジェクトとして作成しますので、MonoBehaviour ではなく、ScriptableObject を継承します。

 StageData クラスには先ほど作成した PartData クラスを List で管理できるようにしています。


StageDataSO.cs

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


 スクリプトを作成したらセーブします。


シーン内にスタート地点用のゲームオブジェクトを配置してプレファブにする


 探索パート用と侵入パート用に分けて(同じでもいいです)、プレイヤーのスタート地点とするためのゲームオブジェクトを新しく作成して配置します。

 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択します。
配置したら、名称を分かりやすいもの(StartPos など)に変更してプレファブにしてください

 プレファブ後はヒエラルキーから削除してください。


StageDataSO スクリプタブル・オブジェクトを作成する


 Datas フォルダ内で右クリックをしてメニューを開き、Create => Create StageDataSO を選択します。
新しいスクリプタブル・オブジェクトが作成されますので、名前はそのままで問題ありません。

 インスペクターを確認し、StageDatasList 変数の Size を 0 から 1 に変更します。
これがステージの総数になります。現在は1ステージ分のデータだけ作成して登録します。

 Element 0 内のデータに PartDatasList 変数がありますので、こちらの Size を 0 から 2 に変更します。
こちらはパートの数になります。Element 0 を探索パートのデータ、Element 1 を侵入パートのデータとして登録します。



 SceneName 変数は、各パートのシーン名を登録します。
Element 0 には Serach、Element 1 には InvationAndEscape を設定してください。

 SkyboxMaterial 変数には、各パートで利用したい Skybox 用のマテリアルを登録します。
SkyboxChanger スクリプトを利用する場合には、こちらでの設定は不要ですので、アサインなしで問題ありません。

 StartPos 変数には、先ほどプレファブにしておいたスタート地点用のゲームオブジェクトを
Prefabs フォルダ内からドラッグアンドドロップしてアサインしてください。

 なお、ゴール地点も同じように作成しておくことで、こちらに登録できます。
現在はアサインなしで問題ありません。

 GameTime 変数は各パートのゲーム時間(秒数)になります。まずはデバッグ用に少ない値にしておいてください。



 参考データを掲載しておきます。デバッグしやすいように調整してありますので、この通りに作成する必要はありません。

インスペクター画像



 以上で作成完了です。


DataBaseManager スクリプトを修正する


 ステージのデータベースである StageDataSO スクリプタブル・オブジェクトをゲーム内で利用できるようにします。
また、ステージの番号を指定することでステージデータを取得できるメソッドも合わせて用意しておきます。


DataBaseManager.cs

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


 スクリプトを修正したらセーブします。


DataBaseManager ゲームオブジェクトの設定を行う


 新しくスクリプタブル・オブジェクト用の変数を追加しましたので、
Datas フォルダ内にある StageDataSO スクリプタブル・オブジェクトをドラッグアンドドロップしてアサインします。


インスペクター画像



 以上で設定は完了です。


GameSceneManager スクリプトを修正する


 Start メソッド内で設定している情報のうち、シーン開始時に1回だけ設定すればよい情報と、
シーン内の情報の切り替えを行うたびに設定し直す情報とに分けて、メソッド化します。

 また、UpdateAsObservable メソッド内で実行していたシーン遷移処理についても、
探索パートから侵入パートに移行する際にはシーン遷移ではなく、同一シーン内の情報の切り替えを行うようにし、
侵入パートからリザルトシーンへ移行する際のみシーン遷移よるように処理の内容を修正します。

 探索パートから侵入パートへの同一シーン内での設定の切り替えの際には
PrepareRestart メソッドと Restart メソッドを上手く利用し、処理を追加することで対応します。
これにより、ゲーム画面内ではフェードイン・フェードアウトの処理が実行されるため、
ユーザーにはシーンが切り替わっているように見せています。

 合わせて、前回の手順で作成したアイテムのセーブ機能も実装し、パート切り替えとシーン遷移の両方のタイミングで
所持しているアイテムの種類と所持数を自動的にセーブするようにしています。


GameSceneManager.cs

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


 スクリプトを修正したらセーブします。


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


 想定している挙動になるか、ゲームを実行して確認を行います。
デバッグ用に、探索パートのゲーム時間を短くしておくといいでしょう。


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



 以上でこの手順は完成です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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