kuront’s blog

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

【Unity】RPG制作 その32-特技の実装3 特技の効果対象による処理分岐、コードの整理

今回は特技の効果対象によって敵を複数回攻撃したりランダムで攻撃したりできるようにしていきます。
SpecialEvent.csのIEUseAttackSpecialコルーチンに処理を描いていきます。現状条件文の中の実行コードがかなり長くなっており、処理全体の見通しが悪くなっているので、実際に処理を行う部分を関数にします。

 


クリックで展開

SpecialEvent.csのIEUseAttackSpecialコルーチンの処理を作成した関数に置き換えます。

 


クリックで展開

 これで攻撃特技の処理が分かりやすくなります。specialDataのactivateCount(特技の発動回数)分For文でループさせるようにしたのでこれで複数回攻撃の実装ができます。
敵をランダムに攻撃する処理を作るのに当たって、Dictinary型からランダムにKeyを取得する処理を使いたいと思います。Dictionary自体にそういった機能持つメソッドが用意されていない(多分)ので、ネットで調べた方法でDictinaryからランダムにKeyを取得できるようにします。こちらのサイトを参考にさせていただきました。

baba-s.hatenablog.com

Dictionary型の拡張メソッドクラスDictionaryExtクラスを作成します。

 


クリックで展開

このクラスをプロジェクト内に置いておけばプロジェクト内のコードのDictionary型は全て拡張メソッドを使えます。

 


クリックで展開

効果対象がOneOfEnemyAtRandom(ランダムに敵一体)の時にbattleManagerのenemysListからKeyをランダムに取得して敵を攻撃する処理を入れました。PlayBattleEffectWhenRandomコルーチンで攻撃する敵の場所にエフェクトが再生されるようにしています。OneOfEnemyAtRandomAttackSpecialProcessコルーチンでランダムに敵一体を攻撃する時の処理を行っています。もし途中で敵を撃破した場合はbattleManagerのEnemyDeath関数を実行してたおした敵にまた攻撃しないようにします。そしてIEUseAttackSpecialコルーチンのfor文の最後でbattleManager.CheckAllEnemyDeathを行い敵が全て倒された場合はfor文を抜けてそれ以上攻撃が実行されないようにします。
IEUseAttackSpecialコルーチンの最後で再度battleManager.CheckAllEnemyDeathをし、trueなら戦闘終了処理をします。battleManagerの
StartPlayerTurnコルーチンの最後にも戦闘終了処理があるので、そちらはisBattleEndがfalseの場合に実行されるようにし、EndBattleが2回実行されないようにします。

 


クリックで展開

 これで戦闘テストをしてみます。

youtu.be

 今回は以上です。

【Unity】RPG制作 その31-特技の実装2 全体攻撃実装

今回は全体攻撃の特技を実装していきたいと思います。
SpecialData.csの列挙型TARGETのtargetに使用対象を設定するようにしているので、targetの中身がTARGET.AllOfEnemy(敵全体)の場合の処理をSpecialEvent.csに記述します。

 


クリックで展開

 ついでに貫通率,魔法防御率を反映するようにしておきました。
全体攻撃の場合は、敵全てが生存しているかどうかを調べたいので、BattleManagerの敵を倒したかどうかを判定している箇所の処理を変更します。

 


クリックで展開

 PlayEffect.csに全体攻撃用のアニメーション再生関数を作成します。


 


クリックで展開

これで全体攻撃のときは敵の真ん中らへんにエフェクトを再生するようにします。実際に全体攻撃の特技を作成して戦闘中に使ってテストします。

youtu.be

次回は複数回敵を攻撃できる特技を実装したいと思います。

【Unity】RPG制作 その30- 特技使用時のアニメーション再生


今回は特技を使用した時にアニメーションを再生されるようにしていきます。

アニメーションを実装するにあたって、こちらのアセットを使用します。

assetstore.unity.com

それからぴぽや倉庫様、moyasi戦闘エフェクト館様からも戦闘エフェクトをお借りします。

pipoya.net


tktknkyo.hatenadiary.jp


SpecialData.csに再生するアニメーションを入れる公開変数を宣言します

 


クリックで展開

itemDataにも作っておきます。

 


クリックで展開

アニメーション再生クラスPlayEffectクラスを作成します。

 


クリックで展開

SpecialEventクラスのIEUseAttackSpecialコルーチンにアニメーション再生の処理を追加します。


 


クリックで展開


ItemEventクラスにも処理を追加します。

 


クリックで展開

戦闘エフェクトをテストするUIを作成します。以下の画像のように作成しました。

f:id:kuront:20211114141145p:plain

この画面を制御するコードをDebugUI.csに記述します。


 


クリックで展開

これで戦闘エフェクトを再生できるようになりました。

youtu.be

次回は特技の全体攻撃などを実装していきたいと思います。

【Unity】RPG制作 その29-特技の実装1 基本部分を作成

 今回から特技の実装をやっていきたいと思います。基本的にアイテムの実装と似ているところが多いので、アイテム実装の時に使った処理を流用していきます。
 まずは特技の個々のデータを扱うSpecialDataクラスを作成します。

 


クリックで展開

SpecialDataを管理するクラスSpecialManagerクラスを作成します。

 


クリックで展開

PlayerManager.csにプレイヤーが使用可能な特技を設定するDictionaryとその初期化関数を設定します。

 


クリックで展開

特技の処理を扱うSpecialEventクラスを作成します。

 


クリックで展開

 特技を使用する時に表示するUIを作成します。

f:id:kuront:20211112162311p:plain

特技のUIを制御するSpecialUIスクリプトを作成します。

 


クリックで展開

GetElementColor関数は特技の持つ属性によってテキストの色を決める関数です。今回特技のテキストを属性によって色を変えて表示してみました。(のちのち戻すかもしれません)

特使を選択した際に表示する対象選択のためのパネルを制御するSpecialUsePanelクラスを作成します。

 


クリックで展開

battleManagerに特技関連の処理を追加します。ついでにSetupBattle関数でプレイヤーの戦闘用のDictionaryを初期化する関数を呼び出します。


 


クリックで展開

StageUIManagerに探索中に特技ボタンを押した時の処理を記述します。

 


クリックで展開

CommandUIManager.csに戦闘中に特技ボタンを押した時の処理を記述します。

 


クリックで展開

公開変数の設定、Buttonの関数設定をして実際に戦闘してみます。

youtu.be

 探索イベント関連で少しバグがありますが動作しました。
次回は特技使用時のアニメーション再生を実装したいと思います。

【Unity】RPG制作 その28-戦闘時の能力値処理実装

今回は戦闘時の能力値周りの処理を実装していきます。PlayerManager.csに戦闘時に実際に参照される能力値を保持するDictionaryを新しく作成します。

 


クリックで展開

これらのDictionaryの初期化関数を作成します。

 


クリックで展開

EnemyManager.csにも同様の記述をします。

 


クリックで展開




battleStatusValueディクショナリの値をセットする関数を作成します。

 


クリックで展開


 


クリックで展開

Attack関数を戦闘時能力値を参照するようにします。

 


クリックで展開

 


クリックで展開

BattleManagerで能力値を参照している処理をすべて書き直します。

 


クリックで展開

 これで戦闘時に使用するディクショナリの実装ができました。次回は特技の実装をやっていきたいと思います。

【Unity】RPG制作 その27-プレイヤーの属性耐性値・状態異常のかかりやすさの値の確認画面作成

 今回はプレイヤーの属性耐性値・状態異常のかかりやすさの値を確認できる画面を作成していきたいと思います。これらの画面はプレイヤーのステータス画面で表示させたいので、画面を切り替えるためのボタンをPlayerStatusUICanvas内に配置します。

f:id:kuront:20211110002356p:plain

 属性耐性値を表示するUIを作成していきます。とりあえずテキストで属性耐性値を出力したいので以下の画像のように作成します。

f:id:kuront:20211110002701p:plain

 今回、属性耐性値をレーダーグラフで表示させたいので、以下のサイトを参考にしながらレーダーグラフを作っていきます。

https://blog.naichilab.com/entry/radarchart

レーダーグラフを描画するのに必要なクラスを2つ作成します。クラス名はRadarChartPolygonUGUIクラスとRadarChartLineUGUIクラスです。それぞれ以下のように記述します。

 


クリックで展開

 


クリックで展開

 属性耐性値を表示するパネルRegiElementListオブジェクトの階層下にPanelを新規作成し、Panelの階層下に新規のオブジェクトを2つ作成し、名前をRadarChartPolygonUGUI,RadarChartLineUGUIにし、同名のスクリプトを貼り付けます。

f:id:kuront:20211110034510p:plain

グラフの値や線の太さなどを適当に調整し、アイコンを配置して外見を作ります。

f:id:kuront:20211110040725p:plain

 同様にして状態異常有効率表も作りました。

f:id:kuront:20211110194343p:plain

それぞれの表を制御するコードをPlayerStatusUI.csに記述していきます。

 


クリックで展開

それぞれの表自体のゲームオブジェクトとテキスト、レーダーグラフの値をセットする関数にRButton,LButtonを押した時に表を切り替える処理を記述しました。公開変数とButtonのOnclickに各々の設定をして実行すると以下の動画のようになります。

youtu.be

次回は戦闘中の能力値周りを実装していきます。

【Unity】RPG制作 その26-武器、防具アイテム実装その3 装備による能力値の変化実装


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

 はじめに、PlayerManager.csで基本能力値と装備反映後の値を保持するDictionaryを宣言します。

 


クリックで展開



Dictionaryの初期化関数と装備による能力値の変化反映後の値(3つのDictionary)を計算する関数を作成します。

 


クリックで展開

それぞれ武器と防具の能力値の変化量の合計を基本値から引いたものを装備反映後の能力値を入れるDictionaryに入れています。
InitBaseStatusValue関数とInitAfterEquipDictionary関数をPlayerManager.csのStart関数で呼び出します。

 


クリックで展開

装備反映後の能力値の計算を行う3つの関数を装備の変更がなされた時に呼び出すようにします。EquipmentUI.csのPushRemoveEquipButton関数、ChangeWeapon関数、ChangeArmor関数のそれぞれ最後の部分に処理を追加します。

 


クリックで展開

 これで内部的には装備の変更によって数値が変更されるようになったのですが、見た目で確認することができないので、ステータス画面で装備を考慮した数値を確認できるようにしたいと思います。
ステータス画面の制御はPlayerStatusUIスクリプトで行っているのでこちらに処理を追加していきます。現状、PlayerManagerオブジェクトのインスペクターで設定した数値をそのまま表示しているのですが、それを装備反映後の数値とカッコ内に基本値を表示する形式に変更します。

 


クリックで展開

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

youtu.be

 次回は属性耐性値と状態異常のかかりやすさの値を確認できるUIを作成したいと思います。