今日やったこと~血が数秒後、フェードアウトする処理~
敵を攻撃した時に出た(スポーンした)返り血が、数秒後に消える処理です。
まず「BP_Blood」という名のBPを作りました。
StaticMeshで「Plane」を選択し、マテリアルは血のマテリアルを設定しました。
マテリアルはこんな感じです。
次に「BP_Blood」に以下の処理を組みます。
CreateDynamicMaterialInstanceで血のマテリアルのインスタンスを変数に格納。「DMI」と命名。
タイムラインでフェードアウトの調整を行ってます。
タイムラインの最大秒数は「5秒」にしてあります。「0秒」の値が「1」、「5秒」が「0」になってます。
タイムラインの値をSetScalarParameterValueのValueに渡してます。
ParameterValueは「Opasity」を指定してます。
つまり、BP_Bloodがスポーンされたとき、タイムラインが呼び出され、値が「1」から「0」になっていき、5秒経過するとOpasityの値が完全に「0」になり、血がフェードアウトするような処理にしてあるわけです。
プレイヤーのBPです。
「DamageEffect」という名のインターフェイスで敵に処理を送ってます。
プレイヤーの武器の当たり判定とオーバーラップしたらインターフェイスに処理が流れるわけです。
(DamageEffectインターフェイスにあるLocationピンは気にしなくっていいですw)
敵側のBPです。
イベントDamageEffectインターフェイスが呼び出され、SpawnActorFromClassで「BP_Blood」をスポーンさせてます。
あとはいろいろScaleやらスポーン位置やらをいじってます。
実際やってみると・・・
しっかり5秒経ったら血が綺麗にフェードアウトしてますね!
すごい些細な処理ですがw
それではまた!^^ノシ
敵を倒したときのフィニッシュカメラ演出!
これは、DmCデビルメイクライや龍が如くであるシステムですが、
最後の敵を倒したときに、かっこいいカメラアングルで戦闘が終わるあれです。
分からなければ動画見るなり実際にやってみるなりしてください。特にDmCデビルメイクライおすすめです!おもしろいでs(ry
敵のコンポーネントにカメラを配置します。
とりあえず4つで。
敵のBPに以下の処理を組みました。
ダメージを食らったらHPが減算される。
DoOnceの後に、フィニッシュ演出時のカメラをスポーンさせる処理を組みます。
(なぜDoOnceがあるのかというと、プレイヤーの攻撃用当たり判定が複数当たった場合、フィニッシュ演出が連続で再生されないようにするためです。)
「CameraLocation」という自作関数で、「SpawnActorFromClass」にカメラをスポーンさせるための位置情報を渡しています。
Classは「CameraActor」を指定します。
カメラスポーン後、「SetViewTargetWithBlend」で、スポーンしたカメラの視点に切り替えます。
同時に、かっこいいサウンドも再生します。
そして、スロー演出も行います。
ちなみに、「CameraLocation」関数はただ値を渡すためだけのものなので、ピュア化(純粋化)してあります。
「CameraLocation」の中身はこうです。
コンポーネントに追加したCameraを配列に格納し、ランダムなCameraの位置にカメラをスポーンさせるため「RandomIntegarInRange」を使ってます。
フィニッシュ演出後、死亡処理を行います。
最後に、プレイヤー視点に切り替えるためスポーンしたフィニッシュ演出用のカメラを破壊します。
あとは、配置したCameraを好きなアングルでそれぞれ配置します!
実際にやってみますと・・・!
シンプルでかっこいいですね!(自画自賛)
これでかっこいいアクションゲーが作れるかもね!(・∀・)
それではまた!^^ノシ
今日の進捗~アニメーションに合わせてカメラを追従させる~(追記あり。解決済み)
まず問題のシーン。
ダイナミックに空中に打ちあがった時、カメラが置いてけぼりになってしまってます。
なので、キャラがフレームアウトしてしまいます。
これをどう解決したか。説明します。
※当てずっぽうなやり方をしたのでこれでいいのかはわかりません。
何か指摘があればお気軽にどうぞ!
まず、カメラをキャラのアニメーションに追従させるために、カメラ追従用のソケットを追加します。
腰につけたいので、「Pelvis」にソケットを追加します。
「CameraSocket」という名で追加しました。
次に、「AnimNotifyState」クラスの関数を作ります。
ReceivedNotifyBegin
この通知が来た時に、プレイヤーの「SpringArm」を「Mesh」のソケット「CameraSocket」にアタッチします。
ReceivedNotifyEnd
この通知が終わる時、アタッチを解除する。と、思ったのですがこれだとなんだかアタッチが解除されてないようです・・・。何か指摘があれば(ry
作成したAnimNotifyState「CameraOffset」をモンタージュに入れます。
これでプレイ!
キャラが空中に打ちあがるアニメーションした時に、しっかりカメラが追従されてますね!
しかし、肝心のカメラのアタッチを解除する方法がまだ未確定です。何か情報あればお気軽に教えて下さい!
それではまた!^^ノシ
~追記~
アタッチ解除方法が分かりました。
まず、なぜアタッチが解除されないか。原因はこれです。
「CameraBoom(SpringArm)」を「Mesh」にアタッチしたままだからです。
では、どうすればいいか。
「Mesh」を「CapsuleComponent」に変えればいいのです。
これをすることで、「Mesh」の腰のボーン(Pelvis)に追加したソケット「CameraSocket」にアタッチしていたCameraBoomが、ReceivedNotifyEndが来た時点で、CapsuleComponentにアタッチされ「CameraSocket」からアタッチが解除されることになるわけです。
違いを見てみましょう。
このポーズをとった時のカメラの動きに注目してみましょう。
改善前
改善後
どうでしょう。カメラの動きをみると、
改善前は、腰の動きと一緒にカメラも動いていましたが
改善後は、カメラは全く動いてなかったので、しっかり「CameraSocket」からアタッチが解除されたのが分かりますね。
以上!解決策でした!
それではまた!^^ノシ
ディレイコンボシステムの実装方法!
ディレイコンボとは??
これはデビルメイクライであるシステムなのですが、例えば・・・
攻撃ボタン→△ボタン
通常攻撃・・・△→△→△→△→通常攻撃フィニッシュ!
なのですが、ディレイコンボというのは・・・
通常攻撃・・・△→△→少し待ってから△→ディレイコンボに移行!
といった感じで、ボタンを押すタイミングでコンボが変わるシステムのことを言います!
それではやっていきましょう!
今回は、通常攻撃の2連撃後少し待ってからボタンを押したらディレイ攻撃に移行する処理を作ります!
必要なもの!
・通常攻撃モンタージュ(4連続攻撃)
・ディレイコンボモンタージュ(2連続攻撃)
まず通常攻撃モンタージュ(Attack)
通常攻撃のAnimNotify通知
NextCombo⁇・・・コンボをつなげるかどうかの通知
Reset・・・この通知が来た時、コンボをリセットする
GoDelayCombo??・・・ディレイ攻撃に移行するかどうか
ディレイ攻撃モンタージュ(DelayCombo)
ディレイ攻撃のAnimNotify通知
NextCombo⁇・・・コンボをつなげるかどうかの通知
Reset・・・この通知が来た時、コンボをリセットする
ちなみに、どちらのモンタージュもセクション名を統一しましょう!
通常攻撃モンタージュ(Attack)
ディレイ攻撃モンタージュ(DelayCombo)
Default・・・最初の攻撃セクション
2Combo・・・2連撃目のセクション
3Combo・・・3連撃目のセクション
4Combo・・・4連撃目のセクション
そうすることで、モンタージュをディレイ攻撃モンタージュに移行するときに、わざわざセクション名を変える必要が無くなるからです。
AnimBP
まず、キャラBPから入力の通知がイベントディスパッチャー(Attack)としてくる。
MultiGateで一連のコンボを再生させる。
ここで重要なのは、Montageを変数として格納することです!
この時点では、通常攻撃のモンタージュをMontage変数にデフォルト値として格納します!
ここ重要!
GoDelayCombo??通知が来た時にMontage変数の中身を、
通常攻撃モンタージュ(Attack)→ディレイ攻撃モンタージュ(DelayCombo)に入れ替えてます。
この時、もし攻撃ボタンが押されたらMultiGateによってディレイ攻撃モンタージュ(DelayCombo)を再生します。
ボタンが押されなければ、Reset通知によりコンボは終了です。
その際、Montage変数の中身をデフォルトの通常攻撃モンタージュ(Attack)に戻すようにしてあります。
それではプレイしてみましょう!
しっかり通常攻撃の2連撃後遅れてボタンを押したら、攻撃モーションが変わってましたね!
これで、バリエーション豊富なアクションシステムが作れそうですね!
それではまた!^^ノシ
アクションゲー!ヒットストップの実装!
アクションゲーで攻撃を敵に当てた時、一瞬攻撃が止まるような演出ありますよね!(モンハンがいい例だったはず。ブラボもそうだったかな?)
今回はその実装です!
とりあえず武器にコリジョンをつけたキャラを使用します。
以下の処理を組みます。
武器のコリジョンにオーバーラップしたアクターが指定したタグ持ちなら、ダメージを与え、ヒットストップをかける。
といった処理です!
ヒットストップ処理はマクロにひとまとめにしてます!
中身はこう!
SetglobalTimeDilationは時間の速さを変えれます。値が小さいほど遅くなります。
Delayで何秒時間を遅くするかを指定します。
Delayで指定した秒数が経過したら、SetglobalTimeDilationの値を「1」に戻し、時間の速さを元に戻します。
SetglobalTimeDilationの値につながってる変数「StopTime」には「0」を入れ、
Delayの値につながってる変数「Delay」には「0.00834」を入れます。(0.00834は手探りで見つけたちょうどいい数値)
次に、敵側のBPです。
敵側にもヒットストップ処理をする必要があります。
プレイヤーのヒットストップ処理の数値と一緒にしましょう。
StopTime(SetglobalTimeDilation)・・・「0」
Delay(Delay)・・・「0.00834」
おまけとして、敵の体力が「0」になったらラグドール化して死亡するようにしてます。
それではプレイ!
しっかりヒットストップがかかってますね!
ちなみに先ほど、敵側のヒットストップ処理で
プレイヤーのヒットストップ処理の数値と一緒にしましょう。
と言いましたね。
同じにしないと、例えばプレイヤーだけHitStopのDelayの数値を変えた場合、敵に攻撃が当たった瞬間、プレイヤーの動きが固まってしまったりしてしまいます。たまに。
まあ、その辺は実際にやって確かめてみてください。(この辺はまだ不確定なのでよくわかってません。すいません)
これで爽快感のあるアクションが作れるかもですね!
それではまた!^^ノシ
クラスBPからレベルBPにアクセスする方法
ここではサードパーソンテンプレート使います。
まず、キャラクターBPを開きます。
以下の処理を組みます。
「LevelBP」という名のイベントディスパッチャーを作成し、画像のようにします。
次にレベルBPを開きます。
レベル内のプレイヤーキャラを選択状態にした状態でレベルBPのグラフ内で右クリックします。
そして、キャラクターBPで作成したイベントディスパッチャー「LevelBP」を検索します。
すると、検索結果に「LevelBPを追加」というのが出てくるので、それをクリックします。
つまり、キャラクターを参照してきて、参照したキャラクターのBPからイベントディスパッチャーをひっぱってきたということになります。
そして、以下の処理を組みます。
これで、キャラクターBP(クラスBP)からレベルBPにアクセスすることが可能になりました。
これでプレイしてみましょう!
キャラクターBP(クラスBP)で組んだ処理の通り、
Qキーを押したときに、イベントディスパッチャーが呼び出されて、
レベルBPにアクセスされ、PrintStringが呼び出された
ということになります。
何かの役に立てれば幸いです!
それではまた!^^ノシ
今日の進捗~カメラが荒ぶる?問題への対処~
今回は、
プレイヤーキャラが他のキャラと近い時にカメラがいちいちドアップになってしまうときの対処法!
です!(長い!w)
まず問題のシーン
敵キャラと同じ位置にいるとき、カメラがいちいちドアップになってしまって目が痛いですよね。
これは、「SpringArm」が原因です。
ではどうすればいいか。
簡単です。
まずは、SpringArmのコリジョンを確認しましょう。
ProdeChannelのところに「Camera」とあります。
この「Camera」とは、
トレース応答の項目にある「Camera」のことですね!
ちなみに、ProdeChannelは「Camera」以外にもたくさんあります。
とりあえず「Camera」のままで。
次に、敵キャラのコリジョンを確認。
Meshのコリジョンを見てみると・・・
Cameraをブロックするように設定してありますね。
これを「無視する」に変えましょう!
SpringArmはカメラがアクターをすり抜けないようにするためのバネの役割を持ってるので、最初の動画のようにSpringArmが敵キャラのMeshのコリジョンに反応してしまい、SpringArmが伸びたり縮んだりしてドアップが繰り返されてたわけです!
これでプレイしてみましょう!
いちいちドアップすることがなくなりましたね!
これで、快適に戦闘を楽しむことが出来そうです!
それではまた!^^ノシ