AvatarPoseSystem(ZeroFactory)が張るトラッキング用 constraint を、ポーズを固定していない間は止めておく NDMF プラグイン。
APS 本体には一切手を入れない。NDMF の AfterPlugin で後段に挟まるだけなので、APS が更新されても追従する。
APS はポーズ固定機能のために、ヒューマノイド全ボーンぶんのクローン骨格を作り、それを実際の体へ追従させる constraint を張る。この constraint は「固定していない間」ずっと毎フレーム動いている。
固定していない時間のほうが圧倒的に長いので、そこを止める。
0.2.0-alpha 時点の実測(ミルフィ素体 + ギミック7種、Play モードで 240 フレーム平均):
| 構成 | フレーム時間 | VRCConstraintJob |
|---|---|---|
| そのまま | 12.80 ms | 2.41 ms |
| kieApsGate あり | 10.97 ms | 1.49 ms |
| APS を丸ごと削除 | 9.97 ms | 0.63 ms |
数字はアバター構成で変わる。APS のハンドルが多いほど効く。
この数値を出すには
PhysBone を含むサブツリーもゲートするを入れること。 0.3.0-alpha で PhysBone を含むサブツリーを対象外にしたため、既定のままでは ゲートできる constraint が 10 個にとどまる(上記は 50 個ゲートした時の数値)。 0.4.0-alpha でその 53 個を安全に落とす方法が入った。フレーム時間は未再計測。
入れただけでは何もしない。 有効にする方法が 2 つある。
アバター単位 — そのアバターのルートへ Add Component > Kie > kieApsGate を付ける。
プロジェクト単位 — Tools > kieApsGate > プロジェクト全体で有効化 にチェックを入れる。
コンポーネントが付いていればそれが優先される。つまり全体を有効にしたうえで、特定のアバターだけコンポーネントを付けてチェックを外せば、そこだけ除外できる。
| 状態 | 動作 |
|---|---|
| 入れただけ | 何もしない |
| コンポーネントを付ける | そのアバターだけ有効 |
| 全体で有効化 | 全アバター有効 |
| 全体で有効化 + コンポーネントのチェックを外す | そのアバターだけ除外 |
どちらも既定はオフ。どちらもコンポーネントを付けたアバターにだけ効く。
PhysBone を含むサブツリーもゲートする — ゲートできる constraint が実測で
10 個 → 53 個に増える。効果を出したいならこれを入れる。
対象内の PhysBone の Reset When Disabled を強制的にオフにしたうえで落とすので、
復帰時に姿勢を捨てない(オフにしないと固定した瞬間に揺れものがレスト位置で固まる)。
揺れ物固定をその場の姿勢で行う — アバター全体の PhysBone の
Reset When Disabled をオフにする。APS の揺れ物固定が、レスト位置へ戻らず
その場の姿勢で固まるようになる。ゲートとは無関係な、APS 側の挙動の修正。
ミルフィ本番構成では 49 個中 19 個の PhysBone が
Reset When Disabledオンで、 揺れ物を固定した瞬間に変位の約 7 割を失っていた(Play モードで実測)。 このオプションを入れると 100% 保持される。PhysBone がリセットされる前提の他ギミックがある場合はオフのままにすること。
有効なとき、ビルド時に Console へこう出る:
[APS Gate] 候補 58 件
[APS Gate] クローン骨格 'AvatarPoseSystem/WorldFix' もゲート
[APS Gate] 50 個のトラッキング constraint を APS_FixBody でゲートしました
「候補 0 件」なら効いていない。APS の実装が変わったサイン。
APS は「未固定=1 / 固定=0」で constraint の m_Enabled をアニメーションする。つまり 固定時に APS 自身が切る constraint = クローンを体へ追従させるためだけのもの。これを生成済みクリップのバインディングから引いて、対象を名前に依存せず特定する。
対象を SetActive(false) にしたうえで、m_IsActive を APS_FixBody で 0/1 する 1 レイヤーを FX へ合流させる。APS は m_Enabled、こちらは m_IsActive を触るのでプロパティが衝突しない。
固定の瞬間にクローンが追いついている必要があるが、APS の遷移は Unfix → Prepare → Prepare2 → Fix と 2 フレームの猶予があり、ParentConstraint はステートレスなので 1 回評価すればソースへスナップする。
APS が m_Enabled を触っていない constraint には手を出さない。 Head_Const のように実ボーンを保持しているものが含まれ、これを止めると解除後も実ボーンが古いクローンに引かれたままになる(メッシュが戻らない/姿勢を変えるとボーンが引き伸ばされる)。
Tools > kieApsGate > プロジェクト全体で有効化 の状態は EditorPrefs に保存される(プロジェクトではなくユーザー単位)。プロジェクトと一緒に共有したいならコンポーネントを使うこと。PhysBone を含むサブツリーもゲートする を
常用する前に一度 in-game で確認することを勧める。MIT
com.kie.kie-aps-gate
Undefined
1.0.0 (Changelog)
2022.3 or later
No dependencies
No legacy packages