ALSV4 カメラがオブジェクトをすり抜けてしまう問題の修正

最近ALSV4(AdvancedLocomotionSystemV4)を触ることが多いので

学んだことなどを紹介していきます。

f:id:Free_Gamer:20210725205438j:plain

 

今回は

 

カメラがオブジェクトをすり抜けてしまう問題を解決する方法を紹介します。

 

~目次~

カメラのすり抜け問題とは??

ALSV4をそれなりに触ったことある人なら

遭遇したことのある問題かもしれません。

youtu.be

このように、意図せずしてカメラがオブジェクトをすり抜けてしまいます。

これを解消するにはどうすればいいのか??

 

なぜすり抜ける??

「ALS_PlayerCameraManager」を開きます。

この「ALS_PlayerCameraManager」で

カメラのコリジョン判定が行われているようです。

f:id:Free_Gamer:20210725210927j:plain

 

「ALS_PlayerCameraManager」を開くと

以下のイベントグラフが表示されると思います。

f:id:Free_Gamer:20210725211154p:plain

このイベントグラフの中に

以下の赤枠で囲んである部分が、カメラのコリジョン判定の処理です。

Sphereトレースを使って、カメラのコリジョン判定を行っています。

f:id:Free_Gamer:20210725211600j:plain

このトレースのHitResultの

「InitialOverlap」がTrueになってると、カメラがオブジェクトをすり抜けるようになってます。

f:id:Free_Gamer:20210725211841p:plain

InitialOverlapがTrueになってる状態というのは

以下のような状態です。

「Tキー」で、カメラのトレースを可視化できます。

f:id:Free_Gamer:20210725212110p:plain

逆に、InitialOverlapがFalseの状態というのは

以下のような感じです。

f:id:Free_Gamer:20210725212304p:plain

違いが分かりましたかね??(語彙力が無いのでうまく説明出来てないかもサーセン

 

つまり

 

カメラのトレースの

InitialOverlapをTrueにさせなければ

意図せずカメラがすり抜けるのを

防ぐことが出来る。

 

という事です。^^

 

カメラのすり抜け問題の解決方法

SkeletalMeshの編集

「ALS_Mannequin_Skeleton」を開きます。

f:id:Free_Gamer:20210725212850j:plain

ケルトンツリー内に

「TP_CameraTrace_L」

「TP_CameraTrace_R」

というソケットがあります。

これは、カメラのトレースの始点位置です。

f:id:Free_Gamer:20210725213044j:plain

「TP_CameraTrace_L」は、カメラがキャラの左斜め後ろにあるとき

トレースはこのソケットの位置から飛ばされます。

f:id:Free_Gamer:20210725213947j:plain

「TP_CameraTrace_R」は、カメラがキャラの右斜め後ろにあるとき

トレースはこのソケットの位置から飛ばされます。

f:id:Free_Gamer:20210725213957j:plain

この

「TP_CameraTrace_L」

「TP_CameraTrace_R」

の位置を、XYZ全て「0」にしましょう。

f:id:Free_Gamer:20210725214407j:plain

すると、ソケットの位置が

キャラの頭の位置に戻るはずです。

f:id:Free_Gamer:20210725214439j:plain

 

トレースRadiusの調整

「ALS_AnimMan_CharacterBP」を開きます。

f:id:Free_Gamer:20210725214646j:plain

「BPI_Get_3P_TraceParams」関数を開きます。

この関数で、トレースの設定をしています。

f:id:Free_Gamer:20210725215131j:plain

f:id:Free_Gamer:20210725215149p:plain

TraceRadiusを「5」にしましょう。

f:id:Free_Gamer:20210725215353j:plain

これで、完了です!

 

実際にプレイ!

youtu.be

カメラが意図せずして、オブジェクトをすり抜けることが無くなりました!

ALSV4をこれから使う人などのお役に立てれば幸いです!

 

それではまた!^^ノシ

ラグドールから立ち上がる方法!

f:id:Free_Gamer:20210628180024p:plain

「MovementAnimsetPro」の起き上がりアニメーションを使った

ラグドールから起き上がる処理を紹介します。

 

~目次~

 

アセットの追加

 まずは、「MovementAnimsetPro」をプロジェクトに追加します。

f:id:Free_Gamer:20210628180257p:plain

 

リターゲット

 「MovementAnimsetPro」フォルダ内にある「Mesh」フォルダの中の

UE4_Mannequin_Skeleton」を開きます。

f:id:Free_Gamer:20210628181048p:plain

リグを「Humanoid」にし、下にある「ポーズを変更」をクリックし

「現在のポーズを使用する」を選択します。

f:id:Free_Gamer:20210628181309p:plain

次に、サードパーソンのボーンも同じ設定にしていきます。

「Mannequin」フォルダ内にある「Mesh」フォルダ内の

UE4_Mannequin_Skeleton」を開きます。

f:id:Free_Gamer:20210628181731p:plain

リグを「Humanoid」にします。

f:id:Free_Gamer:20210628181839p:plain

「MovementAnimsetPro」フォルダ内にある「RootMotion」フォルダにある

「GetUpFromBack」と「GetUpFromFace」を選択し、右クリックします。

「Animアセットとリターゲットを複製する」を選択しましょう。

f:id:Free_Gamer:20210628182132p:plain

UE4_Mannequin_Skeleton」を選択し、リターゲットしましょう。

f:id:Free_Gamer:20210628182315p:plain

コンテンツブラウザ内に、「UE4_Mannequin_Skeleton」でリターゲットされたアニメーションがあるはずです。

f:id:Free_Gamer:20210628182537p:plain

 

Montageの作成 

「GetUpFromBack」と「GetUpFromFace」で、AnimMontageを作成します。

f:id:Free_Gamer:20210628184008p:plain

これで、ラグドールから起き上がる為のAnimMontageが作成できました。

f:id:Free_Gamer:20210628184313p:plain

 作成したMontageを開いて、BlendInのBlendTimeを「0」にします。

f:id:Free_Gamer:20210629175513p:plain

 

BPインターフェースを作成

BPI_AnimBP

AnimBP用のBPインターフェース「BPI_AnimBP」を作成します。

f:id:Free_Gamer:20210629175903p:plain

開いて、「SetRagdoll」イベントを作成します。

f:id:Free_Gamer:20210629180036p:plain

Bool型のインプットピンを追加します。

f:id:Free_Gamer:20210629180105p:plain

BPI_Character

CharacterBP用のBPインターフェース「BPI_Character」を作成しましょう。

f:id:Free_Gamer:20210629211313p:plain

「BPI_Character」を開き、「IsGetUp??」イベントを作成します。

f:id:Free_Gamer:20210629211433p:plain

Bool型のインプットピンを追加します。

f:id:Free_Gamer:20210629211456p:plain

 

ThirdPersonCharacter

「ThirdPersonCharacter」を開きます。

f:id:Free_Gamer:20210629175611p:plain

BPインターフェースの追加

作成したBPインターフェース「BPI_Character」を追加します。

f:id:Free_Gamer:20210630185404p:plain

変数の作成

変数を作成します。

f:id:Free_Gamer:20210629211657p:plain

Ragdoll

デフォルト値「False」

Trueの場合、ラグドール化してる。

Falseの場合、ラグドール化してない。

~PelvisBone~

デフォルト値「Pelvis」

~RagdollLocation~

Pelvisの位置を示す変数。

~RagdollRotation~

Pelvisの向きを示す変数。

~RagdollFaceUp~

Trueの場合、仰向け。

Falseの場合、うつ伏せ。

~RagdollOnGround~

Trueの場合、地面についてる。

Falseの場合、空中。地面についてない。

~GetUp~

Trueの場合、起き上がりモーション中。

Falseの場合、起き上がりモーション中ではない。

ラグドール処理の作成

「Q」キーを押した時、

カスタムイベント「EnabledRagdoll」と「DisabledRagdoll」を呼び出す。

「EnabledRagdoll」は、ラグドール化する為の処理。

「DisabledRagdoll」は、ラグドールを解除する処理です。

f:id:Free_Gamer:20210629180443p:plain

EnabledRagdoll

カスタムイベント「EnabledRagdoll」の処理です。

Sequenceノードで、順番に処理を行ってます。

f:id:Free_Gamer:20210629180259p:plain

Then0

f:id:Free_Gamer:20210629182227p:plain

Then1

f:id:Free_Gamer:20210629182501p:plain

Then2

f:id:Free_Gamer:20210629182515p:plain

Then3

f:id:Free_Gamer:20210629182527p:plain

EventTick

ラグドール中の場合、CapsuleComponentの位置と向きを調整するカスタムイベント「SetCapsuleLocationAndRotation」を呼び出す。

f:id:Free_Gamer:20210629182926p:plain

SetCapsuleLocationAndRotation

Sequenceノードで、処理を順番に実行してます。

f:id:Free_Gamer:20210629183136p:plain

Then0

f:id:Free_Gamer:20210629183339p:plain

Then1

f:id:Free_Gamer:20210629183354p:plain

Then2

f:id:Free_Gamer:20210629183405p:plain

トレースを地面に向かって飛ばす。

f:id:Free_Gamer:20210629183649p:plain

CapsuleComponentの位置と向きを調整。

f:id:Free_Gamer:20210629183711p:plain

DisabledRagdoll

ラグドール状態から起き上がるカスタムイベント「DisabledRagdoll」の処理です。

Sequenceノードで、順番に処理を実行してます。

f:id:Free_Gamer:20210629184205p:plain

Then0

SnapshotNameを「RagdollPose」に設定します。

f:id:Free_Gamer:20210629184614p:plain

Then1

f:id:Free_Gamer:20210629184629p:plain

Then2

RagdollFaceUp変数がTrueの時は、仰向けから起き上がるモンタージュ

Falseの時は、うつ伏せから起き上がるモンタージュを再生するようにしています。

f:id:Free_Gamer:20210629184642p:plain

Then3

f:id:Free_Gamer:20210629184653p:plain

Then4

f:id:Free_Gamer:20210629184706p:plain

イベント「IsGetUp??」の追加

ラグドール状態からの起き上がりアニメーション中は、GetUp変数はTrueになります。

このイベントは、AnimNotifyStateから受け取るイベントになります。

f:id:Free_Gamer:20210630172842p:plain

起き上がりアニメーション中は、ジャンプが出来ないようにします。

f:id:Free_Gamer:20210630172944p:plain

 

AnimBP

「ThirdPerson_AnimBP」を開きます。

f:id:Free_Gamer:20210629185053p:plain

BPインターフェースの追加

作成したBPインターフェース「BPI_AnimBP」を追加します。

f:id:Free_Gamer:20210629185211p:plain

イベント「SetRagdoll」の追加

BPI_AnimBPで作成したイベント「SetRagdoll」をイベントグラフに追加し

Ragdollピンを変数へ昇格します。

f:id:Free_Gamer:20210629185351p:plain

Animグラフ

新規のステートマシーン「Ragdoll」を作成し

Ragdoll変数を繋いだ「ブレンドPosesByBool」ノードで処理の分岐を行います。

ステートマシーン「Default」がFalse。

ステートマシーン「Ragdoll」がTrueです。

Trueブレンド時間と、Falseブレンド時間は「0.5」です。

f:id:Free_Gamer:20210629185659p:plain

ステートマシーン「Default」

ステート「Idle/Run」を開きます。

f:id:Free_Gamer:20210629190013p:plain

スロットノードを追加します。

これでモンタージュが再生されるようになりました。

f:id:Free_Gamer:20210629190151p:plain

ステートマシーン「Ragdoll

ステートマシーン「Ragdoll」を開き

ステートを2つ追加します。

「Entry」と「RagdollPoseSnapShot」をお互い線で繋ぎましょう。

f:id:Free_Gamer:20210629190334p:plain

2つのトランジションルールを選択し、

f:id:Free_Gamer:20210629190723p:plain

詳細パネルのブレンド設定項目にある「継続時間」の値を「0」にします。

f:id:Free_Gamer:20210629190709p:plain

EntryからRagdollPoseSnapShotのトランジションルール

RagdollがFalseになったら、RagdollPoseSnapShotへ遷移します。

つまり、ラグドールから起き上がる時に、RagdollPoseSnapShotへ遷移するという意味です。

f:id:Free_Gamer:20210629191124p:plain

RagdollPoseSnapShotからEntryのトランジションルール

RagdollがTrueの時にEntryへ遷移します。

つまり、ラグドール化した時に、Entryに遷移するという意味です。

f:id:Free_Gamer:20210629191254p:plain

ステート「RagdollPoseSnapShot」

ステート「RagdollPoseSnapShot」を開きます。

f:id:Free_Gamer:20210629191407p:plain

ポーズスナップショットノードを追加します。

SnapshotNameを「RagdollPose」に設定します。

f:id:Free_Gamer:20210629191356p:plain

 

AnimNotifyStateの作成

AnimNotifyState「GetUp_AnimNotifyState」を作成します。

f:id:Free_Gamer:20210629212649p:plain

Received_NotifyBeginとReceived_NotifyEndを追加します。

変数は「GetUp」という名の編集可能にしたBool型変数を追加します。

f:id:Free_Gamer:20210629213053p:plain

Received_NotifyBegin

f:id:Free_Gamer:20210629214144p:plain

Received_NotifyEnd

f:id:Free_Gamer:20210629215606p:plain

 

AnimNotifyStateをMontageに追加

起き上がりアニメーションMontage「GetUpFromBack」と「GetUpFromFace」を開き

通知のところに、作成したAnimNotifyState「GetUp_AnimNotifyState」を追加します。

起き上がり始めてから、起き上がった瞬間まで、通知を伸ばしています。

f:id:Free_Gamer:20210630173308p:plain

追加した「GetUp_AnimNotifyState」を選択し、詳細パネルにある

GetUpにチェックをつけ、Trueにします。

f:id:Free_Gamer:20210630173456p:plain

 

実際にプレイ!けど・・・

実際にプレイしてみましょう!

youtu.be

何か変ですよね。

ラグドールは良いんですが、そこから起き上がる時

キャラが横に倒れたまんま起き上がりアニメーションをして、色々おかしなことになっています。修正しましょう。

 

物理アセットの編集

「SK_Mannequin_PhysicsAsset」を開きます。

f:id:Free_Gamer:20210630174917p:plain

ケルトンツリーのオプション内にある

「すべてのボーンを表示」を選択します。

f:id:Free_Gamer:20210630180924p:plain

Rootボーンを選択し、右クリックして

球形を追加します。

f:id:Free_Gamer:20210630181056p:plain

Rootボーンに、球形のボディが追加されました。

f:id:Free_Gamer:20210630181304p:plain

追加したボディを選択し、詳細パネルの設定をします。

「PhysicsType」を「Kinematic」

「CollisionReponse」を「Disabled」

f:id:Free_Gamer:20210630182945p:plain

Spheresの半径を「7.5」にします。

f:id:Free_Gamer:20210630183357p:plain

追加したボディを選択し、コンストレイントから「Pelvis」を選択します。

f:id:Free_Gamer:20210630183815p:plain

追加したコンストレイントを選択し

f:id:Free_Gamer:20210630184254p:plain

詳細パネルの「LinearLimits」の

「XMotion」「YMotion」「ZMotion」を全部「Free」にします。

f:id:Free_Gamer:20210630184353p:plain

 

改めて実際にプレイ!

改めて実際にプレイしてみましょう!

youtu.be

今度は、しっかりラグドール状態から起き上がってくれました!

 

それではまた!^^ノシ

カメラを瞬時に真後ろに向ける処理

 今回はカメラを瞬時に真後ろに向ける方法を紹介します。

 

 

~変数~

TargetRotator・・・カメラの真後ろ方向を格納する変数

RotateCamera_TimeHandle・・・タイマー変数。

CameraTurn・・・カメラ回転中はTrue。

f:id:Free_Gamer:20210323004753p:plain

 

~カメラ操作処理~

CameraTurnがFalse、つまり

カメラ回転中じゃない場合は、自由にカメラ操作が行えます。

カメラ回転中は、カメラ操作を不能にします。

f:id:Free_Gamer:20210323004840p:plain

 

~カメラ回転処理~

f:id:Free_Gamer:20210323004908p:plain

 

マウスを右クリックした時、CameraTurnをTrueにします。

カメラの回転を連続で出来ないようにしています。

f:id:Free_Gamer:20210323004927p:plain

 

カメラの真後ろ方向を格納します。

f:id:Free_Gamer:20210323000740p:plain

 

タイマーイベントを呼び出します。

f:id:Free_Gamer:20210322233402p:plain

 

RotateCameraという名のタイマーイベントです。

f:id:Free_Gamer:20210322235652p:plain

 

現在のカメラの向きを、プレイヤーの真後ろ方向「TargetRotator」に向けます。

InterpSpeedでカメラの回転速度を調整できます。

値が小さい程、回転が遅いです。

値が大きい程、回転が速いです。

ただし、値が「0」の場合は回転しないので注意してください。

f:id:Free_Gamer:20210322233705p:plain

 

RInterpToで返された値が「TargetRotator」と同等か判定します。

f:id:Free_Gamer:20210322235716p:plain

 

Falseだった場合、つまり「TargetRotator」とカメラの向きの値が同等ではない場合

「SetControlRotation」ノードで、カメラを回転し続けます。

「SetControlRotation」のNewRotationには、RInterpToの返り値を渡してあります。

f:id:Free_Gamer:20210322234229p:plain

 

Trueだった場合、つまり「TargetRotator」とカメラの向きの値が同等だった場合

「CameraTurn」変数をFalseにし、タイマーを止めます。

これで、カメラの回転が止まります。

f:id:Free_Gamer:20210323005011p:plain

 

これで完了です。

それではプレイしてみましょう。

 

youtu.be

 

右クリックした時に、カメラが真後ろに回転していると思います。

 

終わりー

 

それではまた~^^ノシ

血の作成~地面や壁に血をつける方法~

今回はこちらのアセットを使用して

f:id:Free_Gamer:20210223184428p:plain

血のデカールを地面や壁につける処理を紹介します。

 

確かそこまで高くなかったような気がするので(500円ぐらいだったかな)

1000円あれば余裕で買えると思います。

 

このアセットは、地面用と壁用の血のデカールが入ってるので

グロ表現にこだわりたい僕からしたら、お気に入りのアセットです^^

 

 

~血の作成~

血のデカール用のアクター「BP_BloodDecal」を作成します。

f:id:Free_Gamer:20210223172646p:plain

 

コンポーネントは以下の通り。

f:id:Free_Gamer:20210223173455p:plain

 

DecalのXの角度を「90」にします。

f:id:Free_Gamer:20210223173542p:plain

 

デカールのXのサイズを、「5」にします。

f:id:Free_Gamer:20210223173626p:plain

 

コンストラクションスクリプトに、以下の処理を作成します。

配列変数「BloodDecal」からランダムで、デカールをセットします。

f:id:Free_Gamer:20210223172842p:plain

 

「BP_BloodDecal」の子クラスを作成します。

・「BP_FloorBlood」(地面用の血のデカール

・「BP_WallBlood」(壁用の血のデカール

f:id:Free_Gamer:20210223173007p:plain

 

この2つのBPを開き、配列変数「BloodDecal」にデカールをセットします。

 

「BP_FloorBlood」

f:id:Free_Gamer:20210223185420p:plain

 

「BP_WallBlood」

f:id:Free_Gamer:20210223185448p:plain

 

血の作成はこれで以上です。

 

 

~トレースチャンネルの作成~

プロジェクト設定のコリジョン設定で

「Trace」というTraceChannelを作成します。

f:id:Free_Gamer:20210223174901p:plain

 

「Trace」のデフォルト応答は「Block」にします。

f:id:Free_Gamer:20210223175012p:plain

 

 

コリジョンの編集~

Preset項目内の、「Pawn」と「CharacterMesh」のプロファイルを編集します。

f:id:Free_Gamer:20210223175234p:plain

 

「Pawn」の「Trace」応答を「無視する」に設定。

f:id:Free_Gamer:20210223175057p:plain

 

「CharacterMesh」の「Trace」応答を「ブロック」に設定。

f:id:Free_Gamer:20210223175401p:plain

 

コリジョンの編集は以上です。

 

 

~ダメージを与える側の作成~

「ThirdPersonCharacter」を開き、FPS視点にしたいので

SpringArmの位置を頭に持っていき、SpringArmの長さを「0」にしています。

Meshは、HiddenInGameをTrueにして非表示にしてあります。

f:id:Free_Gamer:20210223174320p:plain

 

カメラの位置から、前方に向けて「5000」の距離に飛ばしています。

トレースが当たったものにダメージを与えるといった感じです。

トレースのTraceChannelは「Trace」という自作TraceChannelにしてあります。

f:id:Free_Gamer:20210223174653p:plain

 

ちなみに、「ApplyPointDamage」のBaseDamageが「0」だった場合

ダメージを受ける側が持っているイベント「PointDamage」が呼び出されません。

なので、イベント「PointDamage」を呼び出したい場合は

「ApplyPointDamage」のBaseDamageには「0」以上の値を入れましょう。

 

 

~ダメージを受ける側の作成~

ダメージを受ける側のキャラ「BP_Enemy」を作成。

f:id:Free_Gamer:20210223164831p:plain

イベントグラフは以下の通り。

f:id:Free_Gamer:20210223182242p:plain


ダメージを受けた時、HitLocationとHitNormalの値を格納。

後に血のデカールをスポーンさせるイベントを呼び出す。

f:id:Free_Gamer:20210223171031p:plain

 

地面に血のデカールをスポーンさせる処理です。

ダメージを受けたキャラの足元に

自作関数「FindSpawnDecalPoint」で足元にトレースを飛ばし

地面を検知したら血のデカールをスポーンさせるという感じです。

変数「Z_TraceLength」の値は「150」にしてあります。

f:id:Free_Gamer:20210223182304p:plain


「FindSpawnDecalPoint」関数の中身は以下の通り。

f:id:Free_Gamer:20210223182325p:plain


壁に血のデカールをスポーンさせる処理です。

f:id:Free_Gamer:20210223182345p:plain


「FindSpawnDecalPoint」関数でトレースを飛ばし、壁を検知します。

変数「TraceLength」の値は「500」にしてあります。

自作純粋関数「SetVectorVariation」で、血のデカールをスポーンさせる位置に

ばらつきを持たせます。

変数「Min」の値は「‐90」、変数「Max」の値は「90」にしてあります。

f:id:Free_Gamer:20210223182509p:plain


「SetVectorVariation」純粋関数の中身は以下の通り。

f:id:Free_Gamer:20210223172325p:plain

 

トレースがヒットした際、ヒットしたオブジェクトの角度が

指定した角度よりも大きい場合は、血のデカールをスポーンさせます。

画像で言うと、トレースがヒットしたオブジェクトの角度が

「40度」以上だった場合に、血のデカールをスポーンさせる

といった感じです。

f:id:Free_Gamer:20210223182625p:plain



実際にプレイしてみましょう。

youtu.be

 

動画のようにできていればOKです。

 

最近、ゲームは血が出てりゃあ

何でも面白いんじゃないかと思い始めてます。

 

それではまた^^ノシ

 

 

ブラックホールの作り方!

近くにあるメッシュやキャラクターを吸引する

ブラックホールの作成方法を紹介します。

 

ブラックホールを作成~

「BP_BlackHole」という名のアクターを作成。

f:id:Free_Gamer:20210209120038p:plain

適当にSphereコンポーネントを追加。

f:id:Free_Gamer:20210209120309p:plain

 

~BPインターフェースの作成~

「BPI_Character」という名のBPインターフェースを作成します。

f:id:Free_Gamer:20210209120810p:plain

「BPI_Character」を開き

「SetRagdoll」という名のイベントを作成します。

f:id:Free_Gamer:20210209121013p:plain

 

NPCの作成~

「BP_Enemy」という名のキャラクターを作成します。

f:id:Free_Gamer:20210209120433p:plain

普通にキャラクターメッシュを追加します。

f:id:Free_Gamer:20210209120541p:plain

「BPI_Character」BPインターフェースを追加します。

f:id:Free_Gamer:20210209121054p:plain

イベントグラフに以下の処理を作成します。

f:id:Free_Gamer:20210209121224p:plain

 

~「BP_BlackHole」の処理~

「BP_BlackHole」のイベントグラフに以下の処理を作成します。

f:id:Free_Gamer:20210209121337p:plain

変数は以下の通りです。

f:id:Free_Gamer:20210209121651p:plain

Radius・・・値が大きい程吸引範囲が広がる。デフォルト値は「700」

Strength・・・値が大きい程吸引強度が強くなる。お好みの値で。

f:id:Free_Gamer:20210209121548p:plain

f:id:Free_Gamer:20210209121855p:plain

f:id:Free_Gamer:20210209121904p:plain

 

「BP_BlackHole」をレベルに配置して、その近くに

・SimulatePhysicsがTrueになってるメッシュ(画像だとCube)

・「BP_Enemy」

を複数配置して、実際にプレイしてみましょう。

f:id:Free_Gamer:20210209123241p:plain

まずは、Strengthの値を「25」にしてプレイしてみましょう。

youtu.be

穏やかではありますが、しっかり吸引が行われています。

次はStrengthの値を「1000」にしてみましょう。

youtu.be

大分激し目に吸引してくれました。

 

お役に立てたら幸いです。

それではまた^^ノシ


 

対象のアクターの手前までプレイヤーを移動させる方法

自身を対象のアクターの手前まで移動させる処理を紹介します。

 

~対象のアクターを作成~

まず対象のアクターNPCを作成します。

「ThirdPersonCharacter」をコピーしただけです。

f:id:Free_Gamer:20210125213451p:plain

 

作成した「NPC」を、適当な位置に配置します。

f:id:Free_Gamer:20210125221913p:plain

 

~レベルBPの作成~

処理は以下の通りです。

f:id:Free_Gamer:20210125215952p:plain

 

「Qキー」を押した時に、プレイヤーをNPCの手前まで移動させるカスタムイベント

「MoveToTheFrontEvent」を呼び出します。

f:id:Free_Gamer:20210125220028p:plain

 

「MoveToTheFrontEvent」の処理です。

純粋関数「CalculateFrontPosition」で、NPCの手前の位置を求め、その数値を

変数「FrontPosition」に格納します。

その後、タイムラインでプレイヤーを移動させる処理と

プレイヤーをNPCに向ける回転処理を行います。

f:id:Free_Gamer:20210125220047p:plain

純粋関数「CalculateFrontPosition」の中身は、以下の通りです。

f:id:Free_Gamer:20210125220534p:plain

 プレイヤーがNPCを貫通しない為に

「MapRangeUnclamped」で制限を設けてます。

多分「MapRangeClamped」でも行けると思います。(多分)

f:id:Free_Gamer:20210125220633p:plain

 

タイムラインは以下の通りです。

時間は「0.1」に設定してあります。

「0秒」に値「0」のキーがあり

「0.1秒」に値「1」のキーがあります。

f:id:Free_Gamer:20210125221105p:plain


カスタムイベント「MovePlayer」で

プレイヤーをNPCの手前の位置まで移動させます。

f:id:Free_Gamer:20210125220809p:plain

 

カスタムイベント「PlayerLookAtRotation」で

プレイヤーをNPCに向けます。

f:id:Free_Gamer:20210125220915p:plain

 

これで完了です。

youtu.be

 

動画のように、どの方向からでもNPCの手前まで移動できているようになっていれば
OKです。

 

それではまた^^ノシ

エイムオフセットを使わずに、エイムオフセットと同じことをする方法!

シューティングゲームを作る時

必ず使うであろう

 

エイムオフセット

f:id:Free_Gamer:20200113212045p:plain

キャラをカメラの向いた方向に向かせえる際に使うやつですよね。

 

けど、もしかしたら

 

エイムオフセットを一々セットアップするのは

めんどくさい!

 

という人がいるかもしれません。

 

そんな人たちには今回

 

エイムオフセットを使わないで

エイムオフセットと同じことをする方法!

 

を紹介します。

 

※サードパーソンテンプレートを使用します

 

~アニメーションスターターパックのインポート~

アニメーションスターターパックをインポートします。

f:id:Free_Gamer:20200113212312p:plain

プロジェクトにアニメーションスターターパックがインポートされたのを

確認しましょう。

 

 

~CharacterBPのセットアップ~

「ThirdPersonCharacter」を開きます。

f:id:Free_Gamer:20200113212605p:plain

 

「Mesh」を

アニメーションスターターパックのものに変えましょう。

f:id:Free_Gamer:20200113213105p:plain

 

↓この状態になっていればOKです。

f:id:Free_Gamer:20200113213200p:plain

 

 

~AnimBPのセットアップ~

「AnimStarter_AnimBP」をいう名の

AnimBPを作成します。

f:id:Free_Gamer:20200113213706p:plain

 

「AnimStarter_AnimBP」を開き

イベントグラフを作成します。

f:id:Free_Gamer:20200113214724p:plain

 

キャラクター(ThirdpersonCharacter)のリファレンスを取得し変数に格納

f:id:Free_Gamer:20200113214756p:plain

 

エイムオフセットと同じことをする為に必要な処理です

「AimRotation」という変数に値を格納しています。

f:id:Free_Gamer:20200113214846p:plain

 

イベントグラフはこれで以上です。

 

 

~アニムグラフのセットアップ~

アニムグラフは以下のように作成します。

f:id:Free_Gamer:20200113215406p:plain

 

「ボーンをトランスフォーム(修正)する」というノードは

指定したボーンの

・位置(Translation)

・回転(Rotation)

・スケール(Scale)

を変更することが出来ます。

f:id:Free_Gamer:20200114223518p:plain
↓「Bone」と検索すれば出てきます。

f:id:Free_Gamer:20200114223346p:plain

 

「ボーンをトランスフォーム(修正)する」ノードを3つ出します。

f:id:Free_Gamer:20200114223128p:plain

上から

・Spine_01

・Spine_02

・Spine_03

ボーンの回転を変更しています。

 

今回は、「ボーンをトランスフォーム(修正)する」で

指定したボーンの回転のみを編集したいので

使わない

・位置(Translation)

・スケール(Scale)

・Alpha

のピンは消しましょう。

 

↓赤枠で囲われたチェックを外せば、ピンが消えます。

f:id:Free_Gamer:20200114224715p:plain

 

これが

f:id:Free_Gamer:20200114224907p:plain

こうなっていればいいです。

f:id:Free_Gamer:20200114223518p:plain

 

「ボーンをトランスフォーム(修正)する」の詳細パネルは以下通りです。

Spine_01

f:id:Free_Gamer:20200114223925p:plain

Spine_02

f:id:Free_Gamer:20200114223938p:plain

Spine_03

f:id:Free_Gamer:20200114223953p:plain

3つとも

RotationModeを「Add to Existing」

にしましょう。

 

これでAnimBPのセットアップは完了です。

 

「AnimStarter_AnimBP」を

 Meshに割り当てましょう。

f:id:Free_Gamer:20200114230357p:plain

 

 

実際にプレイしてみましょう。


UE4 疑似エイムオフセット

 

肩越し視点から見てみましょう。


UE4 疑似エイムオフセット 肩越し視点

 

周りから見てみましょう。


UE4 疑似エイムオフセット 周りから見た場合

 

しっかりエイムオフセットと同じことが出来ているのが分かります。

 

ぜひご活用を!

 

それではまた!^^ノシ