Unityに関連する記事です

 引き続き、探索イベントの実装を行っていきます。
この手順では、Debug.Log メソッドを活用して作成した処理に探索イベントの実装を行います。

 Console ビューに表示していた部分に会話ウインドウを表示・非表示する処理を実装し、
メッセージの内容として、獲得したアイテムの名前と数を表示するように制御します。

 合わせて、一度獲得した宝箱からは再度アイテムを入手できないように制御も行います。


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


手順25 ー探索イベントの実装ー
44.EventData スクリプトを修正し、EventDataSO スクリプタブル・オブジェクトに探索イベント用のデータを登録する
45.DialogController スクリプトと TreasureBox スクリプトを修正して、アイテムの獲得を行う処理と重複して獲得できないようにする処理を実装する



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

 ・事前に実装してある処理を活用して処理を組み立てる



44.EventData スクリプトを修正し、EventDataSO スクリプタブル・オブジェクトに探索イベント用のデータを登録する

1.設計

 
 会話用のデータと同じように、探索用のデータも EventDataSO スクリプタブル・オブジェクトにデータとして登録を行います。
現在の EventData にはアイテムを情報として登録できる変数はありませんので、そちらの情報を追加してからデータの登録を行うようにします。

 登録するべき情報を考えつつ、処理を読んでいってください。


2.EventData スクリプトを修正する


 新しい変数を2つ宣言し、アイテムの名前と、アイテムの数を登録できる状態にします。


EventData.cs

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


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


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


 Datas フォルダにある EventDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
Size の値を変更して、探索用のデータを追加出来るようにします。

 探索用のイベントのデータを2つ分登録しておきたいと思いますので、現在の Size にプラス 2 にした値を設定してください。
新しい Element(要素)が2つ追加されますので、こちらに探索イベント用のデータを登録します。
以前の会話イベント用のデータは消さずに、追加していくようにしてください。

 下記の画像のように設定を行ってみてください。
EventSprite 変数には画像を登録できますが、今はまだ活用していませんので None のままで構いません。
また Dialog の設定もなしで構いません。獲得したアイテムの名前と数をメッセージとして表示するように制御をします。

 Element 0 〜 2 は会話イベントのデータ、Element 3,4 が探索用のデータです。

インスペクター画像



 各数値や画像は任意ですが、No の値だけは、各イベントの種類ごとに異なる番号で設定してください。できれば 0 から連番が理想です。
この番号はイベント用の個体番号として利用する可能性がありますので、同じ番号を重複して設定してしまうと、同じ番号の個体が複数存在することになり、
通し番号によってイベントを特定することが出来なくなります。例えば、Talk の種類の 0 と、Search の種類の 0 を混同させることは可能です。
ですが、 Talk の種類に 0 を2つ以上登録することはやめてください。


4.TreasureBox ゲームオブジェクトの設定を行い、動作を確認する


 ヒエラルキーにある TreasureBox ゲームオブジェクトの TreasureBox スクリプトをインスペクターより確認します。

 TreasureBox スクリプトにある treasureEventNo 変数が、この宝箱の探索イベントを特定する情報になります。

 現在 EventDataSO スクリプタブル・オブジェクト内に Search のタイプで登録してあるデータは2種類あります。
まずは、Search の情報だけを検索し、その後、この treasureEventNo 変数の値と no 変数の値を Search のタイプの中で照合します。
両方の情報に合致したデータ、それが今回利用するデータの情報になります。

 試しに、treasureEventNo 変数の値を 0 に設定して、ゲームを実行してください。
TreasureBox スクリプトの Start メソッドが実行されて、上記のデータベースの照合作業が行われて、
TreasureBox スクリプトの EventData に照合した情報が代入されます。

 この treasureEventNo 変数の値を別の値にして、取得できるデータが変わるか、自分で試してみてください。


ゲーム実行前のインスペクター画像



ゲーム実行時のインスペクター画像



ゲーム実行時のインスペクター画像



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

 続いて、TreasureBox スクリプトに登録された EventData の情報をゲーム画面に表示し、登録されているアイテムの情報を利用して、アイテムの獲得処理を実装します。


 

45.DialogController スクリプトと TreasureBox スクリプトを修正して、アイテムの獲得を行う処理と重複して獲得できないようにする処理を実装する

1.設計


 以前の手順で、GameData クラス内に、アイテムの獲得用のメソッドを用意しました。
前回はデバッグのみでしたが、こちらの処理を実際にゲーム内で利用していきます。

<GameData.cs>
    /// <summary>
    /// ItemInvetryData を追加・加算
    /// </summary>
    /// <param name="itemName"></param>
    /// <param name="amount"></param>
    public void AddItemInventryData(ItemName itemName, int amount = 1) {

        // すでに所持しているアイテムか確認
        foreach (ItemInventryData itemInventryData in itemInventryDatasList) {

            // 所持しているアイテムの場合
            if (itemInventryData.itemName == itemName) {

                // 所持数を加算
                itemInventryData.count += amount;

                Debug.Log("リストに対象アイテムを加算 : " + itemName + " / 合計 : " + itemInventryData.count + " 個");

                return;
            }
        }

        // 所持していないアイテムの場合、新しく追加する
        itemInventryDatasList.Add(new ItemInventryData(itemName, amount, itemInventryDatasList.Count));

        Debug.Log("リストに対象アイテムを新規追加 : " + itemName + " / " + amount + " 個");
    }

 上記のメソッドを実行することにより、引数で届いた情報に基づいて、アイテムの名前と数が GameData クラスにあるアイテムの管理情報の値
すなわち、itemInventryDatasList 変数内に登録されることにより、アイテムの獲得の処理が実装制御されることになります。


<GameData.cs>
    [Header("所持アイテムのリスト")]
    public List<ItemInventryData> itemInventryDatasList = new List<ItemInventryData>();

 大切なことは、メソッドを実行することによってどのような処理が動き、それが「ゲーム上でどのような振る舞いを行うようになるのか」という部分です。
上記のメソッドはアイテム管理用の List 型の変数であり、そこでアイテムの情報を管理しています。これが「ゲーム上で所持しているアイテムの情報」となっていることを確認してください。

 ゲーム上でどのようにしていきたいのか、そのためにはどのような処理が必要になるのか、この両方のイメージを持っていくことが必要になります。

 ここまで製作した処理をもう一度、自分で読みかえしてみてください。このようなイメージを持ってから見返すと処理の見え方が変わってきます。
それがどのような場面で活躍できるようになるのか、ゲーム上でのイメージと合致出来るようにしてきましょう。


2.DialogController スクリプトを修正する


 DialogController スクリプトには会話ウインドウを表示・非表示する役割だけではなく、会話イベントのメッセージの制御を行う役割もあります。
ここに、探索イベントの場合にも会話ウインドウの表示・非表示の制御と、獲得したアイテムの情報をそのウインドウ内にメッセージとして表示する制御を追加していきます。
表示するメッセージの内容は Dialog 変数の情報ではなく、獲得したアイテムの名前と数をつなげたもので表示するようにして、どのアイテムを獲得したのかをユーザーに伝えるように制御をします。

 変数の追加はありません。新しく追加するメソッドが2つありますので、DisplayDialog メソッドを参考にしながら処理を読み解いていってください
また、TODO を多く用意してあります。これは今後追加する予定の処理になります。

 具体的な実装はまだであっても、「ここにこういう処理を入れたい」という考えが浮かんだら、それはすぐに TODO として記録しておいてください


DialogController.cs

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


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


3.TreasureBox スクリプトを修正する


 前回の手順において、処理が正常に動作していることを Debug.Log メソッドを活用することで確認済です。
この部分に、前の手順で作成した DialogController スクリプトの DisplaySearchDialog メソッドの呼び出し命令を記述するように修正していきます。

 Debug.Log メソッド内の文字列をそのままコメントとして記述しておくといいでしょう。


TreasureBox.cs

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


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


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


 すべての手順が終了しました。処理の制御内容を確認した上でゲームを実行してデバッグしていきます。


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


 会話ウインドウを表示している間はプレイヤーキャラの移動操作ができない状態であること、
一度アイテムを獲得した宝箱に対して行動ボタンを押しても無反応になり、重複してアイテムを獲得できないこと、
GameData ゲームオブジェクトのインスペクターより、GameData スクリプトを確認し、画面に表示されたアイテムの名前と数の情報が
itemInventryDatasList 変数に追加されていることを確認してください。

 問題なく動作しているようであれば、事前に itemInventryDatasList 変数に獲得できるアイテムの情報を登録しておいて、
同じアイテムを取得した場合には、同名のアイテムの数が加算されるかどうか確認してください。

 EventDataSO スクリプタブル・オブジェクトにデータを追加することで、宝箱から獲得できるアイテムを変更できます。
自由に試してみてください。この「自分で試す」「処理を改造してみる」という積極的な行為が最も学習になります。


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

 次は 手順26 ー獲得した探索イベントの一時保持ー です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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