ARPG開発 002 レベルアップシステム

敵を倒して経験値を得るとレベルが上がり、最大HP・最大MP・攻撃力が上がるシステムです。

構造体の作成と編集

DataTableというフォルダを作り、右クリックしてブループリント > 構造体を選択。名前はStruct_LvUpにしました。

Struct_LvUpを開き、+変数を追加を3回クリックして構造体を4つにする。
名前をRequiredExp、MaxHp、MaxMp、Attackにします。ピンタイプはFloat(小数)にしました。RequiredExpとは必要経験値のことです。

データテーブルの作成と編集

DataTableフォルダで右クリックしてその他 > データテーブルを選択。
「構造体を選択」というウィンドウが開きますので先ほど作成したStruct_LvUpを選択。
名前はDT_LvUpにしました。

DT_LvUpを開き+追加を5回クリックして5行にします。
まず行の名前を行の番号と同じ数字にします。

ウィンドウ > 行エディタにチェックを入れると編集可能な行エディタが表示されます。

RequiredExp(必要経験値)は1(Lv1)では0ですが、それ以外は必要経験値を設定します。現在経験値はLvアップごとにリセットされていますから、次のLvアップへの必要経験値はLvごとに100で固定でも問題ありません。
MaxMpはLvが上がる度に減らしています。これの用途はMaxになると必殺技が使えるようにしたいので、Lvが上がってMax値が減るほどMaxになりやすくなります。
こういう数値は後で変更・追加できますから、最初はパパッとやります。

ブループリントインターフェースの作成と編集

Blueprintsフォルダで右クリックしてブループリント > ブループリントインターフェースを選択。名前はBPI_GetExpにしました。

BPI_GetExpを開くと関数の画面になりますので、名前をGetExpにしておきます。
関数GetExpの詳細のインプットで+して追加、名前をExp、ピンタイプをFloatにしました。得た経験値をセットするものです。

プレイヤーキャラクターブループリントの編集

プレイヤーキャラクターのブループリント、BP_Playerを開きます。

上メニューのクラス設定 > 詳細 > インターフェース > 実装インターフェースを追加して、BPI_GetExpを選択。コンパイルもしておきましょう。

変数を追加します。
Lv (Integer) ※デフォルト値を1に設定
RequiredExp (Float)
MaxHp (Float)
MaxMp (Float)
Attack (Float)
CurrentExp (Float)
TotalExp (Float)
ContinuousLvUp (Boolean)

CurrentExp (Float)は現在の現在経験値です。
ContinuousLvUp (Boolean)は1度に大量経験値を得た時の連続レベルアップの管理をします。

ノードを組む

左メニューのインターフェースGet Expで右クリックして「イベントを実装」を選択するとイベント Get Expが配置されます。その中のExpから線を伸ばして+キーを押して加算する(+)を配置。加算する(+)の左下にはCurrentExpをGetして繋げる。得た経験値を現在経験値に足しています。
さらにCurrentExpをSetしてイベント Lv Up加算する(+)から繋げる。
変数のContinuousLvUpをセットして、その中のContinuousLvUpのチェックを入れる。セットから繋げる。
ContinuousLvUpのセットの右上から線を伸ばしてWhile Loopを配置。その中のConditionには変数のContinuousLvUpをGetして繋げる。ContinuousLvUpがTrueである限り、Loop Body以降の処理を繰り返します。
Loop Bodyから線を伸ばしてブランチを配置。
CurrentExp(現在経験値)をGetして線を伸ばして以上(>=)を配置。以上(>=)の左下にはRequiredExp(必要経験値)をGetして繋ぐ。以上(>=)からブランチConditionに繋げる。
ContinuousLvUpをセットしてContinuous Lv Upのチェックを外し、ブランチのFalseから線を伸ばして繋げる。現在経験値が必用経験値未満なら、連続レベルアップがFalseになります。
変数のLvをGetして線を伸ばして加算する(+)を配置。その中の値を1にしておきます。レベルが1上がるわけです。
変数のLvをSetして、加算する(+)からLvに繋ぐ。ブランチのTrueからも繋ぐ。
CurrentExp(現在経験値)をGetして線を伸ばして減算する(-)を配置。減算する(-)の左下にはRequiredExp(必要経験値)をGetして繋ぐ。
CurrentExp(現在経験値)をSetして減算する(-)からCurrent Expに繋ぐ。Lvのセットからも繋ぐ。
セット(CurrentExp)から線を伸ばしてデータテーブル行を取得を配置。その中のData TableはDT_LvUpを選択。外側の列で右クリックして構造体ピンを分割。
変数のLvをGetして線を伸ばしてTo Stringを配置、続けて線を伸ばしてString To Nameを配置し、Row Nameと繋げる。整数であるLvをNameに変換したわけです。
変数のRequiredExp、MaxHp、MaxMp、AttackをSetしてGet データ Table Row DT_LvUp見つかった列から線を伸ばして繋ぐ。
Get データ Table Row DT_LvUp外側の***も対応しているノードに繋ぐ。

敵キャラクターの準備

コンテンツ > Characters内にEnemyというフォルダを作成しました。
そこにBP_ThirdPersonCharacterをコピーして名前をBP_Enemyにしました。
BP_Enemyを開き、コンポーネントのMeshのSkeletal Mesh AssetをSKM_Mannyに変えておきます。
すぐ下のマテリアルのエレメント0をダブルクリックして開き、詳細 > パラメータ グループ > 01 – BaseColor > Tinをにして、エレメント1も同様ににしました。

コンポーネントのCameraBoomとFollowCameraは不要なので削除します。
コンポーネントのCapsule Componentを選択し、詳細のコリジョン > コリジョンプリセットをCustomにしてPawnをオーバーラップにします。
ノードを組む
テストのための簡単なノードを組みます。動作確認後に削除します。

イベント AnyDamageを配置。そこから線を伸ばしてGet Exp (メッセージ)を配置。その中のExpは15.0にします。ターゲットDamage Causerと繋ぐ。
この敵がダメージを受けるとダメージを与えた相手にExp15.0が入るわけです。

BP_Playerの編集

ノードを組む
これも動作確認後に削除します。

コンポーネントのCapsule Componentを選択し、詳細のOn Component Begin Overlapを+して配置。
線を伸ばしてApply Damageを配置。Other ActorとDamaged Actorを繋ぎ、Base Damageは10にします。
Damage Causerから線を伸ばしてSelfを配置。
ノードを組む

レベルが上がった時の処理の最後にPrint Stringを配置します。
これで敵に2回接触するとレベルが上がり、レベルアップ後の攻撃力の値が表示されます。

参考サイト

DataTableで作るレベルアップシステム – Qiita

コメント

タイトルとURLをコピーしました