オープンワールドゲームの勉強をしております。
instanced static meshを持つブループリントをレベル内に大量に置き、それぞれに耐久値などの値を持たせて、与えたダメージ量によって破壊したりしたいのですが、そういったことは可能なのでしょうか?
line traceを飛ばし、ぶつかった場所を中心にget instances overlapping sphereでレイが当たったオブジェクトのインデックスを取得し、remove instanceを使用すると対象のオブジェクトのみを一発で消してしまうことはできたのですが、ダメージを与えていくという方法がわかりませんでした。
Instanced Static mesh(以下ISM)は個々のインスタンスだとインデックス(何番目の複製か)と位置、回転、スケールの情報しか持てないため、それ以外の情報を保持させたい場合には別途配列の変数などを用意し、インスタンスのインデックスに対応させて情報を保管するといったやり方が必要です。(位置・回転・スケール何れかの見た目上影響が出ない小数点以下に数字を保管する裏技的な方法もありますが…)
Float型などの配列を使い、ISM生成数を取得し、同じ数だけ配列にアイテムを追加し、ダメージを与えたいインデックスに対応した配列内アイテムのFloatを取り出してダメージを加算、一定の数値のヒットポイントを超えた場合Branchノードで分岐して消去させる、といった方法で対処できるかと思います。
ただしこの場合ヒットポイントは全て同値なので、個別に数値を設定したい場合には最初の配列にアイテムを追加時に配列内のFloatの値を個別に指定してダメージ処理時に減算、0以下で分岐させるといった工夫が必要です。
ちなみにどういった用途なのかや、試行の経緯を知らないままの指摘で恐縮ですが、4.23以降は同一オブジェクトで同一マテリアルのスタティックメッシュをAuto Instancing機能で自動的にドロ―コール削減してくれます。(エンジン側の機能で自動的にパフォーマンスを改善してくれる)
レベルに大量に置かれた同一メッシュコンポーネントのうちの1つに影響を与えたいのであればISMをStaticMeshActorなどに置き換え、レベル上に配置しStaticMeshActorのBP上で単純なHP減算の処理をする方法でも良いかと思います。(ただしAuto Instancingはモバイル用途だと別途設定が必要)
画像まで用意して頂き、非常にわかりやすくて助かります。ありがとうございます。
用途としては7days to dieというゲームのブロックのような、ゲーム内で配置したり、叩いてダメージを与えて壊せるようなオブジェクトを想定しております。
ご回答頂いた後半の内容があまり理解できなかったのですが(初心者ゆえ)、StaticMeshActorに置き換えたこのBPをfor loopで大量にスポーンさせてみたところ重くなってしまいました。
この場合は前半の配列を使うという方で実装した方が良いのでしょうか。
また、少し内容がずれて大変恐縮なのですが、質問文で私が書いた
>line traceを飛ばし、ぶつかった場所を中心にget instances overlapping sphereでレイが当たったオブジェクトのインデックスを取得し
の部分ですが、これはレイが当たったインスタンスを取得するやり方として合っているのでしょうか?
get instances overlapping sphereは引数centerを中心に引数radiusを半径とする球を作り、その球にかぶっているインスタンスのインデックスを返すと解釈しているのですが、たまにレイが当たった場所と全く関係のないところのオブジェクトが消えたり、当たったのに消えないことなどもあり、そもそもこの関数を使うのが間違っているのかなと思っています。
>StaticMeshActorに置き換えたこのBPをfor loopで大量にスポーンさせてみたところ重くなってしまいました。
そういった用途であれば従来どおりISMを利用して配列などを利用して耐久度の情報を保管するのが向いているかと思います。(マップに置かれた木とか障害物を複製する、くらいの規模で考えていました。)
StaticMeshActorを利用してAuto Instancing機能でドロ―コールを削減しても、やはり大量に置いた場合にはISMに比べパフォーマンスが落ちてしまうかと思います。
Get Instances Overlapping Sphereの問題については表題から逸れてしまうため、お手数ですが別途質問されることをおすすめします。(同じ問題に直面された方が見つけやすくするため)
なるほど。理解いたしました。配列を作ってやってみます。
この度は大変ありがとうございました。