Suzuki様
ご回答ありがとうございます。
ご回答を踏まえ、追加で質問させてください。
----------------------------------------------
改めて、当方のやりたいことは以下のとおりです。
- マップはWorldPartitionを使用。
- NavMeshはWorldPartitioned方式ではなく、従来方式を使用。
- NavMeshは全面に張られた状態をデフォルトとする。
- InitialRuntimeStateがUnloadedであるDataLayerをプレイ時にロードしたときだけ、NavMeshの指定領域をNull(またはObstacle)にしたい。
これを実現するには、
- RecastNavMeshのRuntimeGenerationをDMOにする。
- DataLayerにNavModifierを置く。
- エディタ時に、NevMeshを更新するときは、DataLayerパネルで当該DataLayerをアンロード状態にしておく。これで全面に張られる。
- プレイ時に、当該DataLayerをロードする。これでDataLayer内のNavModifierがNavMeshに動的影響を与える。
Q1. 実現方法として、↑の考えは妥当でしょうか?
----------------------------------------------
>一時的にUNavigationSystemV1::SetUpdateNavOctreeOnComponentChangeを用いて更新をブロックしたりすることは可能です。
こちらについて、ミニマルプロジェクトで試してみました。
↑のやりたいことを踏襲して、以下のようにテストしてみました。
- InitialRuntimeStateがUnloadedであるDataLayer「DL_Test」を用意。
- マップに、NavModifierVolume(前者)と、TriggerBoxにNavModifierComponentをつけたもの(後者)を設置。AreaTypeはどちらも「NavArea_Null」。
- エディタ時に「DL_Test」をアンロード状態にして、NavMeshを全面に張っておく。
- プレイ時に、まずSetUpdateNavOctreeOnComponentChange(false)にする。続いて、「DL_Test」をロードする。
- すると、NavMeshに対し、前者のほうは影響を与え、後者の方は与えなかった。
Q2. SetUpdateNavOctreeOnComponentChange(false)でNavMeshへの影響を抑制できるのはNavModifierComponentだけで、NavModifierVolumeのほうはできない、ということでしょうか?
----------------------------------------------
これまで、RuntimeGenerationをStaticで使ってきました。これをDMOにすると、例えNavModifierなどのNavMeshに影響を与えるものが存在しなくても、
Q3. 毎フレームの処理負荷は若干増える、という認識で正しいでしょうか?
Q4. 増えるとして、SetUpdateNavOctreeOnComponentChange(false)をしておけば、増加分を少しでも減らすことができますでしょうか?
----------------------------------------------
「RuntimeGenerationモードをプレイ時に切り替えることは想定されていない」とのことですが、
Q5. これはエンジン改造により可能にするには大変な改修を伴う、という理解でよろしいでしょうか?(「関数内の数行をちょっと書き換える」とか、そんなレベルではない、ということでしょうか?)
----------------------------------------------
質問が多く大変恐縮ではございますが、何卒ご回答よろしくお願いします。
----------------------------------------------
最後に、Q2で言及したミニマルプロジェクト(添付ファイル)の説明を以下に記載させていただきます。
TestDynamicNav.uproject:ランチャー版 5.5.4
Content/TestWPMap.umapを開いてください。
[Image Removed]
このWPマップには、InitialRuntimeStateがUnloadedであるDataLayer「DL_Test」があります。
[Image Removed]また、NavModifierVolumeと、TriggerBoxにNavModifierComponentをつけた「TriggerBoxWithNavModifier」が置かれており、どちらも「DL_Test」に属しています。
[Image Removed]
NavMeshは全面に張っています。
また、BP_ControlActorが置かれており、これはプレイ開始10秒後に「DL_Test」をActiveにします。
[Image Removed]を切り替えます。(C++親クラスAControlActorに定義があります。)
[Image Removed]
`void AControlActor::EnableUpdateNavOctreeOnComponentChange()
{
UNavigationSystemV1::SetUpdateNavOctreeOnComponentChange(true);
}
void AControlActor::DisableUpdateNavOctreeOnComponentChange()
{
UNavigationSystemV1::SetUpdateNavOctreeOnComponentChange(false);
}`
プレイ開始して、(「DL_Test」がロードされる前に)「0」キーを押してSetUpdateNavOctreeOnComponentChange(false)をします。
「show Navigation」をしてNavMeshを可視化すると、↓のようにNavModifierVolumeのほうはNavMeshに影響を与えています。
[Image Removed]