sidebar_position: 7
Constraints API
このページでは、VRChat Constraints のアプリケーションプログラミングインターフェースについて解説します。ここには、ワールド開発における Udon からの利用や、SDK ツール開発における C# からの利用が可能な、公開されているプロパティやメソッドが記載されています。
要件
このAPIを使用する前に、VRChat Constraintsの基本概念を理解しておく必要があります。
このページでドキュメント化されていないプロパティやメソッドの使用は避けてください。それらは予告なくパブリックインターフェースから削除される可能性があります。
コンストレイントの型
VRChatのコンストレイントには、以下のユーザー向け型が用意されています。これらはすべて VRC.SDK3.Dynamics.Constraint.Components 名前空間に含まれます。
- VRCAimConstraint
- VRCLookAtConstraint
- VRCParentConstraint
- VRCPositionConstraint
- VRCRotationConstraint
- VRCScaleConstraint
また、VRC.Dynamics 名前空間には以下のサポートクラスも存在します。
- VRCConstraintSource - コンストレイントのソースを1つ保持するクラスで、
SourceTransformとWeightを含みます。 - VRCConstraintSourceKeyableList - コンストレイントで使用されるソースのリストです。
制約(Constraint)のプロパティとメソッド
汎用プロパティとメソッド
すべてのVRChatの制約は、以下にリストされているプロパティを公開しています。これらは基本的にUnityの制約で利用可能なプロパティと同じですが、両者のインターフェースは同一ではなく、VRChatクライアントの動作をサポートするための構造的な違いがいくつかある点に注意してください。
ApplyConfigurationChanges()
このメソッドは、スクリプトを介して制約に加えられた変更を適用します。スクリプトで制約のプロパティを変更した後は、必ずこのメソッドを呼び出してください! そうしないと、変更が制約に反映されない可能性があります。 複数のプロパティを同時に変更する必要がある場合は、パフォーマンスへの影響を最小限に抑えるため、すべての変更が終わった後に一度だけこのメソッドを呼び出すようにしてください。
IsActive
bool: 現在制約が評価されている場合はtrue、それ以外の場合はfalseとなります。
機能的にはUnityの constraintActive プロパティと同じです。
GlobalWeight
float: この制約のグローバルウェイトで、すべてのソース(各ソースにも個別のウェイトがあります)の上に適用されます。
機能的にはUnityの weight プロパティと同じです。
Locked
bool: 現在制約がロックされている場合はtrue、ロック解除されている場合はfalseとなります。
機能的にはUnityの locked プロパティと同じです。 制約は、プレイモードでは常にロックされているものとして扱われます。
Sources
VRCConstraintSourceKeyableList: この制約に属するソースのリストです。
例として、以下のコードサンプルでは、特定の制約に割り当てられたすべてのソースを反復処理し、それぞれのウェイトを変更してからリストに戻すことで、ウェイトをランダム化しています。
for (int i = 0; i < constraint.Sources.Count; i++)
{
VRCConstraintSource source = constraint.Sources[i];
source.Weight = UnityEngine.Random.value;
constraint.Sources[i] = source;
}
ソースリストを取得し、Add() を呼び出すことで、プログラムから制約にソースを追加できます。
// Create a new constraint source targeting this transform with a weight of one.
VRCConstraintSource source = new VRCConstraintSource(transform, 1.0f);
// Add this source to a constraint.
constraint.Sources.Add(source);
ソースを削除するには、追加時と同じソース構造体を使用して Remove() を使用するか、インデックスを指定して既存の特定のソースを検索し、RemoveAt() を使用します。
// Remove a specific source...
constraint.Sources.Remove(source);
// ...Or remove a source at a particular index i.
constraint.Sources.RemoveAt(i);
ソースリストには特別な制限があり、アバター上のアニメーターでターゲットにできるのは最初の16要素のみです。これは、Unityエンジンが配列の要素をアニメーション化する方法の性質と、ユーザーが作成した特定のアニメーションツールとの互換性を維持する必要があるためです。Avatars SDK用のツールを作成し、単一の制約に16個以上のソースを追加する予定がある場合は、この制限を念頭に置いておく必要があります。
TargetTransform
Transform: この制約コンポーネントの結果によって影響を受けるトランスフォームです。
null に設定すると、制約は取り付けられているトランスフォーム自体に結果を適用します。
SolveInLocalSpace
bool: この制約がローカル空間で計算される場合はtrue、ワールド空間で計算される場合はfalseとなります。
Unityの制約は常にワールド空間で計算されます。
FreezeToWorld
bool: この制約が現在ワールド空間内の固定された位置/回転/スケールを維持しようとしている場合はtrue、それ以外の場合はfalseとなります。
このプロパティが false から true に切り替わった時点で制約は現在のポーズをキャプチャし、次に false に切り替わるまでその状態を維持しようとします。
RebakeOffsetsWhenUnfrozen
bool: 制約が凍結解除されたときにソースからのオフセットを再計算すべき場合はtrue、元のオフセットを保持すべき場合はfalseとなります。
これは FreezeToWorld のサブプロパティであり、制約が凍結解除されたとき(つまり、FreezeToWorld が true から false に切り替わるとき)の動作を制御します。
ActivateConstraint()
このメソッドを制約に対して呼び出すと、現在のオフセットを維持したまま、その制約をアクティブにしてロックします。エディターのインスペクターで制約の「Activate」ボタンを押す操作と同等です。
ZeroConstraint()
このメソッドを制約に対して呼び出すと、オフセットをデフォルト値にリセットしつつ、その制約をアクティブにしてロックします。エディターのインスペクターで制約の「Zero」ボタンを押す操作と同等です。
At-RestとOffsetの値
各タイプの制約はそれぞれ異なる方法でトランスフォーム(Transform)に影響を与えるため、それぞれ固有のAt-Rest値とOffset値を持ち、適切に命名されたプロパティからアクセスできます。例えば、Position Constraintには PositionAtRest と PositionOffset があり、それぞれがソースからの距離を表します。一方、Rotation Constraintには RotationAtRest と RotationOffset があり、それぞれがオイラー角のセットを表します。
Parent Constraintは特殊で、制約全体に影響する1つのオフセットを持つのではなく、ソースごとに1つのオフセット値を持っています。Parent Constraintに適用されるオフセットを変更するには、 Sources リストを通じて各ソースにアクセスし、その中の ParentPositionOffset プロパティと ParentRotationOffset プロパティを編集してください。
Aim Constraintのアライメント
これらはVRChatのAim Constraintに固有のプロパティで、ターゲットに対してどのように整列するかを制御します。
AimAxis
Vector3: ソースに向けるべき軸。
これは実質的に、どの方向を「前方」として扱うかを定義します。
UpAxis
Vector3: この制約によって「上方」として扱われる軸。
制約は、この方向を後述の WorldUp で指定された上方向と一致させようとします。
WorldUpTransform
Transform: 制約の上方向ベクトルを決定するために使用されるトランスフォーム。
これは後述の WorldUp が特定の値である場合にのみ使用されます。
WorldUpVector
Vector3: 制約の上方向ベクトルを決定するために使用される方向。
これは後述の WorldUp が特定の値である場合にのみ使用されます。
WorldUp
これは、このAim Constraintに対してどの方向を上方向として扱うかを決定する列挙型です。選択肢は以下の通りです。
WorldUpType.SceneUp: シーンの正のY軸(Vector3.up)を上方向として扱います。WorldUpType.ObjectUp: 制約のターゲットトランスフォームから、WorldUpTransformプロパティで指定されたトランスフォームに向かうベクトルを上方向として扱います。WorldUpType.ObjectRotationUp:WorldUpTransformで指定されたトランスフォームのローカル空間におけるWorldUpVector軸を上方向として扱います。WorldUpType.Vector: ワールド空間におけるWorldUpVectorを上方向として扱います。WorldUpType.None: 上方向を定義しません。
WorldUp は VRCConstraintBase.WorldUpType 型であり、これは VRC.Dynamics 名前空間内の列挙型です。
Look-At Constraintのアライメント
Aim Constraintと同様に、Look-At Constraintにもターゲットに対してどのように整列するかを制御するプロパティがあります。Look-At Constraintは、事実上、簡略化されたAim Constraintです。
Roll
float: 上方向を決定するために使用する、制約のZ軸を中心とした角度(度単位)を定義します。
このプロパティは、UseUpTransform が false の場合にのみ有効です。
WorldUpTransform
Transform: 制約がロール(回転)する対象のトランスフォーム。
このプロパティは、UseUpTransform が true の場合にのみ有効です。
UseUpTransform
bool: 制約の傾きを決定するためにRollの値を使用する場合はfalseを設定します。正のY軸をWorldUpTransformで指定されたトランスフォームに向けようとする場合はtrueを設定します。
Constraint Conversion Hooks
このセクションは、UnityのConstraint(制約)がアバター上でVRChatのConstraintに変換される仕組みを変更したいユーザーのみを対象としています。 このセクションで説明する機能は、Udonスクリプトには適用されません。
Constraintコンバーターは、SDKがUnityのConstraintをVRChatのConstraintへ自動的に変換する際に実行されます。SDKのConstraintコンバーターと連携する独自のC#カスタムエディターツールを作成することが可能です。 このセクションでは概要のみを説明しているため、詳細については各ユーティリティのインラインドキュメントを参照してください。
Conversion Methods
SDKのクラス AvatarDynamicsSetup には、UnityのConstraintを対応するVRChatのConstraintへ変換するためにSDKが使用する変換メソッドが含まれています。ユーザーのツール向けに、以下のConstraint変換メソッドが公開されています。
| Method | Description |
|---|---|
ConvertUnityConstraintsAcrossGameObjects(List<GameObject> targetGameObjects) |
GameObjectのリスト上にあるUnityのConstraintをVRChatのConstraintに変換します。 |
ConvertUnityConstraintsAcrossAnimationClips(List<AnimationClip> targetAnimationClips) |
AnimationClipのリストを修正し、UnityのConstraintをターゲットにしているトラックを、VRChatのConstraintをターゲットにするように更新します。 |
DoConvertUnityConstraints(IConstraint[] unityConstraints, VRCAvatarDescriptor avatarDescriptor, bool convertReferencedAnimationClips) |
UnityのConstraintの配列をVRChatのConstraintに変換します(オプションで参照されているアニメーションクリップを含めることも可能です)。確認ダイアログなしで即座に実行されます。 |
RebindConstraintAnimationClip(AnimationClip clip, IConstraint oldConstraint) |
単一のアニメーションクリップを修正し、ターゲットをUnityのConstraintからVRChatのConstraintへ変更します。オプションで、指定したUnityのConstraintのみに変換を限定することも可能です。 |
TryGetSubstituteAnimationBinding(Type unityConstraintType, string unityConstraintPropertyName, out Type vrcConstraintType, out string vrcConstraintPropertyName, out bool isArrayProperty) |
UnityのConstraintのプロパティ名と型を、対応するVRChatのConstraintのプロパティ名と型に変換を試みます。 |
Conversion Delegates
上記のメソッドを補完するために、クラス AvatarDynamicsSetup では、ツール側からコンバーターの動作を制御できるデリゲート関数も提供されています。利用可能なデリゲートは以下の通りです。
| デリゲート | 説明 |
|---|---|
bool IsUnityConstraintAutoConverted(IConstraint constraint) |
Unityのconstraintを指定し、そのconstraintがビルド時にユーザーツールによってVRChatのconstraintに変換される予定であれば true を返します。これを利用して、UnityのconstraintをVRChatのconstraintに変換するようユーザーに促す、SDKが通常生成するバリデーション警告を抑制できます。 |
bool ConvertUnityConstraintsAcrossGameObjects(List<GameObject> gameObjects, bool isAutoFix) |
GameObjectのリストを指定し、それらに含まれるすべてのconstraintと基となるアニメーションクリップをVRChatのconstraintに変換します。isAutoFix パラメーターは、バリデーションリストでユーザーが自動修正をクリックしたことでトリガーされた場合は true に、メニュー項目やカスタムユーザースクリプトからトリガーされた場合は false に設定されます。ネイティブSDKコンバーターの実行を回避するには true を返してください。 |
bool ConvertUnityConstraintsAcrossAnimationClips(List<AnimationClip> animationClips) |
アニメーションクリップのリストを指定し、Unityのconstraintを参照しているすべてのトラックを、VRChatのconstraintを参照するように更新します。ネイティブSDKコンバーターの実行を回避するには true を返してください。 |
最終更新: