VRChat 非公式日本語ドキュメント


sidebar_position: 7

Constraints API

このページでは、VRChat Constraints のアプリケーションプログラミングインターフェースについて解説します。ここには、ワールド開発における Udon からの利用や、SDK ツール開発における C# からの利用が可能な、公開されているプロパティやメソッドが記載されています。

要件

このAPIを使用する前に、VRChat Constraintsの基本概念を理解しておく必要があります。

このページでドキュメント化されていないプロパティやメソッドの使用は避けてください。それらは予告なくパブリックインターフェースから削除される可能性があります。

コンストレイントの型

VRChatのコンストレイントには、以下のユーザー向け型が用意されています。これらはすべて VRC.SDK3.Dynamics.Constraint.Components 名前空間に含まれます。

また、VRC.Dynamics 名前空間には以下のサポートクラスも存在します。

制約(Constraint)のプロパティとメソッド

汎用プロパティとメソッド

すべてのVRChatの制約は、以下にリストされているプロパティを公開しています。これらは基本的にUnityの制約で利用可能なプロパティと同じですが、両者のインターフェースは同一ではなく、VRChatクライアントの動作をサポートするための構造的な違いがいくつかある点に注意してください。

ApplyConfigurationChanges()

このメソッドは、スクリプトを介して制約に加えられた変更を適用します。スクリプトで制約のプロパティを変更した後は、必ずこのメソッドを呼び出してください! そうしないと、変更が制約に反映されない可能性があります。 複数のプロパティを同時に変更する必要がある場合は、パフォーマンスへの影響を最小限に抑えるため、すべての変更が終わった後に一度だけこのメソッドを呼び出すようにしてください。

IsActive

機能的にはUnityの constraintActive プロパティと同じです。

GlobalWeight

機能的にはUnityの weight プロパティと同じです。

Locked

機能的にはUnityの locked プロパティと同じです。 制約は、プレイモードでは常にロックされているものとして扱われます。

Sources

例として、以下のコードサンプルでは、特定の制約に割り当てられたすべてのソースを反復処理し、それぞれのウェイトを変更してからリストに戻すことで、ウェイトをランダム化しています。

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);
warning

ソースリストには特別な制限があり、アバター上のアニメーターでターゲットにできるのは最初の16要素のみです。これは、Unityエンジンが配列の要素をアニメーション化する方法の性質と、ユーザーが作成した特定のアニメーションツールとの互換性を維持する必要があるためです。Avatars SDK用のツールを作成し、単一の制約に16個以上のソースを追加する予定がある場合は、この制限を念頭に置いておく必要があります。

TargetTransform

null に設定すると、制約は取り付けられているトランスフォーム自体に結果を適用します。

SolveInLocalSpace

Unityの制約は常にワールド空間で計算されます。

FreezeToWorld

このプロパティが false から true に切り替わった時点で制約は現在のポーズをキャプチャし、次に false に切り替わるまでその状態を維持しようとします。

RebakeOffsetsWhenUnfrozen

これは FreezeToWorld のサブプロパティであり、制約が凍結解除されたとき(つまり、FreezeToWorldtrue から false に切り替わるとき)の動作を制御します。

ActivateConstraint()

このメソッドを制約に対して呼び出すと、現在のオフセットを維持したまま、その制約をアクティブにしてロックします。エディターのインスペクターで制約の「Activate」ボタンを押す操作と同等です。

ZeroConstraint()

このメソッドを制約に対して呼び出すと、オフセットをデフォルト値にリセットしつつ、その制約をアクティブにしてロックします。エディターのインスペクターで制約の「Zero」ボタンを押す操作と同等です。

At-RestとOffsetの値

各タイプの制約はそれぞれ異なる方法でトランスフォーム(Transform)に影響を与えるため、それぞれ固有のAt-Rest値とOffset値を持ち、適切に命名されたプロパティからアクセスできます。例えば、Position Constraintには PositionAtRestPositionOffset があり、それぞれがソースからの距離を表します。一方、Rotation Constraintには RotationAtRestRotationOffset があり、それぞれがオイラー角のセットを表します。 Parent Constraintは特殊で、制約全体に影響する1つのオフセットを持つのではなく、ソースごとに1つのオフセット値を持っています。Parent Constraintに適用されるオフセットを変更するには、 Sources リストを通じて各ソースにアクセスし、その中の ParentPositionOffset プロパティと ParentRotationOffset プロパティを編集してください。

Aim Constraintのアライメント

これらはVRChatのAim Constraintに固有のプロパティで、ターゲットに対してどのように整列するかを制御します。

AimAxis

これは実質的に、どの方向を「前方」として扱うかを定義します。

UpAxis

制約は、この方向を後述の WorldUp で指定された上方向と一致させようとします。

WorldUpTransform

これは後述の WorldUp が特定の値である場合にのみ使用されます。

WorldUpVector

これは後述の WorldUp が特定の値である場合にのみ使用されます。

WorldUp

これは、このAim Constraintに対してどの方向を上方向として扱うかを決定する列挙型です。選択肢は以下の通りです。

WorldUpVRCConstraintBase.WorldUpType 型であり、これは VRC.Dynamics 名前空間内の列挙型です。

Look-At Constraintのアライメント

Aim Constraintと同様に、Look-At Constraintにもターゲットに対してどのように整列するかを制御するプロパティがあります。Look-At Constraintは、事実上、簡略化されたAim Constraintです。

Roll

このプロパティは、UseUpTransform が false の場合にのみ有効です。

WorldUpTransform

このプロパティは、UseUpTransform が true の場合にのみ有効です。

UseUpTransform

Constraint Conversion Hooks

info

このセクションは、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 を返してください。

最終更新: