UdonSharp
UdonSharpを使用すると、C#でUdonスクリプトを作成できます。UdonSharpはVRChat Worlds SDKに含まれており、作成したC#コードをUdonアセンブリコードにコンパイルします。
- 便利な attributes を追加して、UdonSharpスクリプトの機能を拡張しましょう。
- class exposure tree を開き、UdonSharpで使用可能なC#クラスやメソッドを確認してください。
- configuration を変更して、自動コンパイルを無効にしたり、その他の設定を変更したりできます。
- custom editor scripts の作成方法を学びましょう。
- 非常に古いバージョンのUdonSharpを使用しているプロジェクトを migrate (移行)する方法を確認してください。
UdonSharpスクリプトの作成方法
以下の手順に従うことで、プロジェクトウィンドウまたはヒエラルキーウィンドウからUdonSharpスクリプトを作成できます。
プロジェクトウィンドウから作成する場合
- プロジェクトのアセットエクスプローラー内を右クリックします。
- 「Create」 > 「U# script」の順に選択します。
- 「U# script」をクリックします。ファイルの作成ダイアログが開きます。
- スクリプトの名前を入力し、「Save」をクリックします。
- これにより、
.csスクリプトファイルと、そのスクリプト用に設定されたUdonSharpプログラムアセットが同じディレクトリに作成されます。
ヒエラルキーウィンドウから作成する場合
- シーン内に新しいゲームオブジェクトを作成します。
- そのオブジェクトに
Udon Behaviourコンポーネントを追加します。 - 「New Program」ボタンの下にあるドロップダウンをクリックし、「Udon C# Program Asset」を選択します。
- 「New Program」ボタンをクリックします。これにより、新しいUdonSharpプログラムアセットが作成されます。
- 「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()outまたはrefパラメータを持つ外部メソッド(Physics.Raycast()の多くのバリエーションなど)- パラメータと戻り値を持つユーザー定義メソッド(out/ref、拡張メソッド、および
paramsをサポート) - ユーザー定義プロパティ
- 静的なユーザーメソッド
- UdonSharpBehaviourの継承、仮想メソッドなど
- 引数付きのUnity/Udonイベントコールバック(例えば、
VRCPlayerApi引数を持つOnPlayerJoinedイベントの登録は有効です) - 文字列補間
- フィールドの初期化
- ジャグ配列
- 他のカスタムUdonSharpBehaviourクラスの参照、フィールドへのアクセス、およびそれらに対するメソッドの呼び出し
- 再帰的なメソッド呼び出し(
[RecursiveMethod]属性を使用することでサポートされます)
Unity/C#機能との違い
UdonSharpはC#言語仕様のいかなるバージョンにも完全準拠しているわけではありません。一部のC#機能は実装されていないか、動作しません。
- UdonSharpスクリプトを作成する際は、
MonoBehaviourではなくUdonSharpBehaviourを継承するようにしてください。これが最も快適な開発体験を得るための方法です。 Behaviourとしてシリアライズされたフィールドのenabled状態を変更しても、その振る舞いがUdonSharpBehaviourコンポーネントである場合は機能しません。代わりに、カスタムU#スクリプトの型を使用してフィールドをシリアライズしてください。- UdonおよびUdonSharpは現在、配列
[]コレクションと data containers のみをサポートしています。List<T>などの汎用コレクションはまだサポートされていません。 - フィールドの初期化(Field initializers)はコンパイル時に評価されます。シーン内の他のオブジェクトに依存する初期化ロジックがある場合は、
Startを使用してください。 - ネットワークを通じて全プレイヤーと同期したいフィールドには、
[UdonSynced]属性を使用してください。 - 数値のキャストは、UdonVMの制限によりオーバーフローのチェックが行われます。
.GetType()によって返される変数の内部型は、期待通りにならない場合があります。これは、U#がUdonで動作するように一部の型を抽象化しているためです。たとえば、ジャグ配列型は、2Dintジャグ配列において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>)およびジェネリックな非静的メソッド - インターフェース
- メソッドのオーバーロード
- プロパティ
最終更新: