CG関係の備忘録ブログ

主にZBRUSH、blender

UE5 ギミック

参考動画

Unreal Engine 5 | Blueprint For Beginners - YouTube

 

 

成果

www.youtube.com

 

ドアの開閉をつくる
BluePrintフォルダをつくりDoorフォルダをつくりBluePrintClass→Actor、名前をBP_Door
開いてコンポーネント追加、StaticMeshを選択
、名前をDoorFrame
StaticContentフォルダでRM→機能またはコンテンツパックを追加→コンテンツをクリック、StarterContentを選択しプロジェクトに追加ボタン(やらなくてもPropsフォルダ入ってた)
SM_DoorFrameをスタティックメッシュにドラッグアンドドロップ

コンポーネント追加、StaticMeshを選択
、名前をDoor
SM_Doorをスタティックメッシュに設定、位置をフレームに合わせる
コンパイル・セーブ

コンポーネント追加、BoxCollisionを選択、位置・スケールを調整
イベントグラフでデフォルトノード削除
詳細タブの↓イベントのOnComponentBeginOverlapの+をクリック、OtherActorから引っ張りCastToBP_ThirdPersonCharacterを選択、一番上から引っ張りEnableInputを選択
RM→GetPlayerContollerを選択、EnableInputのPlayerContollerにつなぐ

詳細タブの↓イベントのOnComponentEndOverlapの+をクリック、OtherActorから引っ張りCastToBP_ThirdPersonCharacterを選択、一番上から引っ張りDisableInputを選択
GetPlayerContollerからDisableInputのTargetにつなぐ

RM→インプット→キーボードイベントからEKEYを追加、Pressedから引っ張りFlipflopを選択
Doorメッシュをドラックして配置、引っ張りSetRelativeRotationを選択、Zを90に設定
FlipflopのAからSetRelativeRotationにつなぐ

DoorとSetRelativeRotationをコピペしてBにつなぎZを0に設定

ドアの開閉をなめらかに改善
FlipflopとSetRelativeRotationの接続を切って間にタイムラインを追加する(AddTimeline)を追加する
名前をDoorTimeline
ダブルクリックで開き、+トラックボタンを押してフロートトラックを追加する
RM→キーを追加(AddKey)、時間を0、値を0に設定
RM→キーを追加(AddKey)、時間を2、値を90に設定
長さを2秒に変更
キーを両方選択して、RM→自動にする
イベントグラフに戻り新規Track0とSetRelativeRotationのNewRotationをつなげないので、NewRotationから引っ張りMakeRotatorを選択、Zと新規Track0をつなぐ
DoorTimelineとSetRelativeRotationをつなぐ
FlipflopのBとDoorTimelineのReverseをつなぐ


CastToBP_ThirdPersonCharacterは重なったActorがサードパーソンかチェックし、そうであれば上のルート、そうでなければCastFailedのルートを通る

FlipflopはAまたはBを実行。eが押されたらAが実行され、もう一度押すとBが実行される

ドアをすり抜けていたが、SM_Doorの上のコリジョンボタンで適当に選択したらすり抜けなくなった

 

帽子をかぶる
HatフォルダでRM→ブループリントクラス→Actor
名前をBP_Hat
開いてコンポーネント追加、StaticMeshを選択
、名前をHat、スタティックメッシュにSM_Hatを選択
コンパイル・セーブ
コンポーネントの追加ボタンでsphereColligionを選択
Hatの子にして大きさを調整
イベントグラフでデフォルトノード削除
sphereを選択、詳細タブの↓イベントのOnComponentBeginOverlapの+をクリック、OtherActorから引っ張りCastToBP_ThirdPersonCharacterを選択、引っ張りEnableInputを選択、PlayerContollerから引っ張りGetPlayerContollerを選択

OnComponentEndOverlapの+をクリック、OtherActorから引っ張りCastToBP_ThirdPersonCharacterを選択、引っ張りDisableInputを選択
GetPlayerContollerからDisableInputのTargetにつなぐ

RM→インプット→キーボードイベントからEKEYを追加、Pressedから引っ張りFlipflopを選択

BP_ThirdParsonCharacterを開き、イベントを追加→カスタムイベントを追加、名前をEquipHat
コンポーネント追加、StaticMeshを選択
、名前をHatMesh(スタティックメッシュは設定しない)
HatMeshをドラッグして配置、引っ張りSetStaticMesh、EquipHatとつなぐ
NewMeshでSM_Hatを選択、NewMeshから引っ張りEquipHatにドラックするとつながる(なにやってるかわからん)

BP_Hatを開き、EKEYのCastToBP_ThirdPersonCharacterのAsBPThirdPersonCharacterから引っ張りEquipHatを選択
NewMeshでSM_Hatを選択
コンパイル・セーブ
レベルに配置し確認すると、帽子が腹につきささる

BP_ThirdParsonCharacterを開き、SetStaticMeshから引っ張りAttachComponentToComponent(HatMesh)を選択
コンポーネントのMesh(CharacterMesh0)をドラッグして配置、Parentに接続
SocketNameにHatSocket
LocationRole,RotationRule,ScaleRuleにSnapToTargetを選択

コンポーネントのMeshを選択、スケルタルメッシュをダブルクリックで開き、スケルトンタブを開く
ケルトンツリーでHeadボーンをRM→ソケットを追加
名前をHatSocketにする

ノードを範囲選択し、cでコメントを入力HatLogic

※ソケットはメッシュをアタッチするときに使う

コンパイル・セーブ
レベルに配置し確認すると、帽子のトランスフォーム調整が必要

スケルタルメッシュのHatSocketを選択
RM→プレビューアセットを追加→SM_Hatを選択
プレビュー専用となる
HatSocketのトランスフォームを調整し保存する

帽子をとったら消す
BP_Hatを開きEquipHatから引っ張りDestroyActor
コンパイル・セーブ

 

ダメージボックス
DamageBoxフォルダでRM→ブループリントクラス→Actor
名前をBP_DamageBox
開いてコンポーネント追加、BoxCollisionを選択、名前をDamageBox

DamageBoxを選択、詳細タブの↓イベントのOnComponentBeginOverlapの+をクリック、OtherActorから引っ張りCastToBP_ThirdPersonCharacterを選択、引っ張りEnableInputを選択、PlayerContollerから引っ張りGetPlayerContollerを選択

BP_ThirdParsonCharacterを開き、変数を追加
名前をHealth
コンパイル・セーブしデフォルト値を100

BP_DamageBoxを開き、CastToBP_ThirdPersonCharacterのAsThirdPersonCharacterから引っ張りGetHealthを選択
Healthから引っ張り-(Subtract)減算するを選択
AsThirdPersonCharacterから引っ張りSetHealthを選択
減算とHealthをつなぐ
CastToBP_ThirdPersonCharacterとSetHealthをつなぐ
SetHealthから引っ張りPrintString
Healthをつなぐ

コンポーネントのDamageBoxを選択、レンダリングのHiddenInGameのチェックをはずす
コンパイル・セーブ
テストし90が表示される

オーバーラップしなくなるまで減算しつづける
GetHealth以降を削除
AsThirdPersonCharacterを変数に昇格、引っ張りSetTimerbyEventを選択
Eventから引っ張りカスタムイベントを追加(AddCustomEvent)名前をDamagePlayer
引っ張りApplyDamageを選択
変数AsThirdPersonCharacterをドラッグして配置、Getを選択してDamageActorにつなぐ
BaseDamageを30にする

SetTimerbyEventのtimeを2にする(単位:秒)
Loopingにチェックを入れる

※SetTimerbyEventを使用すると特定のイベントを何度もループできる

BP_ThirdParsonCharacterを開き、
RM→イベント(EventAnyDamage)を追加
変数Healthをドラッグして配置、Getを選択
Healthから引っ張り減算を選択、EventAnyDamageのDamageを引く数につなぐ
Healthから引っ張りSetHealthを選択
EventAnyDamageとSetHealthをつなぐ
PrintStringでHealthを表示する

※ApplyDamageが実行されると、EventAnyDamageが呼び出される

プログレスバーを表示する
コンテンツブラウザでRM→ユーザーインターフェース→ウィジットブループリント
名前をHealthBar_W
開いてパレットのパネル→CanvasPanelをドラッグして配置
一般→ProgressBarを配置
スロット→アンカーから左下を選択
花びらみたいなのの1時方向のをつまんでProgressBarの右上角に合わせる。他も同様4角合わせる
コンパイル・セーブ
プログレスのPercentをドラッグすると、バーも変動する
〃のバインド→バインディングを作成
グラフをRM→GetOwningPlayerPawnを追加
ReturnValueから引っ張りCastToBP_ThirdPersonCharacterを選択GetPercentとつなぐ
CastToBP_ThirdPersonCharacterのAsBPThirdPersonCharacterから引っ張りGetHealthを選択
Healthをパーセントに変換するため引っ張り乗算する(Multi)を選択、下の数値を0.01にする。乗算結果をReturnNodeのReturnValueをつなぐ
CastToBP_ThirdPersonCharacterとReturnNodeをつなぐ

BP_ThirdParsonCharacterを開き、
RM→EventBeginPlayを追加、引っ張りユーザーインターフェース→ウィジットを作成(CreateW?)
Classを選択→HealthBar_W
OwningPlayerから引っ張りGetPlayerContollerを選択
ReturnValueから引っ張りAddToViewPortを選択
コンパイル・セーブ
テスト

タイマーのループを停止する
BP_DamageBoxを開き、OnComponentEndOverlapから引っ張りCastToBP_ThirdPersonCharacterを選択
ApplyDamageのReturnValueを変数に昇格
名前をTimerRef
変数TimerRefをドラッグして配置、Getして引っ張りClearandInvalidateTimerbyHandleを選択、CastToBP_ThirdPersonCharacterとつなぐ
コンパイル・セーブ

パーティクルを追加し映えさせる
BP_DamageBoxを開き、RM→EventBeginPlayを追加、引っ張りSpawnEmitterAtLocationを選択
RM→GetActorLocationを選択、引っ張りLocationにつなぐ
SpawnEmitterAtLocationのEmitterTemplateにパーティクルを指定する(P_ky_MagicCircle)
コンパイル・セーブ
表示テスト

DamageBoxを非表示
レンダリングのHiddenInGameをチェック