以下の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/24/131521より取得しました。


Unity開発における適切なAssembly Definition File(asmdef)設定について

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_VRCSDK3UDON)は非推奨となり、将来的に削除予定です。

推奨される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





以上の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/24/131521より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14