FastGeoStreamingを使用中、PrimitiveComponentで作成されたアクター(弾など)がFastGeo処理された壁や床に衝突してもOnComponentHitを発火しません。
デバッグで追ってみると、UPrimitiveComponent::DispatchBlockingHitでBlockingHitComponentが必要になっています。
FastGeo処理された壁床はComponentを持たないため発火しないようでした。
何か回避策はありますでしょうか?
修正予定であればそちらをお待ちしております。
FastGeoで変換されたコンポーネントはランタイムでActorやComponentの表現を失っています。そのためコリジョンヒット時にこれらのパラメータがnullになってしまいます。
一般的にはOnComponentHitはHitActorやHitComponentがあることを前提とするのでBlockingHitComponentの有効性をチェックしてイベントの発火を制御することは理に適っているのではないかと思います。
一般的な対策としてはOnComponentHitが必要なコンポーネントをFastGeoの変換から除外することですが、FastGeoの変換を優先しHitActorやHitComponentがnullのままでOnComponentHitが呼ばれることが許容できるのであれば、弾丸などのアクターのRootComponentのクラスを独自に派生したコンポーネントにいれかえMoveComponentImplをオーバーライドしBlockingHitComponentの有無に関わらずイベントを発火するカスタム版のDispatchBlockingHitを呼びだすなどの方法が考えられると思います。
> 現状FastGeoについてはプレイヤーが影響しない遠景 or プレイヤーが背景に影響しないゲームでの利用が想定されている、という認識で大丈夫でしょうか?
はい。FastGeoはコンポーネントやアクターといったデータを介さずに直接ワールドにメッシュを配置することで余計なオーバーヘッドを省いている関係上、コンポーネント表現を参照するゲームロジックなどには対応できません。
このようなコンポーネントはFastGeoから除外する必要があります。
> また、FastGeo処理された地形に対して、発射物が着弾してヒットエフェクトを出す…のような処理で想定している使用方法を教えて頂けますと大変助かります。
発射物のルートコンポーネントのクラスを拡張して BlockingHitComponentが無い状態でもOnComponentHitをトリガーしたとしてもアクター側にも同様のチェックがあります。(AActor::InternalDispatchBlockingHitを参照してください)
全てに対応することも可能ですがかなり大きなプログラミングが必要になってしまいます。
発射物の移動にはProjectileMovementComponentのような移動コンポーネントがあると思いますが、このコンポーネント中の更新時に呼び出しているSafeMoveUpdatedComponentやMoveUpdatedComponentで得られるHitResultからタイトルに適した形でイベントをトリガーする方法がもっともシンプルに対応できると思います。
ご返答ありがとうございます!
> 一般的な対策としてはOnComponentHitが必要なコンポーネントをFastGeoの変換から除外する
こちらについてですが、プレイヤーが反応する壁地面についてはFastGeoで変換するのは現状推奨されてなくて
現状FastGeoについてはプレイヤーが影響しない遠景 or プレイヤーが背景に影響しないゲームでの利用が想定されている、という認識で大丈夫でしょうか?
また、FastGeo処理された地形に対して、発射物が着弾してヒットエフェクトを出す…のような処理で想定している使用方法を教えて頂けますと大変助かります。
ご回答ありがとうございました!
頂いた情報などを元に、今後の対応を検討したいと思います。
本件についてはクローズしていただいて大丈夫です。