UdonSharp
UdonSharpを使うと、C#でUdonスクリプトを作成できるようになります。UdonSharpはVRChat Worlds SDKに含まれており、作成したC#コードをUdonアセンブリコードにコンパイルします。
- 便利な属性(Attributes)を追加して、UdonSharpスクリプトの機能を拡張しましょう。
- クラス公開ツリー(Class exposure tree)を開いて、UdonSharpで使用可能なC#のクラスやメソッドを確認してください。
- 設定(Configuration)を変更して、自動コンパイルを無効にしたり、その他の設定を変更したりできます。
- カスタムエディタースクリプトの作成方法を学びましょう。
- 非常に古いバージョンのUdonSharpを使用しているプロジェクトの移行(Migration)方法を学びましょう。
UdonSharpスクリプトの作成方法
以下の手順に従い、プロジェクトウィンドウまたはヒエラルキーウィンドウからUdonSharpスクリプトを作成してください。
プロジェクトウィンドウの場合
- プロジェクトのアセットエクスプローラー内で右クリックします。
- 「Create」>「U# script」の順に選択します。
- 「U# script」をクリックします。ファイルの作成ダイアログが開きます。
- スクリプトに名前を付け、「保存」をクリックします。
- これにより、
.csスクリプトファイルと、そのスクリプト用に設定されたUdonSharpプログラムアセットが同じディレクトリに作成されます。
ヒエラルキーウィンドウで
- シーン内に新しいゲームオブジェクトを作成します。
- オブジェクトに
Udon Behaviourコンポーネントを追加します。 - 「New Program」ボタンの下にあるドロップダウンをクリックし、「Udon C# Program Asset」を選択します。
- 次に「New Program」ボタンをクリックします。これで新しいUdonSharpプログラムアセットが作成されます。
- 「Create Script」ボタンをクリックし、スクリプトの保存先と名前を選択します。
新しいUdonSharpスクリプトを作成すると、以下の2つのファイルが生成されます。
- 「UdonSharp Program Asset」ファイル。(作成後にこのファイルを編集する必要はありません。)
.csファイル。このファイルにはUdonSharpBehaviourクラスが含まれており、以下のようになっています:
UdonSharp
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>)およびジェネリックな非静的メソッド InterfacesMethod overloadsProperties
最終更新: