Unityに関連する記事です

 複数回に分けて、アイテムの管理方法について実装を行います。

 ベースとしましては、かめくめ様のこちらの記事を参考にさせていただいております。
ありがとうございます<(_ _)>

Unityを使った3Dゲームの作り方(かめくめ)
Unityでキーやゲームパッドで操作するステータス画面の作成
https://gametukurikata.com/ui/statuswindow

 上記の実装を行った上で、こちらの処理を追加で実装を行います。

手順17 −アイテム用のデータベースの作成−
29.アイテム用のデータベースとして利用するスクリプタブル・オブジェクトを作成する準備を行う −ItemType スクリプト、ItemName スクリプト、ItemDataSO スクリプトを作成するー
30.ItemDataSO スクリプタブル・オブジェクトを作成する


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

 ・enum だけのスクリプト・ファイルの作成
 ・クラス内に別のクラスを作成する(入れ子クラス)



 今回の実装の目的は、「所持しているアイテムの数の情報」に合わせて「所持数が1つ以上あるアイテムを、アイテムインベントリー内にアイテムの情報を持つボタンとして生成」することです。
いままでの実装では「所持しているか、否か」でのみアイテムの情報を持つボタンを生成していましたので、この生成するための条件部分がまず変更となります。

 またアイテムの情報についてはスクリプト内で情報の登録を行っていましたが、このアイテムの情報について、スクリプタブル・オブジェクトを作成してデータを登録し、その情報を活用するように変更を行います。

 ここまでの変更処理を、3つの手順に沿って実装を行います。そのため、まずは全体の流れを把握し、それを順番に作成していきます。

〇1.アイテムインベントリーに表示するアイテム1つ1つの情報を ItemData クラスとして作成し、それを ItemDataSO スクリプタブル・オブジェクトを作成して管理を行うための準備をする
 2.アイテムインベントリー内に表示する個別のアイテムのボタン、およびデータ情報を表示するための ItemButtonDetail ゲームオブジェクトと、それらの情報を制御するための ItemButtonDetail スクリプトを作成する
 3.GameData スクリプトと DataBaseManager スクリプトを修正して、ItemDataSO スクリプタブル・オブジェクトに登録したアイテムの情報を運用する処理を実装する
 4.アイテムインベントリー内に表示する ItemButtonDetail ゲームオブジェクトを所持している数に合わせて生成を行う ItemButtonManager スクリプトを作成する

 今回の手順では、〇1を実装します。

 なお、上記の手順をすべて実装することによりアイテムの管理方法が変更されます
それにより「所持しているアイテムの増減処理」や「所持しているアイテムの数と名前をセーブ・ロードする処理」などを実装することが出来ます。

 ただし、これらの処理は簡単な内容ではありません。そのため、挑戦してみて処理が難しくて理解が及ばない場合には、無理はせず一度実装を止めるようにしてください。
しっかりと学習をして、知識やスキルを身につけてから、再度挑戦してみることをお勧めします。特に〇3と〇4が難しいです。



29.アイテム用のデータベースとして利用するスクリプタブル・オブジェクトを作成する準備を行う −ItemType スクリプト、ItemName スクリプト、ItemDataSO スクリプトを作成するー

1.設計


 ゲームには多くのアイテムが登場します。そのため、それらアイテムの情報をたくさん用意して、それを扱うことになります。
イベントと同じようにアイテムのデータもスクリプタブル・オブジェクトを作成・データベース化し、それをマスターデータとして管理するようにします。

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

 ItemData クラスは、アイテム1つ分のデータを1つにまとめている情報群です。
現在はアイテムの名前の値を個別に用意していますが、これを1つのデータ群としてまとめて管理するためのクラスになります。

 この ItemData クラスは、ゲームに登場するアイテムの数だけ用意することになりますので、それらをまとめて管理するために List 機能を利用します。

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

 まずは最初にスクリプタブル・オブジェクトを作成するために必要なアイテムのタイプを登録する ItemType と ItemName を enum にて作成してから、
スクリプタブル・オブジェクト用のスクリプトを作成します。


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


 enum (イーナム) を利用して、アイテムの種類を事前に登録し、この情報をアイテムの持つ情報として ItemData クラス内に設定できるようにします。
enum のみでスクリプトを作成する場合、using の宣言や、MonoBehaviour(モノビヘイビア) クラスの継承は不要です
そしてどのスクリプトからでも変数の代入なしで利用可能になります。

 enum ではゲーム内に登場させたい種類の情報を、列挙子(れっきょし)という形で種類を作成できます。
今回は、アイテムの種類、という情報を ItemType という名前で作成し、その中にアイテムの種類を登録しておきます。
これは追加可能な情報ですので、先々にアイテムの種類が増えても対応できます。

ItemType.cs

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


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


3.ItemName スクリプトを作成する


 こちらも ItemType スクリプトと同じように、enum のみでスクリプトを作成します。

 こちらにはゲーム内に登場させるアイテムの名前を登録します。登録する際の順番や種類は関係ありません。
なおこれは一例ですので、自分の好きなアイテムの名前を登録していただいて構いません。


ItemName.cs

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


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


4.ItemDataSO スクリプトを作成する


 スクリプタブル・オブジェクトを作成するために必要な ItemDataSO スクリプトを作成します。
スクリプタブル・オブジェクト専用の ScriptableObject クラスを継承し、[CreateAssetMenu] 属性を記述することで作成可能になります。
 
 スクリプタブル・オブジェクトでは、指定したデータを複数のデータとしてまとめて管理することが出来ます。
そのため、データベースとしての役割を果たすことが可能になっています。

 今回指定して管理したいデータはアイテムのデータです。
そのため、スクリプタブル・オブジェクト内に必要な情報は以下の2つです。

 1.アイテム1つ単位でのデータ(アイテムの種類、名前、画像などデータ群)を扱うクラス
 2.アイテムのデータをまとめる List(リスト)

 まずは最初にスクリプトを記述してから、内容を確認しましょう。

ItemDataSO.cs

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


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


5.ItemDataSO スクリプトの構造について


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

 1.アイテム1つ単位でのデータ(アイテムの種類、名前、画像などデータ群)
 2.アイテムのデータをまとめる List(リスト)


1.アイテム1つ単位でのデータ(アイテムの種類、名前、画像などデータ群)

 アイテムの種類や名前などを個別の変数でバラバラにではなく、1つのデータ単位として管理できるように、 ItemData クラスとして作成して管理を行うようにします。
利点は、1つの ItemData クラス内には1つ分のアイテムの全データが登録できることです。

 そのためスクリプト内に アイテムの名前用、アイテムの種類用というように変数を個別に作る必要はなく、
ItemData の アイテムの種類、ItemData のアイテムの名前という形で ItemData を参照して利用できる部分です。
例えば、ItemData.itemName と記述すれば、それはその ItemData クラスに登録されている itemName の値を参照することになります。

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

    [Serializable]
    public class ItemData {
        public int itemNo;             // アイテムの通し番号
        public Sprite itemSprite;      // アイテムの Image 画像
        public ItemName itemName;      // アイテムの名前
        public ItemType itemType;      // アイテムの種類
        public string itemInfo;        // アイテムの情報

        // TODO 必要な情報を追加する

    }

 このようにアイテム1つ分に必要になるデータをクラスとしてまとめておくことで管理と利用が容易になります
また、アイテムの情報を増やしたい(獲得できる Exp や属性など)場合には、この ItemData クラス内に 型と変数を追記すれば、好きなだけ増やすことも出来ます。


2.アイテムのデータをまとめる List(リスト)

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

 こういった1つの同じデータ群をまとまったものをコレクションといいます。
C# にはコレクションを管理する方法として、Dictinary(ディクショナリー)List(リスト) があります。
今回もイベントのときと同じように List を利用して管理を行います。



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

<ItemData クラスを扱う List>
    public List<ItemData> itemDataList = new List<ItemData>();


6.<クラス内に別のクラスを作成する(入れ子クラス)>


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

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

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


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

1.設計


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


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


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

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


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


 最初に、スクリプタブル・オブジェクトを管理するためのフォルダを作成しておきます。
Project 内で右クリックをしてメニューを開き、Datas フォルダを作成してください。
この中に作成されたスクリプタブル・オブジェクトを入れて管理します。



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

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

 ItemDataSO スクリプタブル・オブジェクトを Datas フォルダへ移動してください。
今後もスクリプタブル・オブジェクトを作成したら、Datas フォルダ内で管理するようにします。


<フォルダ管理> 



 続いて、スクリプタブル・オブジェクトにアイテムのデータを登録していきます。


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


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

 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する ItemData クラスの情報群になります。


インスペクター画像



 まずはアイテムのデータを7つ分登録しておきたいと思います。
itemDataList 変数の Size を 7 に変更してください。Element 0 〜 6 が下に作成されます。

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

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



 自由に設定を行ってみてください。
画像は Textures フォルダにあるエネミー用の画像ファイルをドラッグアンドドロップしてアサインしてください。
もしも画像がない場合には、以前にダウンロードしてあるアイテム用の画像をいくつか選択して、新しくインポートして利用してください。
現在はまだ用意できていなくても構いません。


インスペクター画像



インスペクター画像



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


5.<入れ子クラスを外部のクラスで宣言する方法>


 ItemDataSO スクリプト内に入れ子クラスとして作成している ItemData クラスを外部のクラスで用いる場合には、入れ子の親クラスを記述した上で宣言するようになります。

 下記のように書きます。

  ItemDataSO.ItemData itemData;

  itemDataSO.itemDataList[index].itemName;

 これは次の手順から利用します。



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

 次は 手順18 −アイテムの管理方法の準備− です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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