PoseSearchプラグインのクラッシュ

PoseSearchプラグインのコードバグかと思われます。

再現方法にも書きましたが、

FPoseSearchQueryTrajectory::FPoseSearchQueryTrajectory(const FTransformTrajectory& InTrajectory)

関数内で配列をResetしたあとに配列コピーを行っています。

Samples.Reset(InTrajectory.Samples.Num()); Samples.SetNum(InTrajectory.Samples.Num());

​のようにするとクラッシュしなくなります。

お世話になっております。

ご連絡ありがとうございます。

「再現方法」が投稿から消えてしまっているようでして、お手数ですが、改めてご説明いただけますと幸いです。

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

再現方法としては、弊社のMotion Matchingの独自実装に関わるもので、簡単にこうすれば再現するというものでは無いですが、

FPoseSearchQueryTrajectory::FPoseSearchQueryTrajectory(const FF& InTrajectory)

このコンストラクタをInTrajectory.Samplesの要素数が0で無い状態で呼び出すことでクラッシュします。

ただし、呼び出し元の

UE_DEPRECATED(5.6, “Use PoseSearchGenerateTrajectory function that takes in FTransformTrajectory.”)

static UE_API void PoseSearchGenerateTrajectory(const UObject* InAnimInstance,

UPARAM(ref) const FPoseSearchTrajectoryData& InTrajectoryData, float InDeltaTime,

UPARAM(ref) FPoseSearchQueryTrajectory& InOutTrajectory, UPARAM(ref) float& InOutDesiredControllerYawLastUpdate, FPoseSearchQueryTrajectory& OutTrajectory,

float InHistorySamplingInterval = 0.04f, int32 InTrajectoryHistoryCount = 10, float InPredictionSamplingInterval = 0.2f, int32 InTrajectoryPredictionCount = 8);

が5.6でDepricatedになっており、新しい関数ではクラッシュしないようです。

とは言え、

FPoseSearchQueryTrajectory::FPoseSearchQueryTrajectory(const FTransformTrajectory& InTrajectory)

{

Samples.Reset(InTrajectory.Samples.Num());

for (int i = 0; i < InTrajectory.Samples.Num(); ++i)

{

Samples[i].Position = InTrajectory.Samples[i].Position;

Samples[i].Facing = InTrajectory.Samples[i].Facing;

Samples[i].AccumulatedSeconds = InTrajectory.Samples[i].TimeInSeconds;

}

}

はバグのように思えます。

お世話になっております。

大変お待たせいたしました。

FPoseSearchQueryTrajectoryコンストラクタの実装ミスの件、確かにご指摘の通りです。

フィードバック誠にありがとうございます。

他のライセンシー様からも同様の指摘を頂戴していることが分かりまして、開発チームのほうも事態を把握しており、今後対応に入る予定です。

大変ご迷惑をおかけしますが、しばらくの間、お手元で共有いただいたような形でパッチを当てて運用していただけますと幸いです。

(Reset()を呼ばず、SetNum()だけでも大丈夫なようです)

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

お世話になっております。

ご指摘いただいた件、//UE5/Main CL​43775910で正式な修正が行われましたので、ご連絡いたします。

PoseSearchIndex.cppのFSearchIndex::GetPoseValuesSafe()で呼び出されているBufferUsedForReconstruction.Reset()にも修正が入っており、それぞれSetNum()に置き替えられました。

​(第二パラメータにはEAllowShrinking::Noが指定されております​)

`FPoseSearchQueryTrajectory::FPoseSearchQueryTrajectory(const FTransformTrajectory& InTrajectory)
{

  • Samples.Reset(InTrajectory.Samples.Num());
  • Samples.SetNum(InTrajectory.Samples.Num()), EAllowShrinking::No);`開発チームからもフィードバックへの感謝を言付かっております。

ご協力誠にありがとうございました。