Position Scale Correctionは、GameObjectのX、Y、Zいずれかのスケールを変更したときに発生する見た目上の同軸方向の移動を、対応するローカルPositionの変更で補正するEditor専用パッケージです。
>=1.14.3 <2.0.0-aScaleXPositionCompensatorScaleYPositionCompensatorScaleZPositionCompensatorlocalPositionとlocalScaleが基準値として保存されます。同時に、非アクティブを含む子のSkinnedMeshRenderer.rootBoneから固定基準を検出し、その軸の補正係数を自動算出します。0になり、Inspectorに表示される警告に従って係数を手動入力します。基準値を変更したい場合は、必要に応じて一度コンポーネントを無効にし、Transformを目的の位置とスケールへ変更してから、現在値を基準として取得を押してください。その後コンポーネントを有効に戻します。コンポーネントが有効な間に対象軸のPositionだけを直接変更した場合、その値は補正式から求めたPositionへ戻ります。
自動算出をやり直す場合は補正係数を再度自動算出を押してください。手動で補正係数を変更すると手動設定へ切り替わり、検出した固定基準Transformの表示と自動算出失敗の警告は解除されます。既存のコンポーネントへ追加後の自動算出が勝手に適用されることはなく、保存済みの係数は維持されます。
自動算出は、子のSkinnedMeshRendererに設定された非nullのrootBoneが1つ以上あり、それらがすべて同じTransformを参照し、そのTransformが補正対象自身またはその子にある場合に成功します。複数の異なるrootBoneがある場合や、固定基準が対象階層の外にある場合は算出しません。固定するのは、検出したTransformの親ローカル座標系における対象軸の位置です。
固定基準の対象ローカル座標で対象軸成分が0の場合など、自動算出が成功して補正係数が正しく0になることがあります。この場合は算出失敗ではないため、手動入力を促す警告は表示されません。
各コンポーネントは、対応するScale軸の変化を同じPosition軸だけで補正します。補正対象のRotationによってScale軸が親ローカル空間の別軸にも影響する場合、その別軸方向の移動は補正しません。そのため、回転したGameObjectでの比例スケールやX/Y/Zの同時変更では、固定基準の3次元位置全体が完全には固定されないことがあります。
対象軸をA(X、Y、Zのいずれか)とすると、Position Aは保存された基準値から毎回次の式で求めます。
補正後Position A
= 基準Position A
+ (現在のScale A - 基準Scale A) × A補正係数
自動算出時の係数は、固定基準の対象ローカル座標と対象GameObjectのlocalRotationから求めます。
A補正係数
= -(localRotation × (軸Aの単位ベクトル × 固定基準LocalPosition A)).A
差分を積み上げず基準値から再計算するため、スケール操作を繰り返しても補正誤差が累積しにくい方式です。画像やScene固有のPosition、Scaleはハードコードされません。
NDMFのResolvingフェーズで、ビルド用の複製に対して処理します。
ビルド後のアバターにX/Y/ZのPosition補正コンポーネントは残りません。
バージョン0.1.0では、次の機能は対象外です。
Mozilla Public License 2.0です。詳細はLICENSE.mdを参照してください。
com.gokoukotori.position-scale-correction
Undefined
0.1.0
2022.3 or later
No dependencies
No legacy packages
Gokoukotori