Bpを使った攻撃時の音の出し分けについて

いつもお世話になっております。
どなたかご存の方がいたらご教授お願いします。

やりたいこととしては、BPを使って音の出し分けを行いたいです。
例:攻撃がヒットした時にヒット音、攻撃が当たらない場合空振りをする音

hit overlap等のイベントの場合当たった場合はイベントを取得できますが、当たらない場合をどのようにして取得すれば良いのかわかりません。
できない場合は攻撃開始時に空振り音を鳴らし、ヒットと同時にSEの再生ストップと新たにヒット音を鳴らす処理を行うしか無いのでしょうか?参考になるような情報等あれば回答いただけたらと思います。

よろしくお願いします。

空振りというのも見た目には当っていなくても音が鳴るという事はヒットしているという事です。

あまり賢いやり方ではないかもしれませんが、コリジョンコンポーネントを少し大きめに作成しておき、On Component OverlapのHitの中にはHit Locationの情報がありますので、Hit Locationの位置とコンポーネントの位置からVectorの長さを取得し、一定以上離れている場合には空振りの音、そうでなければ通常のヒット音にする、という方法です。

システム的な対処方法は多分、ないと思います。ただ私であればそのような実装方法をするというだけです。

回答ありがとうございます。
システム的な対処方法は無いということですね。
距離で音の出し分けを行う方法で試してみます。
上手くいきましたらまたご報告致しますのでよろしくお願いします。

回答ありがとうございます。アニメーションシーケンスの通知を使って以下の手順
ABP→キャラクタBPで状況ごとに通知の使い分けを行うってことですね。

ちょっと例が良くなかったかもしれませんが、30フレームのアニメーションがあるとして
10フレーム目でスイング音(空振り音)を出し、ヒットしていたらスイング音ではなくヒット音みたいな形の処理ができるかという質問でした。
この場合でもHorusさんの仰る通りスイング音を鳴らし、ヒット時にスイング音を止めヒット音を再生で解決するということですね。

AnimNotifyの方法も行ってみます。
また後程ご報告致しますのでよろしくお願いします。

2点ほどご質問があります。
1点目はBreak Hit ResultでHit Locationを取得してみてprintStringで出力をしてみた結果値が取れる時と取れない時があるようでしたが、この場合考えられる事としては何がありますでしょうか?

2点目は対象とのVector Lengthを取得してどのように比較すれば良いのかわかりません。

以上です、よろしくお願い致します。

アニメーションシーケンスの編集画面でAnimNotifyを設定できますので、アニメーションブループリントのAnimNotifyイベント→キャスト→MyCharacterなどのBP→状況により違う種類のサウンドを鳴らす というような処理で実装できるかと思います。
(これは空振り云々ではなく当たり方などの状況、状態により音を変える方法です)

そもそも、「”空振り”をする効果音」は不要だと思います。
というのも、武器を振ればヒットしようがしまいが振る音はなりますので、空振りをする効果音、というのではなく、武器を振る効果音を常に鳴らすようにすれば良いと思います。実際、ほとんどすべてのゲームはそのようになっています。
つまり、「当たらない場合」を取得する必要性がありません。
当たった場合に武器を振る効果音を停止させればリアルにはなると思います。

敵に「避けられた」ことをどうしても強調したいのであれば、alweiさんの方法か、敵に無敵時間を設定して無敵時間中にヒットすると空振りの効果音を鳴らすようにすれば良いと思います。

AnimNotifyを使ってBPで制御することは出来ました
画像①で通知を設定、ここで一つだけ疑問なのが「Tirgger Weight Threshold」の項目です。
調べてみたのですが、これについて書かれている場所を発見できなかったのでここについてもどなたかご存知であれば教えていただけると助かります。

画像② アニメーションブループリントで通知のイベント作成とキャラクターBPへキャストしてキャラクターBPのフラグを変更してあげれば通知を使ってBPで制御することができました。

その後音の出し分けについて調べていましたが、以下の方法を実現したいと思っています。

>>当たった場合に武器を振る効果音を停止させればリアルにはなると思います。

実際に調べてみましたが下記の内容のようなもので良いのでしょうか?

AudioComponentを使い「Play Sound Attached」 と「 set sound」で制御ができるとありましたが、実際にset soundを行っても効果音はストップされませんでした。
この場合アニメーションで設定したPlaySoundの扱いがどうなるのかも知りたいです。

それから、アニメーションで設定したPlaySoundの音を止める方法はないのでしょうか?それが可能なら一番手っ取り早い気がします。

以上です、よろしくお願い致します。

Hit Locationでコンポーネント座標とヒット座標を引き算したベクトル値をVector Lengthでとれば単純な正規化されたVectorの長さがとれます。

その長さが一定以内であればただしいヒット音を鳴らせばいいですし、一定以上であれば空振り音を鳴らせばいいというだけの話です。

値がとれる時ととれない時は状況がわからず、情報もほとんどないのでお答えするのが難しいところです。

それは使用しているのが、On Component Begin(End)Overlapではなく、On Component Hitの方だからではないでしょうか?

これらはそれぞれ別物で、オーバーラップの情報を取得するためにはOn Overlap系のイベントを使用する必要があります。

BlockAllはOn Hit系のイベントで使用します。

ありがとうございます、長さを取ることができました。

Break Hit ResultのHit Locationの件ですが
具体的にはカプセルコリジョンとキャラクターの当たり判定を行った際に
カプセルコリジョンのコリジョンタイプ>Blockallでキャラクター>blockallの場合はHit Locationが取得できるのですが、カプセルコリジョンのタイプを>overlapにした場合取得できなくなります。

On Component BeginOverlapを使っています。
BlockAll同士の場合は↓にあるOn Component Hitを使ってました。

weaponcollisionと当たり判定を取りたいスケルトンメッシュのcollisionをOverlapとGenerate Overlap EventsをTrueにしてます。
ですがHit Locationのみ座標が取得できませんでした。

ふむふむ、Sweep ResultはHitとは違うってことですね。
となると、この部分に関してはもう少し調べてみるしかないってことですね。

これ以上は質問とは外れてしまうと思うので別の質問として立ち上げますね。
教えて頂いてありがとうございました。

すみません、一部勘違いしておりました。On Component BeginOverlapではヒット座標をとることはできないようです。Sweep Resultの結果はヒット座標とは別物です。

できることがあるとすれば、Other ActorやOther Compの中からActor LocationやComponent Locationを取得し、そこから同様に計算する方法ですが、こちらもヒット座標とは違うので、厳密な位置をとるのは難しいかもしれません。

どちらにせよOverlap系のイベントで正確なヒット座標をとることはできません。ColisionHit系のイベントは座標はとれますが、反動があるあたり判定となるので、こちらも意図したものにはならない可能性があります。

「stop」という何を止めるんだよみたいな名前のノードがありますのでそれで任意のサウンドコンポーネントを停止出来ます。

アニメーションシーケンスに設定されたサウンドを停止させる方法はわかりません。

回答ありがとうございます。
キャラクターBPに追加したAudio ComponentをアニメーションBPで制御する形で音の出し分けについては当初考えていた通りの動作になりました。

これで問題の解決とさせていただきます。
ありがとうございました。