メインコンテンツまでスキップ

GetRuntimeNodeInfosOnComponent

未正式リリース

この機能はまだ正式リリースされていません。KawaiiPhysics v1.22でリリース予定です。開発中のため仕様が変更される場合があります。

概要​

髪が体へ食い込むとき、画面だけでは、入力の姿勢・揺れた後の位置・当たり判定の大きさのどこを見直すべきか分からないことがあります。設定を変えて再生するだけでは、動いているボーンと、設定した衝突形状の対応も追いにくくなります。

Runtime診断では、直近の計算結果からボーン位置・半径・衝突形状の情報を取得できます。元の位置と揺れた後の位置を比べ、想定と違う値を調査する材料にできます。食い込みの原因を自動で判定する機能ではありません。

APIは診断データを返します。図のような描画や記録UIは呼び出し側で実装します。

入力ポーズの点線チェーンと評価後のオレンジ色チェーンを重ね、実効半径の円と青い衝突カプセルを比較する概念図
診断データの読み方を示す概念図。点線は入力位置、オレンジは評価後位置と実効半径、青はコリジョン。UE画面や実測結果ではありません。

GetRuntimeNodeInfosOnComponentの呼び出し​

BlueprintのKawaii Physicsカテゴリにある関数へ、対象MeshComp、FilterTags、bFilterExactMatchを渡します。出力はOutInfosとOutError、戻り値はノード数です。C++の宣言は次のとおりです。

static int32 GetRuntimeNodeInfosOnComponent(
USkeletalMeshComponent* MeshComp,
const FGameplayTagContainer& FilterTags,
bool bFilterExactMatch,
TArray<FKawaiiPhysicsRuntimeNodeInfo>& OutInfos,
FString& OutError);
  1. GameThreadで対象ComponentのTick後に呼びます。並列アニメーション評価中には呼ばないでください。単に同じActorのTickに置くだけで順序を保証したことにはなりません。
  2. 空のFilterTagsは全KawaiiPhysicsノードを対象にします。本体AnimInstance、Linked AnimInstance、PostProcessを走査します。完全一致が必要な場合はbFilterExactMatch = trueを指定します。
  3. -1ならOutErrorを確認します。0は一致ノードがない状態、正数は結果配列の件数です。関数は呼び出しごとに出力配列・エラーをリセットします。
  4. 各結果のbEvaluatedを確認してから位置を使用します。未評価ならBones/Limitsの位置に意味はありません。

bEvaluatedは直近の評価で使った変換キャッシュの有無で、そのフレームに評価されたことを示す時刻ではありません。

取得できる情報​

結果主な内容
FKawaiiPhysicsRuntimeNodeInfoAnimInstanceClassName、NodeIndex、RootBone、Tag、SimulationSpace、bEvaluated、SimulationToComponent
Bonesボーン名、配列内Index/ParentIndex、物理後Location、入力ポーズPoseLocation、実効Radius、LengthRateFromRoot、bSkipSimulate
Limits形状、出典、元配列名・Index、追従ボーン、有効状態、位置・回転・寸法
Constraints接続するボーンIndex・名前、AnimNode/DataAsset/AutoDummyの出典

位置と寸法はComponent Space、距離単位はcmです。半径には一時設定倍率を反映します。bNonUniformScale = trueなら半径・寸法は近似であり、診断値を厳密な形状として扱わないでください。

ダミーボーンのBoneNameはNoneで、DummyTypeにTip(末端)、InterBone(実ボーン間)、Bridge(横拘束上)が入ります。ParentIndexや拘束のIndexはBones配列を参照し、Skeletonのボーン番号とは異なります。bSkipSimulateはチェーン根元など、入力ポーズに固定されるボーンを示します。

コリジョンデータの制約​

LimitsのSourceArrayName/SourceIndexは元設定との照合用です。bEnabledは単なる設定フラグではなく、無効設定・寸法などを考慮した直近評価での使用状態です。CapsuleのStartは+Z側、Endは-Z側で、Tapered CapsuleはRadius0/Radius1を持ちます。Boxは半サイズExtent、PlaneはPlaneNormal、内側SphereはbInnerSphereで識別します。

Convexの形状はLimitsに含みません。 NumConvexLimitsでSimple World CollisionのConvex件数、ConvexFallbackShapeで代替形状設定を取得します。診断の描画にConvexが出ないことを、衝突自体がない証拠としないでください。

  • GetSimpleWorldColliderCountとGetSimpleWorldColliderCountOnComponentはSphere/Capsule/TaperedCapsule/Boxに加え、地面BoxとConvexを含む件数です。後者は一致ノードの合計で、同じ共有形状を複数ノードが使う場合の「一意なワールド形状数」ではありません。
  • GetSimpleWorldCollisionDebugInfoは収集件数や地面ソースなど、Subsystem側の情報を読むGameThread専用・DevelopmentOnly APIです。ノード未初期化、機能OFF、Shipping等でEntryがなければfalseです。
  • GetSharedPublisherDebugInfoもGameThread専用で、Publisherの診断を取得します。未初期化・Shipping等でEntryがなければfalseです。

収集の仕組みはSimple World Collision、アセット設定の一覧化はKawaii Node Auditを参照してください。監査はエディタ設定、ここでは実行時評価結果を扱います。

関連するUE公式ドキュメント​