見出し画像

UE5で物を拾って装備する手順メモ

参考動画 174 / ichinanayonチャンネル さん

この記事の内容はこちらの動画を視聴しながら前半部分をメモったものです。後半のアニメーション部分の実装や武器の切り替えの学習をしたい方を知りたい方はご視聴をお勧めします。


Itemの基底クラスBP_Item

拾えるものをItemと名付ける。

SkeletalMeshコンポーネントを追加

親となるBP_ItemブループリントをActorで作成。
BP_Itemを開いてComponentsにSkeletalMeshコンポーネントを追加

AddでSkeletal Mesh追加

追加をしたらItemMeshCompにリネーム

追加後にItemMeshCompにRename

Construction Script を設定

Set Skeletal Mesh Assetを設定


Construction ScriptでItemMeshCompノードを設置
ItemMeshCompノードから Set Skeletal Meshノードを作成
Set Skeletal MeshノードのNew Meshを変数にする
->New Meshからエッジを引っ張ってPromote to variableとする。

NewMeshをPromote to variable

作った変数の名前をItemMeshにする。理由は固定にしてしまうと固定のItemだけしか装備できなくなるため。変数の値を変えることでItemのチェンジが可能になる。

Set Skeletal Mesh Assetに接続されているノード

ItemMesh変数のDetailsからCategoryを Item Context|Mesh にする。
Categoryはパイプで分けることによりネストさせることができる。

CatetoryにItem Context | Meshを追加
ネストされてる状態

Set Materialを設定

Item Mesh Compを設置
Item Mesh Compからエッジを引っ張ってSet Materialノードを作成
Set MaterrialノードのMaterialをPromoto to variableで変数にする
変数名はItemMaterialにリネーム
CategoryはItemContext|Mesh 。VARIABLESの一覧からドラッグして移動できるのでDetailsから入れる必要は特になし。うまくできなかったらItemMeshのCategoryと同じものをDetailsから入れる

Set Materialを設定
VARIABLESでItemMaterialの位置を同じにしておく

銃の3Dメッシュを用意する

マーケットプレイスにある Lyra Starter Game を使ってプロジェクトを作成。
Contents/Weapons/Pistol/Mesh/ フォルダにMeshがあるので全選択をして
Asset Actions -> Bulk Export

Bulk Export

BulkExportをするとダイアログが出てくる。デフォルトでExport All

BulkExport字のダイアログ


Export Source Meshにチェックされてないがチェックしなくていいの?

✨Export Source Meshにチェックを入れると

  1. 元の高解像度メッシュデータがエクスポートされる。

  2. 編集や再利用のために、より詳細なジオメトリ情報が保持され。

  3. ファイルサイズが大きくなる可能性があある。

✨チェックが入っていない場合

  1. UEで最適化されたメッシュデータのみがエクスポートされる。

  2. ファイルサイズが小さくなり、エクスポート処理が速くなる。

  3. ゲームエンジンでの使用に最適化されたデータが得られる。

エクスポートされたファイル

4ファイルです。SK_Pistol.FBXを元のプロジェクトでimportして使う。

Export Files

importするとピストルのSkeleton Meshが手に入るのでそれを使う。Materialは好きなものを使うと良い。

Import Files

BP_Itemの子クラス

BP_ItemからCreate Child Blueprint Classを作り名前をBP_Pistolにする。
BP_Pistolを開いてClass DefaultsからItemMeshにSK_Pistolをセット。
ItemMaterialは好きなものを。

SK_Pistol

Viewportで見るとこんな感じに

GoldPistol

Class DefaultsでアタッチするSlot Nameを設定

weapon_r
をAttached Socket Nameにいれる。
TransformカテゴリもAttachSocketNameも前に名付けた任意の名前なので注意。

AttachedSocketName

weapon_rはSKM_QuinnのSkeletal Meshから。ThirdPersonだと以下のパスにファイルがある。
\Content\Characters\Mannequins\Meshes\SKM_Quinn

weapon_r


BP_ItemのEvent Graphを実装

装備イベントの作成

BP_Item->Event Graph -> カスタムイベントを作成 -> OnEquippedと名付ける。装備イベント。

キャラクターのSkeletalMeshComponetにアイテムのSkeletalMeshComponentをアタッチするように実装していく。

カスタムイベントのInputsにOwnerを追加。型はCharacter。
Pass-by-Referenceにチェック
Pass-by-Referenceが何か分からなかったのでClaudeに聞いてみた。

Pass-by-Referenceオプションは、関数やイベントにパラメータを渡す際の方法を指定するものです。このオプションについて詳しく説明します:Pass-by-Referenceとは:
このオプションを選択すると、パラメータの参照(メモリ上の位置)が渡されます。これにより、関数内でパラメータの値を直接変更できるようになります。
Pass-by-Valueとの違い:
チェックを外すと、Pass-by-Value(値渡し)になります。この場合、パラメータの値のコピーが渡されるため、関数内での変更は呼び出し元に影響しません。
Characterタイプでの使用:
Characterのような複雑なオブジェクトタイプでは、通常Pass-by-Referenceが推奨されます。これにより、不要なコピーを避け、パフォーマンスが向上します。
メリット:
メモリ効率が良い(大きなオブジェクトのコピーを避けられる)
関数内での変更が呼び出し元に反映される
注意点:
意図しない変更を引き起こす可能性があるため、慎重に使用する必要があります。

OnEquippedイベントでOwnerパラメータをPass-by-Referenceで渡すことで、イベント内でCharacterの状態を直接変更できるようになります。これは装備状態の変更などに有用です。ただし、変更が意図したものであることを確認し、副作用に注意する必要があります。

Claude 3.5 Sonnet

チェックを付けたら参照渡しになるっぽい。当然チェック。

Chacterは使いまわせるように変数にする。
OnEquippedをPromote to variableで変数にする。

Owner変数

OwnerCharacterからGet MeshでSkeletalMeshComponentを付けとる

Get Mesh ノード
Get Meshノードと接続

Get MeshノードのMeshもPromote to variableで変数にする。
変数名はOwner Mesh Comp。

OwnerMeshComp

ItemMeshCompをドラッグしてノードとして設置。
ピンからエッジを引っ張ってAttach Component To Componentノードを作成

Attach Component To Component

ParentにOnwer Mesh Compノードを接続。
Socket Name を Promote to variableで変数にする。
名前はAttached Socket Name。CategoryにTransformを入力。
Location Rule, Rotation Rule, Scale Rule, はすべてSnap to Targetにする。

AttachComponentToComponentノード設定

キーを押して装備

装備イベントは準備できたのでイベントを呼び出すための処理を実装する。

BP_ThirdPersonCharacterをプレイヤーキャラクタにしているので開く。
Event GraphでF Keyノードを追加

F Key
F Key Node

F Key ノードのPressed ピンからエッジを引っ張って Spawn Actorノードを作成

Spawn Actor from Class

ClassにBP Pistolを設定
Spawn TransformをSplit Struct pingで分割
戻り値から On Equippedイベントを呼び出す
On EquippedノードのOwnerはself

SpawnActor


この記事が気に入ったらサポートをしてみませんか?