Unityに関連する記事です

 以下の内容で実装を進めていきます。

発展7 ーマップデータ機能の実装ー
12.マップデータを作成する



 新しい学習内容は、以下の通りです。

 ・1つのシーンを異なる情報を使って運用する方法



12.マップデータを作成する

1.設計


 ゲームのシーンを作成する部分にもかかわってくる設計になるため、現在の Battle シーンの構成を考えていきます。

 Battle シーンでは MainMap ゲームオブジェクト内において、ゲームのマップの情報を管理しています。
ゲームの舞台になる情報ですので、この部分は変更が想定される情報になります。

 それ以外のゲームオブジェクト、つまり、カメラから始まり、GameData、DataBaseManager、EnemyGenerator といったゲームオブジェクトは
ゲームのシステム的な部分になりますので、MainMap ゲームオブジェクトの情報に関わらず、常に同じ機能を提供するための装置群です。

 Battle シーンというくくりで考えたとき、これらの大きな違いは提供する情報の内容です。
MainMap ゲームオブジェクトは Battle シーンごとに異なる情報でない常に同じゲームの舞台になっていまいます。
ですが、それ以外のゲームオブジェクトは、Battle シーンごとに異なる情報である必要はなく、常に同じ機能を提供する必要があります。

 そこで今回は、Battle シーンを複数作成するのではなく、1つの Battle シーンに対して MainMap の情報のみを変更し、それ以外の情報はそのまま利用する、という設計でゲームを運用します。
 
<1つの MainMap に対して、複数の Battle シーンを作る場合>
 ・Battle_1  MainMap(森)    
 ・Battle_2  MainMap(市街地)  それ以外のゲームオブジェクトは、Battle_1 と同じものを設定する(GameData、DataBaseManager、EnemyGenerator など)
 ・Battle_3  MainMap(海岸)   それ以外のゲームオブジェクトは、Battle_1 と同じものを設定する(GameData、DataBaseManager、EnemyGenerator など)
    :
    :

 このようにしてみるとわかりますが、MainMap ゲームオブジェクト以外の情報はそのまま利用できる状態であることがわかります。
こちらを踏まえた上で、Battle シーンを1つだけ作っていく方法を設計した場合は、次のようになります。

<複数の MainMap に対して、1つの Battle シーンで対応する場合>
 ・Battle  MainMap(森)    
 ・Battle  MainMap(市街地)
 ・Battle  MainMap(海岸)
    :
    :
Battle シーンが1つですので、当然、MainMap ゲームオブジェクト以外の情報は、常に同じものが適用されます。

 つまり、このような設計でシーンを管理した方が合理的であることがわかります。
効率の面においても、たくさんのステージを作りたい場合、Battle シーンを増やすのではなくて、MainMap だけを増やしていくことで対応が可能になります。


2.MapInfo スクリプトを作成する


 MainMap ゲームオブジェクトにアタッチして、マップの情報を管理するためのスクリプトを作成します。


MapInfo.cs

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


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


3.MainMap ゲームオブジェクトの構成を確認・修正する


 まず最初に、DefenceBase ゲームオブジェクトが MainMap ゲームオブジェクトの子オブジェクトになっていない場合、子オブジェクトにしてください



 次に、DefenseBase ゲームオブジェクトをプレファブにします
次の手順が終わってからヒエラルキーから削除するので、まだ削除はしないでください

 Prefabs フォルダ内の DefenseBase ゲームオブジェクトを選択して、インスペクターの一番上から OpenPrefab を選択します。
Transform のうちの、Position の情報をすべて 0 に設定してください。他はそのままで問題ありません。



 最後に、MainMap ゲームオブジェクト内に Create Empty で新しいゲームオブジェクトを作成します。
MainMap ゲームオブジェクトの子オブジェクトになっていることを確認してください。
名前を DefenseBaseTran に変更します。この位置に、プレファブにした DefenseBase ゲームオブジェクトを生成するようにします。

 そのため、DefenseBaseTran ゲームオブジェクトの位置をヒエラルキーにある DefenseBase ゲームオブジェクトの位置に合わせてください



完成時のヒエラルキー画像



 以上で設定は完了です。


4.MainMap ゲームオブジェクトに MapInfo スクリプトをアタッチし、設定を行う


 ヒエラルキーにある MainMap ゲームオブジェクトに MainMap スクリプトをドラッグアンドドロップしてアタッチします。
インスペクターを確認して、各情報をアサインします。

 tilemaps 変数には MainMap ゲームオブジェクト内の Walk 側の Tilemap をアサインします。

 grid 変数には MainMap ゲームオブジェクト内の Base 側の Grid をアサインします。

 defenceBaseTran 変数には、先ほどの手順で作成した MainMap ゲームオブジェクト内の defenceBaseTran ゲームオブジェクトをアサインします。

 まずはここまでを設定してください。



 最後に appearEnemyInfos 配列変数の設定を行います。これは、複数の出現するエネミーの情報をまとめて管理するための配列です。

 配列の長さである Size は最初は 0 になっています。
ここに、このマップで出現させたいエネミーの数を登録します。今回は 3 体出現させたいので、Size を 3 に設定しています。

 Size を設定すると新しく Element の表示が追加されます。これが配列の内容(要素)になります。
Element は 0 からはじまり、この項目内に、エネミーの1体分の出現時のデータを登録することが出来ます。

 スクリプト内にも補足説明がありますが、ここでも設定する内容について記載します。

 enemyNo 変数ですが、こちらは EnemyDataSO スクリプタブル・オブジェクトに登録してある EnemyData の enemyNo 変数と照合するための値を設定します。
この値を 0 に設定すれば、EnemyData の中の enemyNo 変数が 0 の EnemyData を参照して利用します。この情報は、enemyInfo 変数を利用しない場合に適用されます。
また -1 を設定することで生成されるエネミーをランダムに変更します。

 isRaodomPos 変数は、エネミーの出現地点をランダムにするか、固定の場所にするかを設定します。
スイッチにチェックをいれて true の状態にすることにより、appearEnemyInfos 配列変数内に登録されている enemyPathData 変数の中から1つをランダムで選択し、そのスタート位置で生成されます。
スイッチにチェックがなければ、次に設定する enemyPathData 変数のスタート位置で生成されます。

 enemyPathData 変数は、エネミーの移動経路の情報です。プレファブになっている、任意の経路用の PathTranSet ゲームオブジェクトをドラッグアンドドロップしてアサインします。
エネミーごとに異なる経路を登録できます。


インスペクター画像



 以上で設定は完了です。


5.MainMap ゲームオブジェクトをプレファブにする


 ヒエラルキーにある MainMap ゲームオブジェクトをプレファブにします。
プレファブ後、ヒエラルキーにある MainMap ゲームオブジェクトは次の手順で使いますので、まだ削除しないでください。


6.ヒエラルキーにある MainMap ゲームオブジェクトのプレファブを解除して、別のマップを作る


 タイルマップを使って、新しいゲーム画面を作成していきます。
タイルマップの構成は、MainMap ゲームオブジェクトがベースになりますので、これを流用して作成していきます。

 ヒエラルキーにある、先ほどプレファブにした MainMap ゲームオブジェクトのプレファブを解除します。
MainMap ゲームオブジェクトを選択した状態で右クリックをしてメニューを開き、Prefab => Unpack Completely を選択してください。
プレファブではなく、通常のゲームオブジェクトに戻ります。この時点で、先ほどプレファブにした MainMap ゲームオブジェクトとは紐づけがなくなりますので、
ヒエラルキーにある MainMap ゲームオブジェクトは自由に変更して問題ない状態になりました。

 タイルマップを一度削除し、その後、新しいタイルマップを配置してください。
自由に作成していただいて構いません。また、防衛拠点用の DefenseBaseTran ゲームオブジェクトも、防衛拠点を配置したい位置に変更してください。


7.新しいマップ用の敵の移動経路を作成する


 次に、敵の移動経路の情報などを作成します。すでにプレファブにある PathTranSet ゲームオブジェクトを利用してもいいですし、
新しく作成してプレファブにしていただいても構いません。プレファブにしたら、新しく作った PathTranSet ゲームオブジェクトは削除してください。


8.MainMap ゲームオブジェクトの MapInfo スクリプトの設定を行う


 AppearEnemyInfos 配列変数の設定を行います。Tilemaps 変数などはすでに情報がアサインされていますので変更不要です。

 各配列の要素(Element)内の EnemyPathData 変数に、移動経路として利用した PathTranSet ゲームオブジェクトのプレファブをアサインして登録します。
出現する敵の情報である EnemyNo 変数も一緒に登録してください。これを出現させたい敵の数だけ登録します。


9.新しく作成したマップをプレファブにする


 マップが完成したら、名前を MainMap_1 のように変更し、先ほどプレファブにしたゲームオブジェクトと区別できるようにします。
その後、今回作成した MainMap_1 ゲームオブジェクトをプレファブにします。

 上記の6〜8の手順を繰り返すことで、複数のマップを作成することができますので、まずは3つ、マップを作成してください。



 以上でこの手順は終了です。

 次は 発展8 ーステージデータの作成と運用準備− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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