Assembly Definition Fileベストプラクティス
基本的なasmdef設定構造
VRChat SDK開発におけるasmdefファイルの適切な設定は、プロジェクトの保守性と拡張性において極めて重要です[5][7][8]。以下は推奨される基本構造です:
{ "name": "com.example.vrchat.tool.runtime", "references": [ "nadena.dev.ndmf.runtime", "VRC.SDKBase", "VRC.SDK3A" ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": true, "overrideReferences": true, "precompiledReferences": [ "VRCSDKBase.dll", "VRCSDK3A.dll", "VRC.Dynamics.dll" ], "autoReferenced": true, "defineConstraints": [], "versionDefines": [ { "name": "com.vrchat.base", "expression": "", "define": "VRC_SDK_BASE" } ], "noEngineReferences": false }
Runtime vs Editor Assemblyの分離
VPM(VRChat Package Manager)開発では、RuntimeとEditorのAssemblyを明確に分離することが重要です[5]。Runtime Assemblyは実行時に必要な機能を含み、Editor Assemblyは開発時のツールやウィンドウを含みます。
Runtime Assembly設定例:
{ "name": "com.github.example.tool.runtime", "references": [ "nadena.dev.ndmf.runtime" ], "includePlatforms": [], "excludePlatforms": [] }
Editor Assembly設定例:
{ "name": "com.github.example.tool.editor", "references": [ "nadena.dev.modular-avatar.core", "nadena.dev.ndmf", "VRC.SDK3A.Editor", "com.github.example.tool.runtime" ], "includePlatforms": [ "Editor" ] }
Version Definesによる互換性制御
VRChat SDKの検出にはVersion Definesの使用が強く推奨されます[10]。従来のスクリプトシンボル(VRC_SDK_VRCSDK3、UDON)は非推奨となり、将来的に削除予定です。
推奨されるVersion Defines設定:
{ "versionDefines": [ { "name": "com.vrchat.base", "expression": "", "define": "YOUR_VRCSDK_BASE" }, { "name": "com.vrchat.avatars", "expression": "", "define": "YOUR_VRCSDK_AVATARS" }, { "name": "com.vrchat.worlds", "expression": "", "define": "YOUR_VRCSDK_WORLDS" } ] }
UdonSharp Assembly Definition設定
UdonSharp開発では、U# Assembly Definitionの適切な設定が必要です[17]。Package側でU#スクリプトを開発する際は、通常のasmdefに加えてU# Assembly Definitionファイルも作成する必要があります。
U# Assembly Definition設定手順: 1. 右クリックメニューからU# Assembly Definitionを作成 2. 既存のasmdefファイルを指定 3. Runtime配下にasmdefを配置(公式ドキュメントの規則に従う)
互換性維持とマイグレーション戦略
レガシーSDK検出コード
VPMベースSDK(UPMパッケージとして扱われる)とレガシー.unitypackageベースSDKの両方をサポートする場合は、以下のようなフォールバック機能を実装できます[10]:
#if !YOUR_VRCSDK3_AVATARS && !YOUR_VRCSDK3_WORLDS && VRC_SDK_VRCSDK3 #if UDON #define YOUR_VRCSDK3_WORLDS #else #define YOUR_VRCSDK3_AVATARS #endif #endif
AssetBundle互換性の考慮
既存のAssetBundleとの互換性を維持しながらasmdefを適用する場合は、慎重なアプローチが必要です[7]。MonoBehaviourを継承したクラスを直接asmdef化せず、内部ロジックのみを別クラスとして抽出し、asmdef配下に配置する手法が推奨されます。
CleanArchitectureにおけるasmdef活用
大規模なVRChatプロジェクトでは、CleanArchitectureパターンとasmdefを組み合わせることで、レイヤー間の依存関係を制御できます[8]。各レイヤーに対応するasmdefを定義し、不適切な依存関係をコンパイル時に検出できます。
Public SDK APIの活用
SDK Builder APIアクセス
VRChat SDKは公式のPublic SDK APIを提供しており、ビルドプロセスのカスタマイズが可能です[9]。適切なassembly definition referencesを設定することで、これらのAPIにアクセスできます:
- アバター用:
VRC.SDK3A.Editor - ワールド用:
VRC.SDK3.Editor - 共通:
VRC.SDKBase.Editor
ビルドイベントハンドリング
ビルド開始/終了イベント、アップロード成功/エラーイベントなどを監視し、カスタムビルドフローを実装できます:
[InitializeOnLoadMethod]
public static void RegisterSDKCallback()
{
VRCSdkControlPanel.OnSdkPanelEnable += AddBuildHook;
}
private static void AddBuildHook(object sender, EventArgs e)
{
if (VRCSdkControlPanel.TryGetBuilder(out var builder))
{
builder.OnSdkBuildStart += OnBuildStarted;
}
}
結論
適切なAssembly Definition File設定は、これらの新機能を活用する上で不可欠です。Runtime/Editorの分離、Version Definesによる互換性制御、UdonSharp対応など、各要素を適切に設定することで、保守性と拡張性の高いVRChatコンテンツ開発が実現できます。
Citations: [1] https://creators.vrchat.com/releases/ [2] https://vr-lifemagazine.com/vrchat-upd202521/ [3] https://creators.vrchat.com/worlds/udon/networking/events/ [4] https://vrc-beta-docs.netlify.app/avatars/per-platform-avatar-overrides/ [5] https://qiita.com/pandrabox/items/6d99e439245892aac016 [6] https://creators.vrchat.com/releases/release-3-7-6/ [7] https://qiita.com/mhama/items/13db54ceb5978805fd2f [8] https://qiita.com/naninunenoy/items/07bc2088877318771565 [9] https://creators.vrchat.com/sdk/public-sdk-api/ [10] https://creators.vrchat.com/sdk/detecting-vrcsdk/ [11] https://wiki.vrchat.com/wiki/Special:MyLanguage/VRChat_SDK [12] https://vr-lifemagazine.com/vrchat-upd202513/ [13] https://vrc-beta-docs.netlify.app/releases/release-3-8-1/ [14] https://feedback.vrchat.com/avatar-30/p/per-platform-avatar-overrides-for-multi-platform-build-upload [15] https://knb-mayumi.com/unity-sekimen-obj/ [16] https://toruxu.vr.nakashima-toshiki.xyz/vrc-sdk-worlds-%E5%85%AC%E5%BC%8F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AE%E8%A7%A3%E8%AA%AC%E4%B8%80%E8%A6%A7/ [17] https://zenn.dev/wipeseals/articles/ffb5f8a167a6b2 [18] https://knb-mayumi.com/vrchat-assembly-packages-com/ [19] https://knb-mayumi.com/vroid-vrchat/ [20] https://vrnavi.jp/sdk-modular/ [21] https://docs.vrchat.com/docs/recent-releases [22] https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14265827409 [23] https://qiita.com/hoke946/items/dde24d2f5ab29206d5b0 [24] https://tech.framesynthesis.co.jp/unity/metaquest/ [25] https://www.youtube.com/watch?v=dpolR6NjNhw [26] https://vrc.wiki/beginner/838/ [27] https://www.virtualbox.org/changeset/84509/vbox/trunk/include [28] https://github.com/vrc-get/vrc-get/blob/master/CHANGELOG.md [29] https://www.virtualbox.org/browser/vbox/trunk/include/iprt/asmdefs-arm.h?rev=101035