ALSV4 カメラがオブジェクトをすり抜けてしまう問題の修正
最近ALSV4(AdvancedLocomotionSystemV4)を触ることが多いので
学んだことなどを紹介していきます。
今回は
カメラがオブジェクトをすり抜けてしまう問題を解決する方法を紹介します。
~目次~
カメラのすり抜け問題とは??
ALSV4をそれなりに触ったことある人なら
遭遇したことのある問題かもしれません。
このように、意図せずしてカメラがオブジェクトをすり抜けてしまいます。
これを解消するにはどうすればいいのか??
なぜすり抜ける??
「ALS_PlayerCameraManager」を開きます。
この「ALS_PlayerCameraManager」で
カメラのコリジョン判定が行われているようです。
「ALS_PlayerCameraManager」を開くと
以下のイベントグラフが表示されると思います。
このイベントグラフの中に
以下の赤枠で囲んである部分が、カメラのコリジョン判定の処理です。
Sphereトレースを使って、カメラのコリジョン判定を行っています。
このトレースのHitResultの
「InitialOverlap」がTrueになってると、カメラがオブジェクトをすり抜けるようになってます。
InitialOverlapがTrueになってる状態というのは
以下のような状態です。
「Tキー」で、カメラのトレースを可視化できます。
逆に、InitialOverlapがFalseの状態というのは
以下のような感じです。
違いが分かりましたかね??(語彙力が無いのでうまく説明出来てないかもサーセン)
つまり
カメラのトレースの
InitialOverlapをTrueにさせなければ
意図せずカメラがすり抜けるのを
防ぐことが出来る。
という事です。^^
カメラのすり抜け問題の解決方法
SkeletalMeshの編集
「ALS_Mannequin_Skeleton」を開きます。
スケルトンツリー内に
「TP_CameraTrace_L」
「TP_CameraTrace_R」
というソケットがあります。
これは、カメラのトレースの始点位置です。
「TP_CameraTrace_L」は、カメラがキャラの左斜め後ろにあるとき
トレースはこのソケットの位置から飛ばされます。
「TP_CameraTrace_R」は、カメラがキャラの右斜め後ろにあるとき
トレースはこのソケットの位置から飛ばされます。
この
「TP_CameraTrace_L」
「TP_CameraTrace_R」
の位置を、XYZ全て「0」にしましょう。
すると、ソケットの位置が
キャラの頭の位置に戻るはずです。
トレースRadiusの調整
「ALS_AnimMan_CharacterBP」を開きます。
「BPI_Get_3P_TraceParams」関数を開きます。
この関数で、トレースの設定をしています。
TraceRadiusを「5」にしましょう。
これで、完了です!
実際にプレイ!
カメラが意図せずして、オブジェクトをすり抜けることが無くなりました!
ALSV4をこれから使う人などのお役に立てれば幸いです!
それではまた!^^ノシ
ラグドールから立ち上がる方法!
「MovementAnimsetPro」の起き上がりアニメーションを使った
ラグドールから起き上がる処理を紹介します。
~目次~
- アセットの追加
- リターゲット
- Montageの作成
- BPインターフェースを作成
- ThirdPersonCharacter
- AnimBP
- AnimNotifyStateの作成
- AnimNotifyStateをMontageに追加
- 実際にプレイ!けど・・・
- 物理アセットの編集
- 改めて実際にプレイ!
アセットの追加
まずは、「MovementAnimsetPro」をプロジェクトに追加します。
リターゲット
「MovementAnimsetPro」フォルダ内にある「Mesh」フォルダの中の
「UE4_Mannequin_Skeleton」を開きます。
リグを「Humanoid」にし、下にある「ポーズを変更」をクリックし
「現在のポーズを使用する」を選択します。
次に、サードパーソンのボーンも同じ設定にしていきます。
「Mannequin」フォルダ内にある「Mesh」フォルダ内の
「UE4_Mannequin_Skeleton」を開きます。
リグを「Humanoid」にします。
「MovementAnimsetPro」フォルダ内にある「RootMotion」フォルダにある
「GetUpFromBack」と「GetUpFromFace」を選択し、右クリックします。
「Animアセットとリターゲットを複製する」を選択しましょう。
「UE4_Mannequin_Skeleton」を選択し、リターゲットしましょう。
コンテンツブラウザ内に、「UE4_Mannequin_Skeleton」でリターゲットされたアニメーションがあるはずです。
Montageの作成
「GetUpFromBack」と「GetUpFromFace」で、AnimMontageを作成します。
これで、ラグドールから起き上がる為のAnimMontageが作成できました。
作成したMontageを開いて、BlendInのBlendTimeを「0」にします。
BPインターフェースを作成
BPI_AnimBP
AnimBP用のBPインターフェース「BPI_AnimBP」を作成します。
開いて、「SetRagdoll」イベントを作成します。
Bool型のインプットピンを追加します。
BPI_Character
CharacterBP用のBPインターフェース「BPI_Character」を作成しましょう。
「BPI_Character」を開き、「IsGetUp??」イベントを作成します。
Bool型のインプットピンを追加します。
ThirdPersonCharacter
「ThirdPersonCharacter」を開きます。
BPインターフェースの追加
作成したBPインターフェース「BPI_Character」を追加します。
変数の作成
変数を作成します。
~Ragdoll~
デフォルト値「False」
Trueの場合、ラグドール化してる。
Falseの場合、ラグドール化してない。
~PelvisBone~
デフォルト値「Pelvis」
~RagdollLocation~
Pelvisの位置を示す変数。
~RagdollRotation~
Pelvisの向きを示す変数。
~RagdollFaceUp~
Trueの場合、仰向け。
Falseの場合、うつ伏せ。
~RagdollOnGround~
Trueの場合、地面についてる。
Falseの場合、空中。地面についてない。
~GetUp~
Trueの場合、起き上がりモーション中。
Falseの場合、起き上がりモーション中ではない。
ラグドール処理の作成
「Q」キーを押した時、
カスタムイベント「EnabledRagdoll」と「DisabledRagdoll」を呼び出す。
「EnabledRagdoll」は、ラグドール化する為の処理。
「DisabledRagdoll」は、ラグドールを解除する処理です。
EnabledRagdoll
カスタムイベント「EnabledRagdoll」の処理です。
Sequenceノードで、順番に処理を行ってます。
Then0
Then1
Then2
Then3
EventTick
ラグドール中の場合、CapsuleComponentの位置と向きを調整するカスタムイベント「SetCapsuleLocationAndRotation」を呼び出す。
SetCapsuleLocationAndRotation
Sequenceノードで、処理を順番に実行してます。
Then0
Then1
Then2
トレースを地面に向かって飛ばす。
CapsuleComponentの位置と向きを調整。
DisabledRagdoll
ラグドール状態から起き上がるカスタムイベント「DisabledRagdoll」の処理です。
Sequenceノードで、順番に処理を実行してます。
Then0
SnapshotNameを「RagdollPose」に設定します。
Then1
Then2
RagdollFaceUp変数がTrueの時は、仰向けから起き上がるモンタージュを
Falseの時は、うつ伏せから起き上がるモンタージュを再生するようにしています。
Then3
Then4
イベント「IsGetUp??」の追加
ラグドール状態からの起き上がりアニメーション中は、GetUp変数はTrueになります。
このイベントは、AnimNotifyStateから受け取るイベントになります。
起き上がりアニメーション中は、ジャンプが出来ないようにします。
AnimBP
「ThirdPerson_AnimBP」を開きます。
BPインターフェースの追加
作成したBPインターフェース「BPI_AnimBP」を追加します。
イベント「SetRagdoll」の追加
BPI_AnimBPで作成したイベント「SetRagdoll」をイベントグラフに追加し
Ragdollピンを変数へ昇格します。
Animグラフ
新規のステートマシーン「Ragdoll」を作成し
Ragdoll変数を繋いだ「ブレンドPosesByBool」ノードで処理の分岐を行います。
ステートマシーン「Default」がFalse。
ステートマシーン「Ragdoll」がTrueです。
Trueブレンド時間と、Falseブレンド時間は「0.5」です。
ステートマシーン「Default」
ステート「Idle/Run」を開きます。
スロットノードを追加します。
これでモンタージュが再生されるようになりました。
ステートマシーン「Ragdoll」
ステートマシーン「Ragdoll」を開き
ステートを2つ追加します。
「Entry」と「RagdollPoseSnapShot」をお互い線で繋ぎましょう。
2つのトランジションルールを選択し、
詳細パネルのブレンド設定項目にある「継続時間」の値を「0」にします。
EntryからRagdollPoseSnapShotのトランジションルール
RagdollがFalseになったら、RagdollPoseSnapShotへ遷移します。
つまり、ラグドールから起き上がる時に、RagdollPoseSnapShotへ遷移するという意味です。
RagdollPoseSnapShotからEntryのトランジションルール
RagdollがTrueの時にEntryへ遷移します。
つまり、ラグドール化した時に、Entryに遷移するという意味です。
ステート「RagdollPoseSnapShot」
ステート「RagdollPoseSnapShot」を開きます。
ポーズスナップショットノードを追加します。
SnapshotNameを「RagdollPose」に設定します。
AnimNotifyStateの作成
AnimNotifyState「GetUp_AnimNotifyState」を作成します。
Received_NotifyBeginとReceived_NotifyEndを追加します。
変数は「GetUp」という名の編集可能にしたBool型変数を追加します。
Received_NotifyBegin
Received_NotifyEnd
AnimNotifyStateをMontageに追加
起き上がりアニメーションMontage「GetUpFromBack」と「GetUpFromFace」を開き
通知のところに、作成したAnimNotifyState「GetUp_AnimNotifyState」を追加します。
起き上がり始めてから、起き上がった瞬間まで、通知を伸ばしています。
追加した「GetUp_AnimNotifyState」を選択し、詳細パネルにある
GetUpにチェックをつけ、Trueにします。
実際にプレイ!けど・・・
実際にプレイしてみましょう!
何か変ですよね。
ラグドールは良いんですが、そこから起き上がる時
キャラが横に倒れたまんま起き上がりアニメーションをして、色々おかしなことになっています。修正しましょう。
物理アセットの編集
「SK_Mannequin_PhysicsAsset」を開きます。
スケルトンツリーのオプション内にある
「すべてのボーンを表示」を選択します。
Rootボーンを選択し、右クリックして
球形を追加します。
Rootボーンに、球形のボディが追加されました。
追加したボディを選択し、詳細パネルの設定をします。
「PhysicsType」を「Kinematic」
「CollisionReponse」を「Disabled」
Spheresの半径を「7.5」にします。
追加したボディを選択し、コンストレイントから「Pelvis」を選択します。
追加したコンストレイントを選択し
詳細パネルの「LinearLimits」の
「XMotion」「YMotion」「ZMotion」を全部「Free」にします。
改めて実際にプレイ!
改めて実際にプレイしてみましょう!
今度は、しっかりラグドール状態から起き上がってくれました!
それではまた!^^ノシ
カメラを瞬時に真後ろに向ける処理
今回はカメラを瞬時に真後ろに向ける方法を紹介します。
~変数~
TargetRotator・・・カメラの真後ろ方向を格納する変数
RotateCamera_TimeHandle・・・タイマー変数。
CameraTurn・・・カメラ回転中はTrue。
~カメラ操作処理~
CameraTurnがFalse、つまり
カメラ回転中じゃない場合は、自由にカメラ操作が行えます。
カメラ回転中は、カメラ操作を不能にします。
~カメラ回転処理~
マウスを右クリックした時、CameraTurnをTrueにします。
カメラの回転を連続で出来ないようにしています。
カメラの真後ろ方向を格納します。
タイマーイベントを呼び出します。
RotateCameraという名のタイマーイベントです。
現在のカメラの向きを、プレイヤーの真後ろ方向「TargetRotator」に向けます。
InterpSpeedでカメラの回転速度を調整できます。
値が小さい程、回転が遅いです。
値が大きい程、回転が速いです。
ただし、値が「0」の場合は回転しないので注意してください。
RInterpToで返された値が「TargetRotator」と同等か判定します。
Falseだった場合、つまり「TargetRotator」とカメラの向きの値が同等ではない場合
「SetControlRotation」ノードで、カメラを回転し続けます。
「SetControlRotation」のNewRotationには、RInterpToの返り値を渡してあります。
Trueだった場合、つまり「TargetRotator」とカメラの向きの値が同等だった場合
「CameraTurn」変数をFalseにし、タイマーを止めます。
これで、カメラの回転が止まります。
これで完了です。
それではプレイしてみましょう。
右クリックした時に、カメラが真後ろに回転していると思います。
終わりー
それではまた~^^ノシ
血の作成~地面や壁に血をつける方法~
今回はこちらのアセットを使用して
血のデカールを地面や壁につける処理を紹介します。
確かそこまで高くなかったような気がするので(500円ぐらいだったかな)
1000円あれば余裕で買えると思います。
このアセットは、地面用と壁用の血のデカールが入ってるので
グロ表現にこだわりたい僕からしたら、お気に入りのアセットです^^
~血の作成~
血のデカール用のアクター「BP_BloodDecal」を作成します。
コンポーネントは以下の通り。
DecalのXの角度を「90」にします。
デカールのXのサイズを、「5」にします。
配列変数「BloodDecal」からランダムで、デカールをセットします。
「BP_BloodDecal」の子クラスを作成します。
・「BP_FloorBlood」(地面用の血のデカール)
・「BP_WallBlood」(壁用の血のデカール)
この2つのBPを開き、配列変数「BloodDecal」にデカールをセットします。
「BP_FloorBlood」
「BP_WallBlood」
血の作成はこれで以上です。
~トレースチャンネルの作成~
プロジェクト設定のコリジョン設定で
「Trace」というTraceChannelを作成します。
「Trace」のデフォルト応答は「Block」にします。
~コリジョンの編集~
Preset項目内の、「Pawn」と「CharacterMesh」のプロファイルを編集します。
「Pawn」の「Trace」応答を「無視する」に設定。
「CharacterMesh」の「Trace」応答を「ブロック」に設定。
コリジョンの編集は以上です。
~ダメージを与える側の作成~
「ThirdPersonCharacter」を開き、FPS視点にしたいので
SpringArmの位置を頭に持っていき、SpringArmの長さを「0」にしています。
Meshは、HiddenInGameをTrueにして非表示にしてあります。
カメラの位置から、前方に向けて「5000」の距離に飛ばしています。
トレースが当たったものにダメージを与えるといった感じです。
トレースのTraceChannelは「Trace」という自作TraceChannelにしてあります。
ちなみに、「ApplyPointDamage」のBaseDamageが「0」だった場合
ダメージを受ける側が持っているイベント「PointDamage」が呼び出されません。
なので、イベント「PointDamage」を呼び出したい場合は
「ApplyPointDamage」のBaseDamageには「0」以上の値を入れましょう。
~ダメージを受ける側の作成~
ダメージを受ける側のキャラ「BP_Enemy」を作成。
イベントグラフは以下の通り。
ダメージを受けた時、HitLocationとHitNormalの値を格納。
後に血のデカールをスポーンさせるイベントを呼び出す。
地面に血のデカールをスポーンさせる処理です。
ダメージを受けたキャラの足元に
自作関数「FindSpawnDecalPoint」で足元にトレースを飛ばし
地面を検知したら血のデカールをスポーンさせるという感じです。
変数「Z_TraceLength」の値は「150」にしてあります。
「FindSpawnDecalPoint」関数の中身は以下の通り。
壁に血のデカールをスポーンさせる処理です。
「FindSpawnDecalPoint」関数でトレースを飛ばし、壁を検知します。
変数「TraceLength」の値は「500」にしてあります。
自作純粋関数「SetVectorVariation」で、血のデカールをスポーンさせる位置に
ばらつきを持たせます。
変数「Min」の値は「‐90」、変数「Max」の値は「90」にしてあります。
「SetVectorVariation」純粋関数の中身は以下の通り。
トレースがヒットした際、ヒットしたオブジェクトの角度が
指定した角度よりも大きい場合は、血のデカールをスポーンさせます。
画像で言うと、トレースがヒットしたオブジェクトの角度が
「40度」以上だった場合に、血のデカールをスポーンさせる
といった感じです。
実際にプレイしてみましょう。
動画のようにできていればOKです。
最近、ゲームは血が出てりゃあ
何でも面白いんじゃないかと思い始めてます。
それではまた^^ノシ
ブラックホールの作り方!
近くにあるメッシュやキャラクターを吸引する
ブラックホールの作成方法を紹介します。
~ブラックホールを作成~
「BP_BlackHole」という名のアクターを作成。
~BPインターフェースの作成~
「BPI_Character」という名のBPインターフェースを作成します。
「BPI_Character」を開き
「SetRagdoll」という名のイベントを作成します。
~NPCの作成~
「BP_Enemy」という名のキャラクターを作成します。
普通にキャラクターメッシュを追加します。
「BPI_Character」BPインターフェースを追加します。
イベントグラフに以下の処理を作成します。
~「BP_BlackHole」の処理~
「BP_BlackHole」のイベントグラフに以下の処理を作成します。
変数は以下の通りです。
Radius・・・値が大きい程吸引範囲が広がる。デフォルト値は「700」
Strength・・・値が大きい程吸引強度が強くなる。お好みの値で。
「BP_BlackHole」をレベルに配置して、その近くに
・SimulatePhysicsがTrueになってるメッシュ(画像だとCube)
・「BP_Enemy」
を複数配置して、実際にプレイしてみましょう。
まずは、Strengthの値を「25」にしてプレイしてみましょう。
穏やかではありますが、しっかり吸引が行われています。
次はStrengthの値を「1000」にしてみましょう。
大分激し目に吸引してくれました。
お役に立てたら幸いです。
それではまた^^ノシ
対象のアクターの手前までプレイヤーを移動させる方法
自身を対象のアクターの手前まで移動させる処理を紹介します。
~対象のアクターを作成~
まず対象のアクター「NPC」を作成します。
「ThirdPersonCharacter」をコピーしただけです。
作成した「NPC」を、適当な位置に配置します。
~レベルBPの作成~
処理は以下の通りです。
「Qキー」を押した時に、プレイヤーをNPCの手前まで移動させるカスタムイベント
「MoveToTheFrontEvent」を呼び出します。
「MoveToTheFrontEvent」の処理です。
純粋関数「CalculateFrontPosition」で、NPCの手前の位置を求め、その数値を
変数「FrontPosition」に格納します。
その後、タイムラインでプレイヤーを移動させる処理と
プレイヤーをNPCに向ける回転処理を行います。
純粋関数「CalculateFrontPosition」の中身は、以下の通りです。
プレイヤーがNPCを貫通しない為に
「MapRangeUnclamped」で制限を設けてます。
多分「MapRangeClamped」でも行けると思います。(多分)
タイムラインは以下の通りです。
時間は「0.1」に設定してあります。
「0秒」に値「0」のキーがあり
「0.1秒」に値「1」のキーがあります。
カスタムイベント「MovePlayer」で
プレイヤーをNPCの手前の位置まで移動させます。
カスタムイベント「PlayerLookAtRotation」で
プレイヤーをNPCに向けます。
これで完了です。
動画のように、どの方向からでもNPCの手前まで移動できているようになっていれば
OKです。
それではまた^^ノシ
エイムオフセットを使わずに、エイムオフセットと同じことをする方法!
シューティングゲームを作る時
必ず使うであろう
エイムオフセット
キャラをカメラの向いた方向に向かせえる際に使うやつですよね。
けど、もしかしたら
エイムオフセットを一々セットアップするのは
めんどくさい!
という人がいるかもしれません。
そんな人たちには今回
エイムオフセットを使わないで
エイムオフセットと同じことをする方法!
を紹介します。
※サードパーソンテンプレートを使用します
~アニメーションスターターパックのインポート~
アニメーションスターターパックをインポートします。
プロジェクトにアニメーションスターターパックがインポートされたのを
確認しましょう。
~CharacterBPのセットアップ~
「ThirdPersonCharacter」を開きます。
「Mesh」を
アニメーションスターターパックのものに変えましょう。
↓この状態になっていればOKです。
~AnimBPのセットアップ~
「AnimStarter_AnimBP」をいう名の
AnimBPを作成します。
「AnimStarter_AnimBP」を開き
イベントグラフを作成します。
キャラクター(ThirdpersonCharacter)のリファレンスを取得し変数に格納
エイムオフセットと同じことをする為に必要な処理です
「AimRotation」という変数に値を格納しています。
イベントグラフはこれで以上です。
~アニムグラフのセットアップ~
アニムグラフは以下のように作成します。
「ボーンをトランスフォーム(修正)する」というノードは
指定したボーンの
・位置(Translation)
・回転(Rotation)
・スケール(Scale)
を変更することが出来ます。
↓「Bone」と検索すれば出てきます。
「ボーンをトランスフォーム(修正)する」ノードを3つ出します。
上から
・Spine_01
・Spine_02
・Spine_03
ボーンの回転を変更しています。
今回は、「ボーンをトランスフォーム(修正)する」で
指定したボーンの回転のみを編集したいので
使わない
・位置(Translation)
・スケール(Scale)
・Alpha
のピンは消しましょう。
↓赤枠で囲われたチェックを外せば、ピンが消えます。
これが
↓
こうなっていればいいです。
「ボーンをトランスフォーム(修正)する」の詳細パネルは以下通りです。
Spine_01
Spine_02
Spine_03
3つとも
RotationModeを「Add to Existing」
にしましょう。
これでAnimBPのセットアップは完了です。
「AnimStarter_AnimBP」を
Meshに割り当てましょう。
実際にプレイしてみましょう。
肩越し視点から見てみましょう。
周りから見てみましょう。
しっかりエイムオフセットと同じことが出来ているのが分かります。
ぜひご活用を!
それではまた!^^ノシ