Unityに関連する記事です

 現在使用している武器の情報をゲーム内に実装できましたので、これを利用し、次は武器の切り替え機能の実装を行います。



手順20 ー使用する武器の切り替え機能ー

<学習内容>
 ・オブジェクト初期化子



設計


 使用している武器の情報を複数管理できるように処理を修正し、
その中のどの武器を利用しているのかを特定して制御することにより、武器の切り替え機能を実装します。

 複数の武器の情報については、List により管理を行うようにします。
最初から取得できる武器の数が決まっている場合には配列でも構いませんが、ゲームの進行状況により、
ゲーム内で入手したり、なくなったりすることを考慮するならば、可変型で管理できる List の方がより使いやすいためです。

 List を管理するクラスとして、シングルトンデザインパターンの GameData クラスを新しく作成します。
シングルトンクラスにすることにより、多くのクラスからアクセスが自由に行える環境にしておくことで
武器の入手や武器の切り替えの処理を実行しやすくなります。


GameData スクリプトを作成する


 シングルトンデザインパターンで作成します。

 WeaponData 型の List の宣言を行い、初期武器の情報、および、ゲーム内で取得した武器の管理も行います。

 取得した武器を List に追加するためのメソッドも用意しておき、武器の取得イベント時には、
こちらのメソッドを実行して武器を List に追加することで武器を取得したことにします。


GameData .cs

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


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


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


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を行います。
新しいゲームオブジェクトが作成されますので、名前を GameData に変更し、作成した GameData スクリプトをアタッチします。

 インスペクターの設定は不要ですので、正常にアタッチされていることを確認しておいてください。





 以上でこのゲームオブジェクトは完成です。


WeaponChanger スクリプトを作成する


 武器を交換する機能を制御するためのクラスを作成します。

 任意のボタンを押すたびに武器が1つずつ切り替わり、最後の武器までいったら
また最初に武器に切り替わるようにしておきます。

 またゲーム開始当初は武器が1つしかないため、その場合には武器の切り替えのボタンを押しても
武器が切り替わらないようにする制御も合わせて実装しておきます。

 スクリプトに処理を実装する場合、今回の場合であれば、切り替えの処理を実装するにあたり、一方向の切り替えなのか、双方向への切り替えなのか、
切り替える対象の武器がない場合にはどうするのか、といったように、想定される挙動について、すべてを網羅する機能をスクリプト内に記述しておく必要があります

 そういった意識をもって設計を行えるようにしておくことが大切です。


WeaponChanger.cs

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


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


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


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を行います。
新しいゲームオブジェクトが作成されますので、名前を WeaponChanger に変更し、作成した WeaponChanger スクリプトをアタッチします。

 インスペクターの確認を行い、Player 変数に PlayerController のアタッチされているゲームオブジェクトをアサインしてください。





 以上で完成です。


PlayerController スクリプトを修正する


 武器切り替え用を補助する機能を持つ UpdateCurrentBulletCountData メソッドを新しく追加します。
このメソッド内では、現在使用している武器の情報を保持しておき、次に同じ武器を使用する機会が来た時に
保持しておいた残弾数を適用できるようにします。同じ武器を重複して登録しないように重複防止の判定も行っています。

 List 内に情報がない場合には使用したことがない武器として判定し、新しく List に追加します。
List 内に情報がある場合には使用したことがある武器として判定し、既存の武器の残弾数を更新します。

 List を利用するためには、using System.Collections.Generic の宣言が必要です。



 この 武器ごとの残弾数の情報を管理を行う ために、新しいクラスとして BulletCountData クラスを作成します。
このクラスは武器1つごとの情報になりますので、複数の武器の残弾数の情報を扱えるように List によって管理を行います。

 また、ChangeBulletData メソッドの TODO の実装を行い、武器を切り替えた際に、残弾数の確認を行う機能を追加します。

 武器を切り替えた際には、こちらの情報を確認し、切り替える前の残弾数を利用できるようにします。
つまり、A から B の武器に切り替えたときには、B の残弾数を利用し、再度 B から A の武器に切り替えた際には
保持しておいた切り替える前の A の残弾数を利用できるようにしています。

 TODO の部分に関しては、どのような処理を追加すれば期待する機能を実装することができるようになるのか、
まずは考えて、実際に実装を行ってみてください。


PlayerController.cs

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



<オブジェクト初期化子>


 インスタンスしたクラスや構造体を初期化する方法の1つです。
下記の処理内の、Add メソッド内で実行されている処理がクラスをインスタンスし、初期化している部分です。

PlayerControler.UpdateCurrentBulletCountData メソッド
 // 新しくデータを作成して、記録
  currentBulletCountsList.Add(new BulletCountData { bulletNo = currentWeaponNo, bulletCount = bulletCount });

<上記の処理のうち、この部分がクラスをインスタンスしている部分>
new BulletCountData { bulletNo = currentBulletNo, bulletCount = bulletCount }

 コンストラクタを持つクラスや構造体がインスタンスされると、コンストラクタ・メソッドが自動的に呼び出されて、初期化の処理が行われます
それ以外の方法として、''インスタンスと同時に { }
を利用して、この中でフィールドに定義されている値への代入処理を行うことが可能 ''です。

 この方法による値の代入処理を オブジェクト初期化子 といいます。

 処理の内容は通常の初期化子と同じです。
ここの機能により、クラスや構造体のフィールドに用意している変数に対して、引数の値を代入することによって初期情報を登録します

 そのためオブジェクト初期化子とは、下記のような コンストラクタ・メソッドと同じ働きをする ことになります。


<new CurrentBulletCount が実行されると、コンストラクタが処理される = 初期化>
    [System.Serializable]
    public class BulletCountData {       // 入れ子クラス

    public int bulletNo;     // 武器の番号
    public int bulletCount;   // 武器の残弾数

    public BulletCountData(int no, int value) {  // <=  ここに引数の情報が届く
        bulletNo = no;
        bulletCount = value;
    }
}

参考サイト
MicroSoft
オブジェクト初期化子とコレクション初期化子(C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/pro...


PlayerController スクリプトがアタッチされているゲームオブジェクトの設定を確認する


 PlayerController スクリプトを修正し、新しく List 型の変数を追加していますので、インスペクターから確認しておきます。

 新しく表示されている List 変数は確認だけで、設定の必要はありません。
この List にはゲーム内で武器の切り替えを行ったタイミングで情報が追加・更新されます。
(ゲーム内で動的に変更・追加されていく値になるためです。)





GameManager スクリプトを修正する


 Start メソッド内にある TODO の実装を行い、初期武器の登録処理の追加と、初期武器の情報を設定する処理の修正を行います。

 こちらも PlayerController スクリプトと同じで、TODO の実装内容を見る前に、自分で処理を考えて、出来れば書いてみてください。


GameManager.cs

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



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


 プレイヤーの初期武器の登録について処理を追加しました。

 実際にゲームを実行し、GameData クラス内の List に武器の情報が追加されるかを確認します。
追加される武器の情報は WeaponDataSO スクリプタブル・オブジェクトの内容になっていれば制御成功です。


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



WeaponDataSO スクリプタブル・オブジェクトのデータを参照している



Console ビュー画像





 GameData の WeaponDataList 変数内にある武器は1種類だけですので、武器の切り替えボタンを押しても、切り替えは機能しませんが、切り替える武器がない場合には、それが正常な動作になります。

 それではこの手順の最後に、自分で武器を追加する処理を考えて実装し、
武器の切り替え機能が正常に動作するかを確認してみましょう。


<応用>武器を追加して、切り替え機能の確認を行う


 GameManager スクリプトを修正し、初期武器の他にも2種類の武器を追加し、
合計で3つの武器を List で管理できるようにしてください

 その処理が完成したら、ゲームを実行して、複数の武器が GameData の List に追加されるか、確認します。


<実装動画 .押璽犲孫垰にデバッグ用に武器の情報が複数 List に追加される>
動画ファイルへのリンク


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



List 内を展開した際



Console ビュー画像




 無事に List に武器が複数登録されたら、武器の切り替えボタンを押してください。
 ここでは確認するポイントが2つあります。

 最初に WeaponChanger ゲームオブジェクトのインスペクターを順番に確認してください。

 武器の切り替えボタンを押すたびに currentWeaponNo 変数の値が1つずつ加算されていき、
武器の最大値になったら 0 に戻っていれば制御成功です。


<実装動画◆”雋錣寮擇蠡悗┘椒織鵑魏,垢燭咾肪佑変わり、武器の最大数(今回は 3)になったら 0 に戻る>
動画ファイルへのリンク




 次に PlayerController スクリプトのアタッチされているゲームオブジェクトのインスペクターを順番に確認してください。
武器を切り替えた際 List に、今まで利用していた武器の番号と残弾数が登録されれば制御成功です。

 すでに登録されている武器の場合には、残弾数のみ更新されて、同じ武器の番号の武器は重複登録されていないことを確認してください。


<実装動画ー1 PlayerController の使用している武器の情報が切り替えによって List に更新される>
動画ファイルへのリンク


<実装動画ー2 PlayerController の使用している武器の情報が切り替えによって List に更新される>
動画ファイルへのリンク


<実装動画ー3 同じ武器の場合には、すでにある残弾数が更新される>
動画ファイルへのリンク



 以上の部分をすべて確認してください。

 結果として、無事に3種類の武器が順番に切り替わり、最後の武器の切り替えを行ったら、最初に武器に切り替えが行われれば制御成功です。



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

 => 次は 学習の振り返りー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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