DataAssetで武器を拾ってみよう!
今回はDataAssetの使い方を学ぶべく
DataAssetの情報を応用して武器の取得と捨てるのをやります!
そもそもDataAssetがどういったものかよく分かっていない方は、
こちらの初心者向け情報を記載したのでこちらもご確認いただければと
※UE4.27で作成しています。
※サードパーソンテンプレートを使用しています。
※やり方などを紹介していますがこれが完璧な仕組みだ!
というわけではないので参考程度に見ていただければ幸いです。
実際に作成したものはこちらになります。
DataAssetを使用して武器を拾って装備して捨てるみたいなハクスラでありそうな動き作ってた。
— よしかた (@yoshikata_game) 2022年1月19日
正直GASと組み合わせて使ったりするのがいいと思うがそこまでは出来てません! #UE4 pic.twitter.com/rZmspaEi5E
各種素材やモデル情報について
モデルについては下記のマケプレを使用しています。
※UE4.27には対応していないので過去バージョンのプロジェクトに入れた後、
プロジェクトをアップデートして移行して使用してます。
武器を拾うインプットの設定
武器を拾うためのアクション用インプットがないので、
まずはプロジェクト設定のインプットからアクションを設定します。
今回はTキーでピックアップして、Yキーでドロップします。
拾う処理と武器BPの作成
実際に拾う処理を作成していきます。
まずは拾うアニメーションをキャラクターの操作に入れていきます。
今回もAnimationBPから設定します。
下記リンクの「アニメグラフの編集とアニメーションBP編集」と同じ設定をしてます。
続いて武器のBPですがDataAsset用のBPとDataAssetを作成します。
今回はこんな感じで設定しています。
実際に設定したDataAssetは以下になります。
※各パラメーターは武器を拾ったり捨てたりするタイミングで使用します。
設定が完了したら武器用のBPを作成します。
コンポーネントはSkeletalMeshとBoxCollisionを用意します。
その他に関数を一つ用意されていますがこちらは、
武器を装備する際に武器モデルに物理処理を消すSetPhysicsOffを作成してます。
変数としては以下を用意しています。
WeaponCollision → 武器を拾える範囲のコリジョン
WeaponMesh → 武器のモデル
BP_GunParam → DataAsset用の情報BP
Character → 武器をアタッチするThirdPersonCharacterBP
下記はBeginPlay時の処理になります。
〇処理の流れについて〇
1.武器を拾える範囲を指定
2.武器のモデルをセット
3.物理を機能させるかのフラグをセット
下記は実際にキャラクターが武器を拾う処理になります。
〇処理の流れについて〇
1.BeginOverlapしたのがキャラクターの場合武器を拾うアクションを許可する。
※逆にその範囲内に入っていない場合はEnableInputをOFFにして入力を受けない。
2.もし許可されている場合はキャラクターのほうで用意されている装備処理を行う。
武器を拾う際に武器の物理を消す関数を用意しています。
〇処理の流れについて〇
1.武器を拾える範囲のコリジョンを削除する。
2.SimulatePhysicsをOFFにしてCollisionEnableをNocollisionに変更する。
武器側の処理のプログラムはこちらで完了です。
今度は拾う側のキャラクター側の処理を行います。
キャラクターのほうでも変数とマクロを設定しています。
◆作成したマクロ◆
GetDropLocation → 武器を落とす位置情報を生成するマクロ
NextEquip → 次に装備する武器の情報を生成するマクロ
◆作成した変数◆
EquipWeapon → どの系統の武器を装備しているかチェックしているフラグ配列変数
EquipWeaponModel → 武器のモデルを整数値をキーにしたマップ変数
WeponWidget → 武器情報が載ってるUMG
isPickup? → 拾っているアニメーションのON.OFFフラグ
EquipWeaponType → どのタイプの武器しているか保持する変数
最初の処理としてUMG用の変数WeponWidgetをBeginPlayで設置します。
武器を拾う処理ですが少し長いので画像を2つにしてます。
〇処理の流れについて〇
1.武器を持っているかEquipWeaponフラグの配列からチェック。
2.持ってなければフラグをONにして拾うアニメーションを実施。
3.先ほど紹介した武器の物理を削除する関数(SetPhysicsOFF)を呼び出して物理OFF
4.装備するモデルをEquipWeaponModelに保持するため追加する。
5.武器表示のUMGを更新してキャラクターのソケットにアタッチする。
※アタッチするソケット名は武器のAssetDataのEquipSocketと同じにします。
※UMGの関数の説明は「拾った後のUMGの変更と武器を捨てる処理」で説明します。
ソケットについてはThirdPersonCharacterのボーンに設定します。
以上が武器を拾ったときの処理の流れになります。
拾った後のUMGの変更と武器を捨てる処理
続いてUMGの処理になります。
今回はVerticalBoxに武器名・武器画像・武器の弾数を縦に表示する形で作成してます。
処理としてはカスタムイベントを作成して各パーツの情報をセットします。
※武器を拾った際の処理(DataAssetの武器情報をセット)
※武器を捨てた際の処理(武器を装備してるか確認してDataAssetの武器情報をセット)
UMGの説明も完了したので実際にあれをする時間になります。
〇処理の流れについて〇
1.武器を持っているかEquipWeaponフラグとモデル情報をチェック
2.持っている場合はEquipWeaponフラグをOFFにして、Dettachでモデルを削除
3.削除した武器のタイプを元に武器をSpawnする(これが落としたモデルになる。)
※GetDropLocationマクロで位置を指定しています。
4.NextEquipマクロで次に装備するための武器を選択します。
最後にGetDropLocationのマクロとNextEquipのマクロについて説明します。
GetDropLocationは向いている方向と自分の位置を計算したその位置を返しています。
NextEquipはForEachLoopでどの武器を持っているかチェックして、
次にセットする武器を配列のインデックスで指定しています。
以上がDataAssetを用いた武器の取得と捨てる動作の実装でした。
最後に
DataAsset応用編は以上になります。
20分ぐらいで考えたロジックなので穴とか拡張性ほぼ皆無ですが、
まあ私ならこうするとかあってもいいのかなと思ったので書きました!