Unityに関連する記事です

 ポップアップ内で選択しているキャラをタイルマップに配置する処理を実装します。
2回に分けて実装を行っていきます。

 この手順では、ポップアップ内に各キャラのボタンを生成し、タップしたキャラを配置する処理を実装します。
次の手順で、選択したキャラのアニメが変更されるように修正します。

 よって、次の手順まで完成することで、下記の動画のように、ポップアップ内で選択したキャラが配置されてアニメする機能を実装します。


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


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

手順22 ーポップアップ内で選択しているキャラの生成処理の実装ー
39.PlacementCharaSelectPopUp スクリプトと CharaGenerator スクリプトを修正し、選択しているキャラをタイルマップ上に生成して配置する処理を実装する
40.DataDaseManager スクリプトと CharaController スクリプトを修正し、配置用に選択したキャラの情報を設定する処理を実装する



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

 ・スクリプトの修正に挑戦する
 ・スクリプタブル・オブジェクトの活用方法
 ・List.Find メソッド
 ・ゲームオブジェクトの振る舞いを変える



39.PlacementCharaSelectPopUp スクリプトと CharaGenerator スクリプトを修正し、選択しているキャラをタイルマップ上に生成して配置する処理を実装する

1.設計


 キャラ選択のポップアップにおいて選択したキャラを実際にタイルマップ上に配置するロジックを考えます。

 ポップアップ内のキャラはボタンになっており、選択したキャラの情報がポップアップ内の chooseCharaData 変数に代入されています。
そのため、この情報をキャラを生成して配置するクラス側へ引数を通じて渡すことができれば、キャラの情報をポップアップ内から生成クラスへと届けることが出来ます。

 ・PlacementCharaSelectPopUp 内の  chooseCharaData 変数に選択中のキャラの情報(CharaData)が代入されている
   この情報を生成するクラスへ届けることができれば、そのクラスでも CharaData の情報を利用して、キャラを生成することができる
                ↓
 ・CharaGenerator に新しいメソッドを作成し、引数で CharaData を受け取れるようにする
   このメソッド内でキャラの生成とキャラの情報の設定を行えるようにする

 まずはキャラの生成まで到達できるようにロジックを考えてみてください。


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


 参考用にスクリプトの修正案を掲載しておきます。

PlacementCharaSelectPopUp.cs


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


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


 参考用にスクリプトの修正案を提示しておきます。

CharaGenerator.cs

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


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


4.CharaGenerator ゲームオブジェクトの設定を行う


 新しく追加した CharaCotrollerPrefab 変数に Prefabs フォルダにある Chara ゲームオブジェクトをドラッグアンドドロップしてアサインします。
自動的に CharaCotroller クラスの情報が代入されます。

 敵を生成する際と同じように、GameObject 型での宣言ではなく、CharaController 型での変数宣言になっています。
そのため、インスタンスされたゲームオブジェクトの情報は CharaController 型であるため、このクラスに対しての処理をすぐに実行できる状態になっています。
(GameObject 型でインスンタンスした場合、クラスの情報を扱うには GetComponent メソッドが必要になりますが、その手間がありません)

インスペクター画像



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


 ポップアップ内でキャラを選択し、そのキャラが配置されるかを確認してみてください。
ただしこの時点では、まだ CharaData の情報を反映していないため、すべて同じキャラが配置されます。


40.DataBaseManager スクリプトと CharaController スクリプトを修正し、配置用に選択したキャラの情報を設定する処理を実装する

1.設計


 キャラの生成と CharaData をポップアップ内から CharaGenerator まで届ける処理が完成しましたので、
この手順では、CharaController において、CharaData を利用して設定を行う部分までを実装します。

 この手順が終了することで、配置されたキャラのデータが CharaData の内容になります。
つまり、スクリプタブル・オブジェクトで設定している情報が、ゲーム内において活用される状態になります。

 このことから、1つの Chara ゲームオブジェクトは、自分の元に届いた CharaData の設定を行うことにより、
その都度、異なるキャラとして振る舞いを与えらえることになります。同じ Chara というゲームオブジェクトでありながら
見た目も能力も異なるゲームオブジェクトが完成することになります。

 この方法を実装すると、例えばキャラが5体いる場合に、5体分の Chara のプレファブを作成する必要はなくなります。
1つの Chara のプレファブと CharaData のデータがあれば、CharaData を利用することによって、新しいキャラを作り出すことが可能になります。

 プログラムはこのように「同じゲームオブジェクトでありながら振る舞いを変える」処理が可能です。

 さらに次の手順で、配置したキャラのアニメの設定を行って完成になります。


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


 CharaData にある AttackRangeType の情報を活用できるようにするため、AttackRangeSizeSO スクリプタブル・オブジェクトを DataBaseManager において扱える状態にします。

 また、AttackRangeType によって BoxCollider2D コンポーネントの Size を変更できるように GetAttackRangeSize メソッドを作成し、引数で受け取った
AttackRangeType に応じた Size の情報を提供できるように準備をしておきます。


DataBaseManager.cs

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


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


3.<List.Findメソッド>


 Listには Find というメソッドがあります。
List 内の要素を先頭から検索して、指定した条件に合致した最初の要素1つを取り出して戻り値として返してくれる処理です。
これは foreach 文で記述する内容と同じ処理を1行で処理できます。

  attackRangeSizeSO.attackRangeSizesList.Find(x => x.attackRangeType == attackRangeType).size;


  foreach (AttackRangeSize attackRangeSize in attackRangeSizeSO.attackRangeSizesList) {
      if(attackRangeSize.attackRangeType == attackRangeType) {
          return attackRangeType.size;
      }
  }

 この2つの処理は同じ内容になります。
最初に合致した値が対象になりますので、まとめて複数取得したい場合や、合致する条件を満たす要素が複数ある場合には、この処理だけでは実装できません。


参考サイト
Samurai Blog様
【C#入門】Listの要素を検索するFindの使い方(FindAll/FindIndex)
https://www.sejuku.net/blog/45252


4.DataBaseManager ゲームオブジェクトの設定を行う


 新しく追加した変数に AttackRangeSizeSO スクリプタブル・オブジェクトを登録することができますので、
Datas フォルダにある AttackRangeSizeSO スクリプタブル・オブジェクトをドラッグアンドドロップしてアサインしてください。


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



5.CharaController スクリプトを修正する


 CharaData を活用して CharaController 内に CharaData の情報を反映できるようにするための、初期設定用のメソッドを作成します。
このメソッドは public 修飾子で宣言を行い、 CharaGenerator から呼び出しをしてもらって、その際に引数として CharaData の情報を受け取れる設計にします。

 こうすることで、CharaData が CharaController まで届くことになるため、、配置したキャラに、それぞれの情報を設定して配置を行えるようになります。

 攻撃範囲の情報である BoxCollider2D コンポーネントの Size については、先ほど DataBaseManager 内に新しく追加した GetAttackRangeSize メソッドを実行して
CharaData にある AttackRangeType に合わせた Size に変更を行います。この処理によって、キャラの攻撃範囲を動的に変えることが出来るようになります。


CharaController.cs


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


6.Chara ゲームオブジェクトの設定を行う


 Chara ゲームオブジェクトのプレファブを選択して、新しく宣言した変数に情報をアサインします。

 AttackRangeArea 変数には同名のゲームオブジェクトが子オブジェクトとしてありますので、そちらをドラッグアンドドロップしてアサインしてください。
この BoxCollider2D コンポーネントの Size の情報を、CharaData の情報に基づいて制御できるようにします。

 CharaData 変数は空のままで問題ありません。処理が成功すれば、ここに CharaGenerator から CharaData の情報が届きます。
それが、インスタンスされたゲームオブジェクトの今回の CharaData になります。


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



 以上で設定も完了です。


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


 CharaController 内に SetUpChara メソッドが追加されましたので、CharaGenerator のコメントアウトしていた部分のコメントアウトを削除して呼び出し命令を実装してください。

CharaGenerator.cs
        // キャラの設定
        chara.SetUpChara(charaData, gameManager);

 先ほどと同じようにポップアップ内でキャラを選択してみてください。
CharaData の値が、それぞれのキャラの情報になっていれば制御成功です。
そのため、配置されたキャラの画像がそれぞれに異なっているはずです。

 この機能が振る舞いを変えるという処理になります。

 配置したキャラをヒエラルキーで選択して、CharaData の情報がそれぞれ異なっているかを確認してください。

 なお、インスペクター上で Chara の確認をした際に、Chara の画像の情報が CharaData の内容に正常に書き換わっている場合で、ゲーム画面に反映されない場合には、
Chara プレファブの Animator コンポーネントのスイッチを一度外してから、ゲームを実行してみてください。

 ただし、次の手順で Animator コンポーネントを利用しますので、確認が終わったら、再度、スイッチを入れておいてください。

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

 次は 手順23 −配置したキャラのアニメを自動設定する処理の実装− です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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