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

UdonSharp

UdonSharpを使うと、C#でUdonスクリプトを作成できるようになります。UdonSharpはVRChat Worlds SDKに含まれており、作成したC#コードをUdonアセンブリコードにコンパイルします。

UdonSharpスクリプトの作成方法

以下の手順に従い、プロジェクトウィンドウまたはヒエラルキーウィンドウからUdonSharpスクリプトを作成してください。

プロジェクトウィンドウの場合

  1. プロジェクトのアセットエクスプローラー内で右クリックします。
  2. 「Create」>「U# script」の順に選択します。
  3. 「U# script」をクリックします。ファイルの作成ダイアログが開きます。
  4. スクリプトに名前を付け、「保存」をクリックします。
  5. これにより、.csスクリプトファイルと、そのスクリプト用に設定されたUdonSharpプログラムアセットが同じディレクトリに作成されます。

ヒエラルキーウィンドウで

  1. シーン内に新しいゲームオブジェクトを作成します。
  2. オブジェクトにUdon Behaviourコンポーネントを追加します。
  3. 「New Program」ボタンの下にあるドロップダウンをクリックし、「Udon C# Program Asset」を選択します。
  4. 次に「New Program」ボタンをクリックします。これで新しいUdonSharpプログラムアセットが作成されます。
  5. 「Create Script」ボタンをクリックし、スクリプトの保存先と名前を選択します。

新しいUdonSharpスクリプトを作成すると、以下の2つのファイルが生成されます。

  • 「UdonSharp Program Asset」ファイル。(作成後にこのファイルを編集する必要はありません。)
  • .csファイル。このファイルにはUdonSharpBehaviourクラスが含まれており、以下のようになっています:
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class YourScriptName : UdonSharpBehaviour
{
void Start()
{

}
}

お好みのエディターでUdonSharpBehaviourを編集して、プログラミングを開始してください。UdonSharpBehaviourは、シーン内の任意のGameObjectに追加できます。

サポートされているC#機能

UdonSharpは、C#の基本的な構文のほとんどをサポートしています:

  • フロー制御: if, else, while, for, do, foreach, switch, return, break, continue, ternary operator (condition ? true : false), ??
  • 暗黙的および明示的な型変換
  • 配列と配列インデクサ
  • すべての組み込み算術演算子
  • 条件付きショートサーキット: (true || CheckIfTrue()) の場合、CheckIfTrue() は実行されません
  • typeof()
  • Physics.Raycast() の多くのバリエーションのように、out または ref パラメータを持つ外部メソッド
  • パラメータと戻り値を持つユーザー定義メソッド(out/ref、拡張メソッド、params をサポート)
  • ユーザー定義プロパティ
  • 静的ユーザーメソッド
  • UdonSharpBehaviour の継承、仮想メソッドなど
  • 引数を持つUnity/Udonイベントコールバック。例えば、VRCPlayerApi 引数を持つ OnPlayerJoined イベントの登録は有効です。
  • 文字列補間
  • フィールド初期化子
  • ジャグ配列
  • 他のカスタム UdonSharpBehaviour クラスの参照、それらのフィールドへのアクセス、およびメソッドの呼び出し
  • [RecursiveMethod]属性を使用することで、再帰的なメソッド呼び出しがサポートされます。

Unity/C#の機能との相違点

UdonSharpはC#言語仕様のどのバージョンにも準拠していません。一部のC#機能は実装されていないか、動作しません。

  • UdonSharpスクリプトを作成する際は、MonoBehaviourではなくUdonSharpBehaviourを継承させてください。
  • Behaviourとしてシリアライズされたフィールドのenabled状態を変更しても、その振る舞いがUdonSharpBehaviourコンポーネントである場合は機能しません。代わりに、カスタムU#スクリプトの型を使用してフィールドをシリアライズしてください。
  • 現在、UdonおよびUdonSharpは配列[]コレクションとデータコンテナのみをサポートしています。List<T>のような汎用コレクションはまだサポートされていません。
  • フィールドの初期化子はコンパイル時に評価されます。シーン内の他のオブジェクトに依存する初期化ロジックがある場合は、Startを使用してください。
  • すべてのプレイヤー間でネットワーク同期を行いたいフィールドには、[UdonSynced]属性を使用してください。
  • 数値のキャストは、UdonVMの制限によりオーバーフローのチェックが行われます。
  • .GetType()で返される変数の内部型は、U#がUdonで動作するように一部の型を抽象化しているため、必ずしも期待通りの型になるとは限りません。例えば、ジャグ配列の型は、2次元のintジャグ配列であってもint[][]のような型ではなくobject[]という型を返します。

サンプルスクリプト

回転するキューブのデモ

これは、アタッチされているオブジェクトを1秒ごとに90度回転させます。

using UnityEngine;
using UdonSharp;

public class RotatingCubeBehaviour : UdonSharpBehaviour
{
private void Update()
{
transform.Rotate(Vector3.up, 90f * Time.deltaTime);
}
}

その他の例

  • VRChat Worlds SDKには、Assets/UdonSharp/UtilityScripts内にUdonSharpのサンプルが含まれています。
    • これらのスクリプトは、使用していない場合は安全に削除できます。
  • その他のサンプルスクリプトについては、GitHub wikiの例、またはU#に付属のExamplesフォルダーを確認してください。
  • 他のクリエイターと交流したり、彼らのサンプルを確認したりするには、VRChat Creator Hubにアクセスしてください。

よくある質問

UdonSharpはUdonの全機能に対応していますか?

はい。Udonが対応している機能であれば、UdonSharpでも利用可能です。UdonSharpからアクセス可能なすべての機能は、class exposure treeで確認できます。

1つのGameObjectに複数のUdonSharp UdonBehaviorを配置できますか?

はい。

ゼロから学習を始めるにあたりC#のチュートリアルを利用したいのですが、UdonSharpで動作しない一般的なC#の機能にはどのようなものがありますか?

UdonSharpを学習中で、まだC#に慣れていない場合は、UdonやUdonSharpで未対応の一般的な手法に遭遇することがあります。これには以下のようなものが含まれますが、これらに限定されるわけではありません。

  • ジェネリッククラス(Class<T>)およびジェネリックな非静的メソッド
  • Interfaces
  • Method overloads
  • Properties

最終更新: