kuront’s blog

主にUnityでのゲーム制作やってます。

【Unity】RPG制作 その25-武器、防具アイテム実装その2 装備画面実装

 今回は武器と防具の装備画面の作成をやっていきます。


装備画面はこんな感じです。

f:id:kuront:20211109025925p:plain

f:id:kuront:20211109025936p:plain

左のグレーの部分がボタンになっており、押すとその部位に装備できる武器・防具がスクロールビューに表示されるように作ります。

まずはじめに、GeneralEnum.csに装備部位の列挙型定数を宣言します。

 


クリックで展開

 PlayerManagerに現在プレイヤーが装備している武器と防具を保持するDictionaryの宣言と、プレイヤーの装備状態の初期化関数を作成します。

 


クリックで展開

WeaponManagerとArmorManagerに、所持装備のDctionaryの空きにEntityを登録する関数と、Dictionaryの指定したIndexの装備を削除する関数、Entityから元Dataを取得する関数を作成します。

 


クリックで展開


 


クリックで展開

装備画面内での処理を行うEquipmentUIクラスを新規作成します。一応コードを全部載せますがめちゃくちゃ長いので流し読みすることをおすすめします。(笑)

 


クリックで展開

以前作成したアイテムのリストを応用して作っています。ざっくり説明すると、装備画面内で装備を変更したい箇所の部位のボタンを押すと、Start関数で実行しているSetEquipButtonListener関数が各々のEquipButtonを押した時に実行させたい関数(所持装備をリストに表示するSetWeaponEntity関数とSetArmorEntity関数)を登録します。
 SetWeaponEntity,SetArmorEntity関数の中で、リスト内の武器及び防具の項目(Buttonコンポーネントを追加している)を押した時の処理も登録しています。登録している関数は、ChangeWeapon関数(もしくはDhangeArmor関数)、DestroyAllItem関数、HideListPanel関数、PermissionEquipButton関数です。
ChangeWeapon及びChangeArmor関数は指定した装備部位の装備を指定した装備に変更する処理です。今回、両手武器と盾の概念を入れたかったので、それぞれ装備した時にうまく機能するために関数内では結構複雑な処理をさせています。ChangeWeapon及びChangeArmor関数は元々装備していた武器を所持装備リストに登録する処理も行います。
DestroyAllItem関数はリストのコンテンツをすべて削除する関数です。これを実行しないと装備部位ボタンを押すたびに所持装備をリストに追加してしまうためおかしなことになります。
 HideListPanel関数は装備一覧のリストを非表示にする関数です。武器及び防具の項目を押して装備変更したらリストを消したいのでこの関数も登録しておきます。
 PermissionEquipButton関数は各EquipButtonの押下ができるようにする関数です。SetWeaponEntity,SetArmorEntity関数の最後で、その部位で装備できる武器もしくは防具が一つでもあればProhibitEquipButton関数を実行するようにしているのですが、これは装備一覧を出しているときは各EquipButtonを押せないようにしたいためです。装備変更を終えたらEquipButtonを押せるようにしたいのでこのPermissionEquipButton関数を登録しておきます。
 更に、外すボタンを押した時の処理も登録させています。関数を登録する前にRemoveAllListenersでイベントをすべて削除します。そして、PushRemoveEquipButton関数、DestroyAllItem関数、HideListPanel関数、PermissionEquipButton関数、DeleatEquipText関数を登録します。PushRemoveEquipButton関数は、指定した装備部位の装備を外す関数で、DeleatEquipText関数は指定した装備部位のテキストを空白にする関数です。
EquipmentUIスクリプトを装備画面のCanvasに貼り付け、インスペクターの各々のオブジェクトを設定して実行すると以下の動画のようになります。

youtu.be


次回は装備による能力値の変化を実装していきます。

【Unity】RPG制作 その24-武器、防具アイテム実装

 今回からは武器と防具の実装をやっていきたいと思います。
過去の記事(RPG制作 その4)で作成したWeaponData、ArmorDataクラスを武器と防具のベースのデータに使います。少し修正もしておきます。

 


クリックで展開



 


クリックで展開

これらのデータをもとに作成される武器、防具の個体データを扱うクラス、WeaponEntityとArmorEntityを作成します。

 


クリックで展開

 


クリックで展開

実際に武器、防具を手に入れるイベントを作成します。イベントIDをそれぞれ13,14とします。DangeonController.csのInformDangeonEventコルーチンに処理を追加します。

 


クリックで展開

武器、防具入手イベント時に参照するWeaponGroupクラスとArmorGroupクラスを作成します。

 


クリックで展開

 


クリックで展開

入手した武器と防具(WeaponEntityとArmorEntity)を管理するWeaponManagerとArmorManagerを作成します。

 


クリックで展開



 


クリックで展開


DangeonController.csにWeaponGroup型とArmorGroup型の変数を宣言します。

 


クリックで展開

DangeonEvent.csでイベントを定義します。

 


クリックで展開

 DangeonController.csのIEDangeonEventProcessコルーチンにeventIDが13,14の時の処理を追加します。

 


クリックで展開

ダンジョンのフロア生成時に武器、防具入手イベントが配置されるようにします。DangeonMap.csのeventIDListにIDを追加します。

 


クリックで展開

 これでイベントで武器と防具を入手できるようになりました。
ヒエラルキーにWeaponManagerとArmorManagerの名前でゲームオブジェクトを作成し、同名のスクリプトを貼り付けます。WeaponDatas、ArmorDatasにゲーム中で登場させる武器と防具を設定しておきます。それからResourceフォルダ配下にWeaponGroupとArmorGroupのScriptableObjectを作成します。それぞれ仮に設定しておきます。

f:id:kuront:20211101210118p:plain

f:id:kuront:20211101210126p:plain

f:id:kuront:20211101210134p:plain

あとはこのWeaponGroupとArmorGroupをDangeonController.csの方で読み込みます。

 


クリックで展開

今回は以上です。次回は装備画面を作成したいと思います。

【Unity】RPG制作 その23-ワープイベント、帰還イベントの作成


 今回はワープイベントを作成していきます。eventIDを11とします。ワープイベントを知らせる処理をInformDangeonEventコルーチンに追加します。

 


クリックで展開

DangeonEvent.csにIEInformWarpEventコルーチンの定義を記述します。

 


クリックで展開

 実際にワープするイベントも追加します。ワープポイントは2つで1組として機能するのですが、同じフロアで2組以上設置できるように、それぞれのワープポイントがどのワープポイントに関連付けられているかをマップ横数×マップ縦数の配列で設定するようにします。DangeonMap.csに新しく配列を宣言します。

 


クリックで展開

B6Fのワープイベントを3組設定するので、0~2の3組の数値を設定しています。B6Fのイベントのは位置と部屋構造は
以下のとおりです。

f:id:kuront:20211028003532p:plain

ワープイベントをDangeonEventに記述します。

 


クリックで展開

 プレイヤーの現在地にあるワープのIDでWarpEventAssociation配列の要素を検索して、一致するIDのワープポイントの位置に移動します。このコルーチンをDangeonController.csのIEDangeonEventProcessコルーチンで呼び出します。


 


クリックで展開

これでワープイベントは完成しました。次に帰還イベントの作成をします。帰還イベントのIDはイベントIDは12にします。帰還イベントを知らせる処理をDangeonController.csのInformDangeonEventコルーチンに追加します。

 


クリックで展開

IEInformReturnTownEventコルーチンと実際に帰還するイベントをDangeonEvent.csで定義します。

 


クリックで展開

DangeonController.csのIEDangeonEventProcessコルーチンでIEInformReturnTownEventコルーチンを呼び出します。

 


クリックで展開

これで実行すると以下の動画のようになります。

youtu.be

 今回は以上です。

【Unity】RPG制作 その22-トラップイベント、扉のスイッチイベント実装

 今回は探索時のトラップイベントやスイッチで開く扉の処理を実装していきます。

 まずはじめに、DangeonController.csのInformDangeonEventコルーチンで、各々のイベントが配置されていることを知らせる処理を追加します。

 


クリックで展開

 case7~10で実行されるイベントをdangeonEvent.csで実装します。

 


クリックで展開

今度はDangeonController.csのIEDangeonEventProcessコルーチンで現在位置のイベントを実行する処理を追加します。

 


クリックで展開

IEDangeonEventProcessコルーチンで追加した各々のイベントの処理のコルーチンをDangeonEvent.csで定義します。

 


クリックで展開

スイッチで開く扉イベントは同一フロアにある青いスイッチをすべて押した時に下り階段にイベントに変わるようになっています。
実際にうまくイベントが動くかどうか試すために、新しくダンジョン第5層を作成します。DangeonMap.csのstructOfDangeonの3次元配列とposOfEventの3次元配列に5層のデータを追加します。


 


クリックで展開

structOfDangeonに5層のダンジョンの部屋構造のデータ、posOfEventに5層のイベント配置(上り階段1つと青スイッチ(OFF)2つ)、isViewRoomとisViewEventにもそれぞれ5層のデータを追加しました。
あと、新しいフロアをに入った時に一定確率でトラップイベントを生成するようにします。イベントのランダム生成はDangionMap.csのSetEventNowFloorAtRandam関数で行っているので、この関数の処理を変更します。

 


クリックで展開

もともとposOfEventに0~4のランダムなIDを入れていたのを、新たにeventIDListを作成して、ListのIDの中からランダムに代入するように変更しました。
 このまま実行するとトラップイベントが実行される前にダンジョンマップとボタンなどが表示されてしまうので、それを直します。QuestManagerに新たに処理を追加します。

 


クリックで展開

 部屋の移動を完了した時に呼び出す処理を二つに分けました。OnCompleteMoveRoom2はバトル、イベントに突入していても呼び出す関数で、OnCompleteMoveRoomはバトル、イベントに突入しなかった時に呼び出す関数です。バトル、イベントに突入した場合はボタンとマップを表示したくないので、これらの表示関数はOnCompleteMoveRoom2に登録するようにします。

f:id:kuront:20211026172511p:plain

 現状QuestManager.csのSerachingの後半でプレイヤーがイベントが配置されている位置に来た時の処理を描いているので、ここにトラップイベントの座標に来た時の処理を追加します。

 


クリックで展開

トラップイベントの場合のみ処理を分岐させています。個々の処理は後々変更があると思います。
さらにトラップイベントが終わったあとにマップの表示と、ボタンの表示、nowEventフラグをfalseにします。

 


クリックで展開

 DangeonMap.csにイベントのアイコンを更新する関数を作成します。

 


クリックで展開

UpdateEventIcon関数をスイッチで開く扉が開いた後と青いスイッチイベント(OFF)完了後に呼び出します。

 


クリックで展開


 


クリックで展開

これで実行すると以下の動画のようになります

youtu.be

 次回はワープイベントを作成しようと思います。

【Unity】RPG制作 その21-到達していない部屋を非表示にする

 前回の終わりで探索時のトラップを作成すると書きましたが、今回はその前に、到達していないダンジョンの部屋とその部屋に配置されているイベントを非表示にする処理を実装していきます。

 はじめに、イベント及び部屋を表示するかどうかのデータを保持する配列をDangeonMap.csに宣言します。

 


クリックで展開



isAlreadyEnterFloor配列は、既に訪れたことがある部屋かどうかのFloorごとの状態を保持する配列です。

 次に部屋とイベントの表示非表示の初期化処理の関数を作成します。

 


クリックで展開

これらの関数をDangeonMap.csのStart関数と、DangeonEvent.csのIEDownFloorEventコルーチンとIEUpFloorEventコルーチンで呼び出します。

 


クリックで展開

 


クリックで展開

 それから、現状プレイヤーが階段を上り下りした時に、プレイヤーの位置がランダムで決定されるようになっているのをやめて、階段を降りたときは次のフロアの上り階段に、階段を登ったときは次のフロアの下り階段に配置されるようにします。DangeonController.csに以下の関数を作成します。

 


クリックで展開

この関数をDangeonEvent.csのIEDownFloorEventコルーチンとIEUpFloorEventコルーチンで呼び出すようにします。

 


クリックで展開

 あとは、移動ボタンを押した時に、移動先の部屋とイベントを表示するようにします。DangeonController.csに以下の関数を作成します。

 


クリックで展開

これらの関数を、questManagerのOnCompleteMoveRoomに登録します。

f:id:kuront:20211024144424p:plain

以上の処理を追加して実行すると以下の動画のようになります。

youtu.be

これでたどり着いていない部屋とその部屋のイベントを非表示にするようになりました。次回はトラップや扉を開くためのスイッチなどを実装していきます。

【Unity】RPG制作 その20-探索イベントのランダム配置

 今回は探索イベントをランダムに配置する処理を実装していきます。
はじめに、今までDangeonMap.csのposOfEventに直接入力していたIDを階段の上り下りのイベント以外全て-1にしておきます。

 


クリックで展開

 次に探索イベント初期化する関数と、探索イベントランダムに配置する関数を作成します。

 


クリックで展開

作った関数をSetEventをする前に呼び出します。

 


クリックで展開

 


クリックで展開

これでEventIDが0~4の探索イベントが1フロアにつき3~5個生成されるようになりました。

youtu.be

次回はダンジョンの進行を阻むギミックを作っていきたいと思います。

【Unity】RPG制作 その19-ダンジョンの下層へ進む

 今回はダンジョンの下層にすすめるように階層間の移動を実装していきます。現状、DangeonMap.csに2次元配列を定義してそれをもとにダンジョンの部屋構造を定義しているのですが、その二次元配列を三次元配列に定義しなおします。

 


クリックで展開

これで階層ごとのダンジョンの部屋配置とイベントのID配置ができます。
QuestManager.csにいって、現在の階層を保持する変数を宣言します。

 


クリックで展開

QuestManager.csで実装していた、移動するごとにステージの進行度を1増やす処理を削除します。

 


クリックで展開

ダンジョン、マップを生成する時に実行するDangeonMap.csのSetDangeon関数と、SetEvent関数に現在の階層を渡すようにします。

 


クリックで展開

DangeonCotroller.csのCheckCanMove関数、GetCurrentPosDangeonEventID関数、DeleteRegiEvent関数、 DeleteEvent関数で使用していた二次元配列を[現在の階層、Y座標,X座標]の形の三次元配列に置き換えます。

 次に,階層を移動するイベントを作っていきます。eventID5を下階層への移動イベント、eventID6を上階層への移動イベントとします。最初に、eventID5,6に到達したら階段があることを知らせる関数をDangeonEventクラスに作成します。

 


クリックで展開

DangeonController.csのInformDangeonEvent関数で上記のイベントを呼び出す処理を追加します。



クリックで展開

イベントを知らせるイベントができたので、実際にイベントを実行する処理を追加していきます。


クリックで展開

DangeonController.csのIEDangeonEventProcess関数に処理を追加します。


クリックで展開

それとダンジョンの部屋生成をする時にstructOfDangeonの3次元配列で-1にしてあるところは何も表示しないようにしたいので、SetDangeon関数で処理を分岐させて画像を設定するようにします。


クリックで展開

フロアを移動した時にプレイヤーがroomのIDが-1以外の場所にランダムで配置されるようにします。そのための関数をDanceonController.csに作成します。


クリックで展開

この関数をDangeonEvent.csのIEDownFloorEventコルーチンとIEUpFloorEventコルーチンで呼び出すようにします。
これで上下の階層に移動することができるようになりました。

youtu.be

次回はイベントをランダムで配置できるようにしていきます。