Unityに関連する記事です

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

発展20 ーバレット用のデータベース作成ー
41.BulletDataSO スクリプトを作成する
42.BulletDataSO スクリプトを利用して BulletDataSO スクリプタブル・オブジェクトを作成し、バレットのデータを登録する



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

 ・クラス内に入れ子として enum を宣言して利用する方法



41.BulletDataSO スクリプトを作成する

1.設計


 ゲームで発射するバレットですが、選択用のボタンがあるように、複数のバレットの情報を用意して扱うことになります。
そのため、エネミーと同じようにバレットのデータもスクリプタブル・オブジェクトを作成・データベース化し、それをマスターデータとして管理するようにします。

 今回作成するスクリプタブル・オブジェクトはバレットのデータを管理する目的で作成を行います。
そのため、スクリプト内には、バレットのデータをまとめるための BulletData クラスを用意します

 BulletData クラスは、バレット1つ分のデータを1つにまとめている情報群です。
現在は Bullet クラスに変数を用意して、バレットの速度や攻撃力といった値を個別に用意していますが、これを1つのデータ群としてまとめて管理するためのクラスになります。

 この BulletData クラスは、ゲームに登場するバレットの数だけ用意することになりますので、それを管理するために List 機能を利用します。

 この2つの情報を管理して完成するのがバレット用のスクリプタブル・オブジェクトになります。

 最初にスクリプタブル・オブジェクトを作成するためのスクリプトを作成し、スクリプタブル・オブジェクト用のスクリプトを作成します。


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


 スクリプタブル・オブジェクトを作成するために必要な BulletDataSO スクリプトを作成します。
スクリプタブル・オブジェクト専用の ScriptableObject クラスを継承し、[CreateAssetMenu] 属性を記述することで作成可能になります。
 
 今回指定して管理したいデータはバレットのデータです。それに関連する enum も入れ子として作成し、同じスクリプトで管理を行います。
そのため、スクリプタブル・オブジェクト内に必要な情報は以下の3つです。

 1.バレット1つ単位でのデータ(バレットの攻撃力、発射速度、発射可能時間、画像などのデータ群)を扱う BulletData クラス
 2.バレットのデータをまとめる BulletData 用の List(リスト)
 3.BulletData クラス内で利用するenum (BulletType 型と LiberalType 型)

 以上の情報を元に、BulletDataSO スクリプトを記述します。


BulletDataSO.cs

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


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


3.BulletDataSO スクリプトの構造について


 処理の内容について、順番に確認していきます。

 1.バレット1つ単位でのデータ(バレットの攻撃力、発射速度、発射可能時間、画像などのデータ群)を扱う BulletData クラス
 2.バレットのデータをまとめる BulletData 用の List(リスト)
 3.BulletData クラス内で利用するenum (BulletType 型と LiberalType 型)


1.バレット1つ単位でのデータ(バレットの攻撃力、発射速度、発射可能時間、画像などのデータ群)を扱う BulletData クラス

 Bullet スクリプトにて管理していたバレットの攻撃力や速度を個別の変数ではなく、
1つのデータ単位として管理できるように、 BulletData クラスとして作成して、こちらにて管理を行うようにします。
利点は、1つの BulletData クラス内には1体分のエネミーの全データが登録できることです。

そのため、攻撃力用、速度用というように変数を個別に作る必要はなく、BulletData の 攻撃力、BulletData の速度という形で BulletData を参照して利用できる部分です。
例えば、BulletData.bulletPowerと記述すれば、それはその BulletData クラスに登録されている攻撃力の値を参照することになります。

 ピリオドによる参照処理が増えていきますので、しっかりと処理を読み解いていきましょう

    /// <summary>
    /// バレット用のデータ
    /// </summary>
    [Serializable]
    public class BulletData {
        public int no;            // バレットの通し番号
        public float bulletSpeed;      // 速度
        public int bulletPower;       // 攻撃力
        public float loadingTime;      // 発射までの待機時間
        public BulletType bulletType;    // バレットの種類
        public Sprite btnSprite;       // バレット選択用のボタンの画像
        public LiberalType liberalType;   // バレットの利用者の種類
        public int openExp;         // バレットを使用するために必要な Exp
        public float launchTime;       // バレットを使用できる時間
        public Sprite bulletSprite;     // 発射するバレットの画像
        public string discription;      // バレットの説明文
    }

 このようにバレット1つ分に必要になるデータをクラスとしてまとめておくことで管理と利用が容易になります
また、バレットの情報を増やしたい(属性など)場合には、この BulletData クラス内に 型と変数を追記すれば、好きなだけ増やすことも出来ます。
この教材でも順番に BulletData クラスに追記していきますので、それを確認するとわかりやすいでしょう。


2.バレットのデータをまとめる BulletData 用の List(リスト)

 BulletData クラスにはバレットの情報をまとめて登録できるようにしました。
このデータはバレット1つ分ですので、もしも複数のバレットのデータを用意して登録したい場合、
この BulletData クラスを複数用意して、それを管理するための変数が必要になります。

 エネミーの場合と同じように、今回も BulletData 型の List を用意して管理を行います。



 public 修飾子にて List を宣言することで、インスペクター上でサイズの変更が可能です
例えばバレットのデータを3つ分作って登録したい場合には、インスペクターで List のサイズを 3 に設定すれば
EnemyData クラスが 3 つ、Element 0 〜 Element 2 として作成されますので、ここにバレットのデータを1つずつ、合計3つ分登録することが出来ます。

<BulletData クラスを扱う List>
    public List<BulletData> bulletDataList = new List<BulletData>();


3.BulletData クラス内で利用するenum (BulletType 型と LiberalType 型)

 BulletDataSO クラスの宣言フィールドにおいて、enum を作成しています。今回は BulletType 型と LiberalType 型の2つです。
このようにC#では、1つの独立したクラス(ファイル)としてではなく、あるクラスの中に enum を作成しても使用することができます。
このような構造もクラスと同じで入れ子(ネスト)と言います。

 特定のクラスでのみ使用することが確定しているような、使用範囲の狭い enum や、特定のクラスに紐づいて利用することが前提の enum であれば、
このように入れ子にした方がスクリプト・ファイルが増えずに済みます。
 また設計上、ファイルにはしたくない(隠しておきたい) enumを作成する場合にも用いられます。

 使用方法は他の enum と同じです。参照する場合は、BulletDataSO.BulletType.Player_Normal という書式で、入れ子クラスのあるクラスの後に、入れ子の enum の型を順番に記述します。


42.BulletDataSO スクリプトを利用して BulletDataSO スクリプタブル・オブジェクトを作成し、バレットのデータを登録する

1.設計


 BulletDataSO スクリプトを元に BulletDataSO スクリプタブル・オブジェクトを作成します。
BulletDataSO スクリプトに用意してある BulletData 型の List である bulletDataList 変数がデータベースの役割を持っています。


2.<クラスのリスト化によるデータベース作成>


 BulletData クラスは1つのデータ情報を扱うことが出来ます。今回であればバレット1つ分の情報です。
そのため複数のエネミーの情報を扱う必要がある今回のような場合には、その分だけ BulletData クラスを追加して作成しなければなりません

 それらを管理するために BulletData の List を作り、まとめて管理を出来るようにしています。
ここで大切なことは、1つ1つの別の変数に個別に BulletData が存在していたのではまとめて管理していることにはなりません
BulletData のリストとはすなわち、BulletData をまとめて扱っているデータの集合体になりますので、ここにデータベースとして役割を成立させることが出来ます


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


 Unity の左上のメニューより、Assets => Create => Create BulletDataSO を選択します。
新しく BulletDataSO というファイルが作成されます。名前はそのままで構いません。

 このアイコンの形が違うファイルがスクリプタブル・オブジェクトになります。
これはアセットとして取り扱われるようになる情報です。

 BulletDataSO スクリプタブル・オブジェクトを Datas フォルダへ移動してください。



4.BulletDataSO スクリプタブル・オブジェクトの設定を行う


 作成された BulletDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
BulletDataSO スクリプトにて宣言した BulletDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
これがスクリプタブル・オブジェクトの中身です。

 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する BulletData クラスの情報群になります。
例えば Size を 7 に指定すると下記の画像のように、バレットの情報を登録するための情報が追加されます。


インスペクター画像




 まずはプレイヤーのバレットのデータを1つだけ登録しておきたいと思います。
BulletDataList 変数の Size を 1 に変更してください。Element 0 が下に作成されます。

 Element とは List の要素(中身)のことです。
そのため、Element 1つが BulletData 1つになります。Element の番号は 0 から始まります。

 以上のことから、1つの Element には1つの BulletData クラスの内容を設定できるようになっています。
このとき、BulletData クラスの上に [Serializable] 属性を宣言しているので、BulletData クラスの内容がインスペクターに表示されています。
[Serializable] 属性を活用することによって、インスペクターからバレット用の情報を1つずつ、BulletData 単位で登録出来るようになっています。



 各数値や画像は任意です。下記の画像を参考にして、バレット情報の設定を行ってみてください。
どの変数にどのような情報が適用されるのかを考えながら設定しましょう。

 バレットの画像については、バレット選択ボタンと整合性のある画像を設定してください。
この例では、トカゲ型のクリーチャーの画像をバレット選択ボタンの画像とし。発射されるバレットの画像はクリーチャーの爪の画像に設定しています。


インスペクター画像(ElementType は後々実装しますので、今はない情報です)



バレット選択ボタンの画像(参考)



バレットの画像(参考)



 各数値や画像は任意ですが、No の値だけは異なる番号で設定してください。できれば 0 から連番が理想です。
この番号はバレット用の個体番号として利用する可能性がありますので、同じ番号を重複して設定してしまうと、同じ番号の個体が複数存在することになり、
番号によってバレット用を特定することが出来なくなります。


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

 次は 発展21 ーバレット用のデータベースの利用  です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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