Constraints-ja

From VRChat Wiki
Revision as of 03:07, 30 September 2026 by called D (talk | contribs) (VRChatにおける用途の節に「武器の持ち替えやワールド固定、補助ボーン、人外アバター等で用いられる」旨の記述を追加)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


Note: This page is NOT in the official namespace yet, and is subject to change.

コンストレイントとは、Unityにおいてゲームオブジェクトの位置、回転、スケールなどを他のゲームオブジェクトに関連付けるためのコンポーネント群である[1]。

VRChatはUnity標準のコンストレイント (以下、本稿では便宜的にUnity Constraintsと呼ぶ) に加え、独自実装であるVRChat Constraintsを提供している。VRChat ConstraintsはUnity標準の6種類[1]のコンストレイントに相当する機能を提供し、VRChatでの利用に合わせた追加機能を持つ[2]。

前史

VRChatの初期では、後にUnity 2018.1で導入されるUnity標準のコンストレイント自体がまだ存在していなかった[3][4]。 Unity標準のコンストレイントがアバターで利用可能になったのは、VRChatがUnity 2018へ移行した2020年である[5]。

しかし、それ以前にも、アバターに含まれるオブジェクトをワールド空間に固定する、いわゆる「ワールド固定」を実現するために複数の手法が用いられていた[6]。

  • 2018年には、Particle SystemのSimulation SpaceをWorldに設定し、Particle System Rendererで任意のメッシュを描画することで、アバターの移動から独立してパーティクルをワールド空間上に残す手法が用いられていた[7][8][9]。さらにParticle System RendererをMeshに設定し、任意のメッシュをパーティクルとして生成することで、アバターから独立したオブジェクトのように扱う方法も用いられていた[10]。2018年の日本語記事では、このような「ワールド座標シミュレーションのメッシュパーティクル」が、それまでワールド座標へ固定されたオブジェクトを表現する一般的な手法であったとされている[6]。この方式では同一のメッシュを複数生成できる一方、複雑なGameObjectをそのまま配置できないことや、メッシュの姿勢の扱いなどに制約があった[6]。
  • 同時期、RigidbodyおよびFixed Jointを利用してゲームオブジェクトそのものをワールド空間に固定する方法が利用されていた。Connected Bodyを指定しないFixed Jointを利用して仮想的なワールド座標系を作り、RigidbodyのIs Kinematicを切り替えることで、オブジェクトの固定とアバターへの追従を切り替えるものであった[6]。 この方式はVRChatの更新やワールドの設定などによって正常に動作しない場合があった[11]。
  • 2018年4月24日、VRChat 2018.1.1とともに配布されたSDKに、アバター上のワールド空間Particle SystemをIK計算後のボーン位置へ追従させるためのVRC_IKFollowerコンポーネントが追加された[12][13][14]。日本語圏でも、VRC_IKFollowerを利用するワールドパーティクルの作成方法が紹介されていた。しかし、VRC_IKFollowerは特定の階層以下に入れると視界に表示されなくなるという制約が存在した[15][注 1]。
  • Unity標準のコンストレイントが利用可能になる以前には、Fixed Jointのほか、有料UnityアセットのFinal IKをワールド固定に利用する方法も存在した[16]。2019年に公開され、2020年5月に更新された日本語の記事では、日本語圏ではFixed Jointを利用する方式が比較的多かったとされている[17]。
  • 2020年4月1日にリリースされたVRChat 2020.1.1では、VRChatのUnityバージョンがUnity 2018.4.20f1へ更新され、Aim Constraint、Look At Constraint、Parent Constraint、Position Constraint、Rotation ConstraintおよびScale ConstraintがSDK2のアバター用allowlistに追加された[5]。これ以降、Unity標準のコンストレイントを利用したワールド固定などの手法が用いられるようになった。
    • 2020年4月3日に公開された日本語の解説記事では、それ以前のFixed Joint方式と比較し、Constraintを利用する方式はワールド側の設定によって壊れないことが利点として挙げられている[18]。

VRChatにおける用途

アバターに組み込んだアイテム(武器など)の持ち替え、ワールド固定、補助ボーン、通常の人体の構成を外れた(いわゆる「人外」)アバターの偽物の腕や身体の制御などに用いられる。

VRChatのアバターでは、許可されたコンポーネント以外の任意のカスタムスクリプトを利用できない[19]。そのため、後述のVRChat Constraintsが導入される以前から、Unity標準のParent Constraintなどを仕込んでおき、擬似的にヒエラルキー上の親子関係を変更したような挙動を実現する手段が用いられていた。

ここでいう「擬似的」とは、実際にTransformの親子関係を変更するのではなく、コンストレイント対象のTransformの位置や回転を、指定したソースの子であるかのように評価することを指す。UnityのParent Constraintも、対象をHierarchy上で実際に子へ移動することなく、ソースの子であるかのように移動・回転させる[20]。

また、複数のUnity Constraintsを組み合わせ、アバター上のオブジェクトをワールド空間上の位置に固定する、いわゆる「World Constraint」も用いられていた。VRChatは後に、この用途を単一のコンストレイントで実現するFreeze To WorldをVRChat Constraintsへ追加している[21]。

VRChat Constraintsでは、このほかSolve In Local Spaceによるローカル空間での計算や、コンポーネント自身とは異なるTransformを操作対象にするTarget Transformなど、Unity標準のコンストレイントにはない機能も提供されている[2]。

歴史

  • 2024年5月2日: VRChatは、Unity標準のコンストレイントと同様に動作しながら、VRChatのアバター向けに最適化された独自のコンストレイントコンポーネントを開発中であることを発表した。また、Unity Constraintsをゲーム内で自動的にVRChat Constraintsへ変換する予定であることや、Solve In Local Spaceもこの時点で紹介された[22]。
  • 2024年5月30日: VRChat Constraintsの詳細な仕様が発表された。当初は複数の挙動を1つのコンポーネントで扱う実装だったものが、Unity標準のコンストレイントと同様に複数種類のコンポーネントへ分割された。また、SDKによるUnity Constraintsの自動変換や、Freeze To Worldなどが紹介された。この時点で開発は内部QAの終盤にあり、同年7月の公開を予定していた[21]。
  • 2024年7月24日: VRChat 2024.3.1 Build 1480のOpen BetaにVRChat Constraintsが導入された。VRChatはUnity標準実装より高い性能を特徴として挙げ、モバイル向けアバターでも利用可能になるとしていた。また、SDKによるUnity Constraintsからの自動変換もベータテストされた[23]。
  • 2024年8月14日: VRChat 2024.3.1 Build 1490が正式リリースされ、VRChat Constraintsがクライアントへ導入された。既存のアバターに含まれるUnity Constraintsについても、アバターのロード時にVRChat Constraintsへ自動変換されるようになった[24]。
  • 2024年8月16日: VRChat SDK version 3.7.0がリリースされ、アバター制作者がVRChat Constraintsを直接利用できるようになった。既存のUnity ConstraintsをSDK上で変換する機能も提供された[25]。
  • 2025年7月31日: VRChatは、PhysBonesおよびContactsとともにVRChat Constraintsをワールドでも利用できるようにする計画を発表した。また、ワールドではUdonからこれらのコンポーネントを操作できるようにする方針も示された[26]。
  • 2025年9月中旬頃: World Dynamicsのclosed community betaが開始され、PhysBones、Contacts、VRChat Constraintsのワールド対応についてコミュニティによるテストが行われた。9月25日のDeveloper Updateでは、約1週間前からclosed community betaを実施していると説明された[27]。
  • 2025年10月24日: VRChat SDK version 3.10.0がリリースされ、VRChat Constraintsを含むVRChat Dynamicsがワールドプロジェクトで利用可能になった。これらをUdonから操作するAPIおよびイベントも追加された。このリリースはベータ期間中にはversion 3.9.1として開発されていたが、互換性のないAPI変更のため3.10.0へ変更された[28]。
  • 2025年11月3日: VRChat 2025.4.1 Build 1749が正式リリースされ、ワールド上のPhysBones、ContactsおよびVRChat Constraintsにクライアントが正式対応した[29]。

トリビア

  • VRChat SDKの「Auto Fix」を使うと、アップロード対象のアバターに含まれるUnity ConstraintsをVRChat Constraintsへ変換できる。この変換では、コンストレイント本体だけでなく、それを参照しているアニメーションクリップのバインディングも変換できる。SDK内部ではVRC.SDK3.Avatars.AvatarDynamicsSetupクラスの変換処理が利用されている[30]。
  • Modular AvatarのConvert Constraintsコンポーネントでも、Unity Constraintsおよびそれを参照するアニメーションをビルド時に非破壊的にVRChat Constraintsへ変換できる。Modular Avatarがインストールされている場合、VRChat SDKのAuto Fixは必要に応じてこのコンポーネントをアバターのルートへ追加する[31]。
  • VRChat Constraintsでは、1つのコンストレイントに17個以上のソースを持たせること自体は可能である。ただし、アバターではAnimatorから操作できるのはSourcesリストの先頭16個までに制限されている[30]。

参考資料

注釈

  1. ↑ この現象は、Head Chopコンポーネントのドキュメンテーション に存在する「When wearing an avatar, VRChat automatically "chops off" the avatar's head bone by setting its transform scale to almost 0.」の影響を受けていた可能性がある

出典

  1. ↑ 1.0 1.1 Unity - マニュアル: Constraints, accessed September 29, 2026.
  2. ↑ 2.0 2.1 Constraints | VRChat Creation, accessed September 29, 2026.
  3. ↑ Unity 2018.1.0f1, accessed September 29, 2026.
  4. ↑ Constraints - Animation feature - Feedback - Unity Discussions, accessed September 29, 2026.
  5. ↑ 5.0 5.1 Patch Notes - 2020, accessed September 29, 2026.
  6. ↑ 6.0 6.1 6.2 6.3 アイテムをアバターから切り離しワールド固定にする方法(パーティクル不使用版)【VRChat技術情報】 - VRChatパブリックログ, accessed September 29, 2026.
  7. ↑ VRChatでマヨネーズを絞り出す(ワールド座標パーティクル解説) - ビログ, accessed September 29, 2026.
  8. ↑ パーティクル芸例 - VRChat 技術メモ帳 - VRChat tech notes, accessed September 29, 2026.
  9. ↑ 伸縮するワイヤーの表現方法(&物置きの応用)【VRChat技術情報】 - VRChatパブリックログ, accessed September 29, 2026.
  10. ↑ VRChatでみんなにおにぎりを配る(メッシュパーティクルで複数同時ワールド固定解説) - ビログ, accessed September 29, 2026.
  11. ↑ Fixed Joint/Rigid Body Drag/Angular Drag Problem | Bug Reports | VRChat, accessed September 29, 2026.
  12. ↑ Patch Notes - 2018, accessed September 29, 2026.
  13. ↑ VRC_IKFollower, accessed September 29, 2026.
  14. ↑ VRC_IKFollower - Programming in VRChat, accessed September 29, 2026.
  15. ↑ 元怒 (@gend_VR) on X, accessed September 29, 2026.
  16. ↑ VRCでFinal_IKを使う(初心者向け?) - Qiita, accessed September 29, 2026.
  17. ↑ パーティクルライブ・パリピ砲 作成の基礎知識について - バーチャル思考実験室, accessed September 29, 2026.
  18. ↑ VRCでConstraintを使ったワールド固定&ピックアップ(Unity2018対応)|Beryllin, accessed September 29, 2026.
  19. ↑ Allowed Avatar Components | VRChat Creation, accessed September 29, 2026.
  20. ↑ Unity - マニュアル: Parent Constraint, accessed September 29, 2026.
  21. ↑ 21.0 21.1 Developer Update - 30 May 2024 - Dev Updates - VRChat Ask Forum, accessed September 29, 2026.
  22. ↑ Developer Update - 2 May 2024 - Dev Updates - VRChat Ask Forum, accessed September 29, 2026.
  23. ↑ VRChat 2024.3.1 (BETA), accessed September 29, 2026.
  24. ↑ VRChat 2024.3.1, accessed September 29, 2026.
  25. ↑ Release 3.7.0 | VRChat Creation, accessed September 29, 2026.
  26. ↑ Developer Update - 31 July 2025 - Dev Updates - VRChat Ask Forum, accessed September 29, 2026.
  27. ↑ Developer Update - 25 September 2025 - Dev Updates - VRChat Ask Forum, accessed September 29, 2026.
  28. ↑ Release 3.10.0 | VRChat Creation, accessed September 29, 2026.
  29. ↑ VRChat 2025.4.1, accessed September 29, 2026.
  30. ↑ 30.0 30.1 Constraints API | VRChat Creation, accessed September 29, 2026.
  31. ↑ Convert Constraints | Modular Avatar, accessed September 29, 2026.