🐜

VRChat制作でTestRunner導入時のUdonSharpエラー解決

に公開

はじめに

VRChatのワールド制作において、ロジックの安全性を高めるためにテスト駆動開発(TDD)を取り入れてみたいと考え、UnityのTest Runnerを使ったテスト環境の構築を試みました。
しかし、実際にTest Runnerを動かしてみると、UdonSharpが原因と思われるエラーが発生し、テストが正常に実行できず想定以上に手間取ることになりました。

本記事では、Test Runner導入時に発生したエラーの内容、試したこと、最終的に行った対処を時系列でまとめています。
同じようにVRChatワールド制作でテスト導入を検討している方や、UdonSharp周りでTest Runnerがうまく動かず困っている方の参考になれば幸いです。

TL;DR

Test Runner(Edit Mode)自体は正常に動きますが、UdonSharp を含むと asmdef によるアセンブリ参照不足で CS0246: UdonSharp が見つからない エラーが出ます。解決策は Runtime 側 asmdef に UdonSharp.Runtime(必要に応じて VRC.Udon/VRC.SDKBase)を追加、場合によっては U# 用の asmdef を作成して関連付けることです。

セットアップ(Test Runner)

Test Runner 参考記事

こちらの記事を参考に作成しましたので、もし実際にテストしてみたい方はこちらを参考に作成してみてください。
なお、本記事は私が実際にエラーに直面した際のファイル構成で解説を進めます。
https://light11.hatenadiary.com/entry/2020/02/21/212657

始めのフォルダ構成

Assetsフォルダの中にテストコードを入れるフォルダとテスト対象を入れるフォルダに分けて作成します。

Assets
├─ Scripts
│ └─ Runtime
│  ├─ Calculator.cs 👈テストしたい対象
│  └─ Calculator.Runtime.asmdef 👈作成後に特に内容の設定はしていない
└─ Tests
 └─ EditMode
   ├─ Calculator.Tests.asmdef 👈記事を参考に内容を設定
   └─ CalculatorTests.cs 👈テストコード

コード内容

次にTestRunnerを実行するためにコードを書きます。
今回は足し算を行う処理をテストしてみたいと思います。

テスト対象のコード

Calculator.cs
public static class Calculator
{
    // 単純な加算を行うメソッド
    public static int Sum(int a, int b)
    {
        return a + b;
    }
}

テストコード

CalculatorTests.cs
using NUnit.Framework;

public class CalculatorTests
{
    [Test]
    public void 正常系_AとBの加算()
    {
        // テストデータ準備
        int plusNumL = 2;
        int plusNumR = 3;

        // メソッド実行
        int result = Calculator.Sum(plusNumL, plusNumR);

        // 期待値と比較
        Assert.That(result, Is.EqualTo(5));
    }
}

テストの実行結果

Test Runnerを実行して緑になることを確認します。

エラー発生と解決

UdonSharpのファイルの作成とエラー発生

せっかく作った足し算の処理をU#で使いたいのでU#ファイルを作成しました。
しかし、いつも通りに作成したはずなのにコンパイルエラーが発生します!

Assets
├─ Scripts
│ └─ Runtime
│ ├─ Calculator.cs
│ ├─ CalculatorUdon.cs 👈追加箇所
│ ├─ CalculatorUdon.asset 👈追加箇所
│ └─ Calculator.Runtime.asmdef 👈後に解説しますが原因はここの設定
└─ Tests
 └─ EditMode
  ├─ Calculator.Tests.asmdef
  └─ CalculatorTests.cs

コンソールログに表示されたエラーメッセージ

原文

Assets\Scripts\Runtime\CalculatorUdon.cs(2,7): error CS0246: The type or namespace name 'UdonSharp' could not be found (are you missing a using directive or an assembly reference?)

日本語訳

Assets\Scripts\Runtime\CalculatorUdon.cs(2,7): エラー CS0246: 型または名前空間名 『UdonSharp』 が見つかりません (using ディレクティブまたはアセンブリ参照が不足していませんか?)

原因

原因はTestRunner作成時の.assetファイルの設定にありました。
アセンブリ間の参照は明示的に設定する必要があるため、今回作成したアセンブリファイルの設定し直す必要があることが分かりました。

補足説明

補足として、chatGPTに質問して理解が深まった内容を引用します。
chatGPTの解説

  1. Unity の asmdef(Assembly Definition)はスクリプトをグループ化して独立したアセンブリにします。
  2. asmdef で分割すると、別アセンブリの型を利用する場合は明示的に参照を追加する必要があります。

また、アセンブリについてのわかりやすく説明されている記事もありますので、リンクを張っておきます。
https://shibuya24.info/entry/unity-assemblydefinition#重要設定「AutoReferenced」とは?

アセンブルによる参照エラーの解決

アセンブリの設定で、必要な参照を増やせば問題が解決できそうです。

  1. Calculator.Runtime.asmdef を選択
  2. Inspector で Assembly Definition References の項目追加
  3. 以下を追加:
    • UdonSharp.Runtime
    • VRC.Udon(必要な場合)
    • VRC.SDKBase(必要な場合)

これにより、UdonSharp を含むアセンブリが明示され、コンパイルエラーが解消しました。

エラー (does not belong to a U# assembly)

原文

[UdonSharp] Script 'Assets/Scripts/Runtime/CalculatorUdon.cs' does not belong to a U# assembly, have you made a U# assembly definition for the assembly the script is a part of?
UnityEngine.Debug:LogError (object,UnityEngine.Object)
...

日本語訳

[UdonSharp] スクリプト 『Assets/Scripts/Runtime/CalculatorUdon.cs』 は U# アセンブリに属していません。このスクリプトが属するアセンブリの U# アセンブリ定義を作成しましたか?
UnityEngine.Debug:LogError (object,UnityEngine.Object)

原因解説(chatGPT)

UdonSharp 側の特殊性

  1. UdonSharp は Udon 用のラッパーとして独自のアセンブリやビルドフローを持っています。
  2. UdonSharp に由来する型は、通常の C# アセンブリと違い、U# が提供するランタイムアセンブリを参照する必要があります。
  3. そのため、単に Calculator.Runtime.asmdef を作るだけでは UdonSharp の型解決ができないケースがあります。

U#の参照エラー解決

ファイル作成

Assets > Create > U# Assembly Definition

設定

・ファイル名はお好みの名前
・ファイルをクリックしてinspectorから、Calculator.Runtime.asmdefを参照させる

最終フォルダ構成

Assets
├─ Scripts
│ └─ Runtime
│ ├─ Calculator.cs
│ ├─ CalculatorUdon.cs
│ ├─ CalculatorUdon.asset
│ └─ Calculator.Runtime.asmdef
│ └─ UdonAsmDef.asmdef 👈追加場所
└─ Tests
 └─ EditMode
  ├─ Calculator.Tests.asmdef
  └─ CalculatorTests.cs

U#のコードの書き込み

これでコンパイルエラーは解消されました。
最後にCalculatorUdonのスクリプトを書いて、Unityで実行してみて問題ないことを確認して終わりです。

CalculatorUdon.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class CalculatorUdon : UdonSharpBehaviour
{
    void Start()
    {
        int sum = Calculator.Sum(1, 3);
        Debug.Log("合計: " + sum);
    }
}

Discussion