Unityに関連する記事です

 ベルトスクロールアクションの特徴が、エリアによる移動と、移動範囲の制限です。
色々な方法があると思いますが、今回は、エリアの情報をデータベース化し、その情報を元に移動できる範囲を制限する方法で実装をしていきます。



設計


 データベースにはUnityの機能であるスクリプタブル・オブジェクトを利用します。
ここにステージとエリアの情報(何番目のエリア、このエリアの移動範囲、このエリアに出現する敵の種類、など)をデータとして登録し、データベース化します。

 このスクリプタブル・オブジェクトとステージの情報を管理するGameManagerクラスを作り、GameManagerが現在のエリアの情報を管理して、データベースと連動を行います。
ステージ2、エリア3という情報を管理し、その情報を元にスクリプタブル・オブジェクトのデータベースを参照してゲーム内に反映させていきます。

 これらをロジック化し、自動で動作するようにしていきます。


実装の手順


 1.スクリプタブル・オブジェクト用のStageListクラスを作成する
 2.スクリプタブル・オブジェクトを作成する
 3.スクリプタブル・オブジェクトにデータを登録して、データベースを作成する
 4.ゲームの管理を行うGameManagerクラスを作成する
 5.ゲームを実行して動作を確認する
 6.PlayerControllerクラスを修正し、エリアに合わせて移動できる範囲を自動的に制限する


新しく学習する内容


 ・スクリプタブル・オブジェクトの作成方法と使い方
 ・[CreateAssetMenu()]属性


1.スクリプタブル・オブジェクト用のStageListクラスを作成する


 スクリプタブル・オブジェクト用のクラスである、StageListクラスを作成します。

スクリプタブル・オブジェクト用のクラスはMonoBehaviourを継承せずに、ScriptableObjectクラスを継承します。

 またデータベースの側面から、複数のクラスを入れ子クラスとして管理します。
構造のイメージは次のような形です。

StageList ---- StageDatas(List)
                   | 
                  | -----  StageData[0]  ----  AreaDatas(List)
                    |                             | ----  AreaData[0]
                    |                             | ----  AreaData[1]
                    |
                    | -----  StageData[1]  ----  AreaData(List)
                    |                             |----  AreaData[0]
                    |                             |----  AreaData[1]

StageList.cs



<[CreateAssetMenu()]属性>


 スクリプタブル・オブジェクトを継承しているクラスに宣言して付与できる属性の1つです。
この機能を使うことでエディターの拡張する必要なく、Unityのメニューからスクリプタブル・オブジェクトを作成できます。

 引数は任意です。(なしでも問題ありません) オーバーライドすることで、自由に書き換えることが可能です。
第1引数では、アセット生成時に指定したファイル名をデフォルト名として表示させることができます。
第2引数では、アセット生成時のメニューに表示するメニュー名を登録することが出来ます。

今回は指定していませんが、第3引数まで設定できます。

 [CreateAssetMenu(fileName = "StageList", menuName = "Create StageList")]
Unity公式ドキュメンテーション
CreateAssetMenuAttribute
https://docs.unity3d.com/ja/current/ScriptReferenc...


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


 作成したStageListクラスの情報を持つスクリプタブル・オブジェクトを作成します。

 Unityの左上のメニューから Assets => Create => Create StageList と選択します。(この機能を使うために、先ほどの[CreateAssetMenu()]属性の宣言が必要です)


動画 スクリプタブル・オブジェクトの作成手順
https://gyazo.com/3ff19b0fc2cf679362849022127f2e28

 Project内に StageList アセットが新しく作成されます。アイコンが他と違うものです。これがスクリプタブル・オブジェクトになります。
名前は自由に変更できますが、StageList にしておいた方がわかりやすいでしょう。


スクリプタブル・オブジェクト

 

3.スクリプタブル・オブジェクトにデータを登録して、データベースを作成する


 StageListスクリプタブル・オブジェクトを選択してください。インスペクターに Size 0 と表示されていると思いますので、こちらを 1 にしてください。
この Size が、ゲームに登場するステージ数になります。現在はステージ 1 を作成する予定なので、ここを 1 に設定しています。

StageList インスペクター画像



 ずいぶんたくさんの項目があるように見えますが、【1】の手順で作成した入れ子クラスの情報が順番に表示されていると思います。
ここにエリアの番号、エリアごとの移動の範囲、エリアごとに出現する敵をデータとして登録します。

 これは必要な数だけ増やせますので、エリア数を 4 に設定すれば、4つ分のデータを登録出来るようになります。

 各項目ごとに見ていきます。

StageDatas/Size ステージ数の設定です。この子Elementがステージです。


ステージを 3 つ用意した場合 Element 0 - 2



StageDatas/Element x/AreaDatas エリア数の設定です。この子Elementがエリアです。


エリアを 3 つ用意した場合 Element 0 -2



StageDatas/Element x/AreaDatas/Element x 各エリアの詳細を登録します。エリアの番号、エリアの移動制限、敵の種類



 まずは動作確認のために、ステージ 1 の分を登録します。


4.ゲームの管理を行うGameManagerクラスを作成する


 ゲームの管理を行うGameManagerクラスを作成します。このクラスで現在のエリアの情報などを管理させます。


GameManager.cs



GameManagerゲームオブジェクトを作成し、GameManagerクラスをアタッチする


 ヒエラルキー上で右クリックしてメニューを表示し、CreateEmpty を選択します。名前をGameManagerに変更します。

 GameManagerゲームオブジェクトに先ほど作成したGameManagerクラスをドラッグアンドドロップしてアタッチします。
GameManagerゲームオブジェクトを選択してインスペクターを表示し、アサイン情報を確認します。
 

GameManagerゲームオブジェクトのインスペクター画像


 StageList変数には、StageListスクリプタブル・オブジェクトをドラッグアンドドロップしてアサインします。
これで登録したデータベースをゲーム内に参照出来るようになります。

 PlayerController変数には、PlayerControllerをアタッチしているゲームオブジェクトをヒエラルキーからドラッグアンドドロップしてアサインします。

 他の項目はゲームの実行と同時にアサインされる項目になります。またエリアを移動する際に、動的に変更される項目でもあります。


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


 スクリプタブル・オブジェクトに、移動範囲を登録してください。
ゲームの実行と同時に、GameManagerのLeftLimitPos〜BackLimitPosまでの4つの値に、自動的にこの値が入れば成功です。


スクリプタブル・オブジェクトのMoveLimit



検証動画◆StagaListからデータが反映されているか確認(LeftLimitPos〜BackLimitPosまでの4つの値が入る)
https://gyazo.com/74ed2ca8347f57ef9f6648dd162e5bd7
 

検証動画◆StagaListからデータが反映されているか確認(MoveLimitの値が入る)
https://gyazo.com/d56eeb034b10662015ad17794a9b9e75


 無事に値が入ったら、最後に、PlayerControllerクラスを修正し、移動の制限範囲にこのエリアの値を反映出来るようにします。


6.PlayerControllerクラスを修正し、エリアに合わせて移動できる範囲を自動的に制限する


 StageListスクリプタブル・オブジェクトにはエリアの情報としてキャラの移動範囲の情報があります。
この情報を使うようにすれば、ゲームの進行に合わせてキャラの移動範囲を自動的に制限することが可能です。

 スクリプタブル・オブジェクトでは配列やListへの参照が含まれているため、Elementの値を参考にして値の登録を行います。
例えば、ステージ1の場合、Elementの番号としては 0 の部分を参照することになります。注意してください。

 PlayerControllerクラスを修正し、宣言フィールドからデバッグで利用していたMoveLimit変数を削除してください。
代わりに、GameManagerのアサインを追加してください。

 またFixedUpdateメソッドを修正し、実際にデータベースの持つエリアの情報を反映して制御が行われるようにします。


PlayerController.cs




 修正が終了したら、GameManagerをアサインし、実際にキャラを移動させてみましょう。制限範囲内しか移動できなければ問題ありません。

 

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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