バーチャル3Dクリエイター神部まゆみです(*^-^*)
この記事はVRChat UdonSharpの基本を調べたりサンプルを動かしてみたメモです。
私はUdonノードグラフを使って簡単なギミックを実装したりはしていますが、Udon Sharpっていうのは初めて触ります。
Udonノードグラフについては↓こちらの公式動画が分かりやすかったです。英語ですが(;^_^A
動作確認した最新の環境はunity2022.3.22、VRChat SDK 3.8.2です。
Udon Sharpとは
公式ドキュメントはこちらです。

日本語訳すると、
UdonSharpは、C#をUdonのアセンブリにコンパイルするコンパイラです。UdonSharp は現在、C# 言語仕様のどのバージョンにも準拠していないため、実装されていないものや動作しないものが多数あります。
大人しくChatGPT氏に聞くw
ちょっとよくわからないのでChatGPT氏に聞いてみます(;^_^A


はい、Udon#はVRChatのワールド内でより高度なスクリプトを実装できるプログラミング言語です。Udon#はUnityエディタ内でC#に似た構文を使用してスクリプトを記述できます。これにより、より複雑なギミックや動作を持つワールドを作成できます。
Udon#を使用すると、Udonノードグラフと組み合わせてさまざまな動作を実現できます。Udonノードグラフは視覚的なプログラミングツールであり、Udon#はテキストベースのプログラミング言語であるため、両方の組み合わせにより柔軟性が向上します。Udon#を使用すると、より高度な条件分岐、ループ、関数、変数の操作などが可能です。
C#との違いなど
なんかC#とだいたい同じっぽいですね。


はい、Udon#はC#に非常に似た構文を持っています。Udon#はUnityのC#スクリプトと同様に、変数、条件分岐、ループ、関数、クラス、イベントなどの基本的なプログラム機能をサポートしています。そのため、C#を知っている場合、Udon#を学ぶのは比較的簡単でしょう。
ただし、Udon#はUnity上でVRChatの特定の機能をサポートするためのものであり、一部の機能やライブラリはC#とは異なる場合があります。そのため、Udon#を使う場合は、VRChatの公式ドキュメントやコミュニティのリソースを参照すると良いでしょう。そこで、Udon#の特有の機能や制限事項について詳しく学ぶことができます。
Visual Studioなどの外部エディタは必要ない?(・・?
Visual Studioとか外部のエディタを使わずにunityの中だけで完結するとか言っています。


はい、Udon#のコーディングはUnityエディタ内で行うことができます。Udon#スクリプトを作成するためには、UnityのInspectorパネルやテキストエディタを使用します。Visual Studioなどの外部の統合開発環境(IDE)は必要ありません。
具体的には、Unityのプロジェクト内でUdon#スクリプトファイル(.udon)を作成し、UnityエディタのInspectorパネルでそのスクリプトを編集することができます。Udon#スクリプトはC#に似た構文を持っており、Unityエディタ内でスクリプトを記述し、編集することができます。また、Udon#スクリプトはUdonノードグラフと連携して使用することもできます。
外部のIDEを使用することは、通常のC#スクリプトのようには行われません。Udon#のプログラムはUnityエディタ内で完結するように設計されています。ですので、Unityエディタさえあれば、Udon#スクリプトの作成、編集、デバッグが可能です。
んー、でもやってみたけど.csファイルが生成されているし、編集しようとしたらVisualStudioが起動したが…。
これUdonノードグラフと勘違いしてない?
もう一度聞いてみたら「Visual Studioなどの外部エディタが必要です」と言っていた。


Udon Sharpを使用する場合、確かにスクリプトは.csファイルとして生成され、通常は外部の統合開発環境(IDE)を使用して編集することが一般的です。Visual StudioやVisual Studio Codeなど、対応するIDEを利用してスクリプトを編集することで、Udon Sharpの機能を最大限に活かすことができます。
Udon Sharpには、Udonノードグラフと同様に、Unityエディタ内での開発をサポートするプレビュービルダーも存在します。これにより、Unityエディタ内で編集したスクリプトの変更が即座に反映され、プレビューできます。ただし、最終的なビルドや公開には外部のIDEが必要です。
Udon Sharpスクリプトは通常、Visual StudioやVisual Studio Codeを使用して編集され、コード補完やデバッグなどの高度な開発機能を利用できます。これにより、複雑なスクリプトや大規模なプロジェクトの開発がより容易になります。
UdonノードグラフとUdon Sharpは、それぞれの特長を持っています。ノードグラフは視覚的で直感的な開発が可能ですが、柔軟性や細かな制御が求められる場合はUdon Sharpが役立ちます。どちらを選択するかはプロジェクトの要件や開発者の好みに依存します。
でも「unityエディタ内での開発をサポートするプレビュービルダーも存在します」とか言ってるし、そういうのもあるのかな?
まぁとりあえずVisual Studioをつかっていくことにします。
Udon Sharpの簡単なコードを書いてもらう
具体的な違いがまだ分からないのでコードを書いてもらうことにします。


Q, Udon#でそのインスタンスに入っているプレイヤーに体力を付加し、各プレイヤーの画面にHPゲージを表示したいです。途中からインスタンスに入ってきたプレイヤーにもこの機能が割り当てられます。Udon#でこのスクリプトは書けますか
ChatGPT
はい、Udon#を使用して、VRChatのインスタンス内のプレイヤーに体力を付加し、各プレイヤーの画面にHPゲージを表示することは可能です。以下に、この機能を実現するための基本的なスクリプトのアイディアを示します。まず、各プレイヤーの体力を保存する変数と、HPゲージを更新する関数を持つUdon#スクリプトを作成します。次に、ユーザーがダメージを受けた場合に体力を減らす処理と、HPゲージを更新する処理を実装します。
以下に、基本的なUdon#スクリプトの例を示します:
using UdonSharp;
using UnityEngine;
public class PlayerHealth : UdonSharpBehaviour
{
private int maxHealth = 100; // プレイヤーの最大体力
private int currentHealth; // 現在の体力
public GameObject healthBarPrefab; // HPゲージのプレハブ
private void Start()
{
currentHealth = maxHealth;
// HPゲージを表示する
GameObject healthBar = Instantiate(healthBarPrefab, transform);
healthBar.GetComponent<HPBar>().Initialize(this);
}
// ダメージを受けた時の処理
public void TakeDamage(int damage)
{
currentHealth -= damage;
currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth); // 体力が負にならないようにクランプ
// HPゲージを更新する処理を呼び出す
UpdateHealthBar();
}
// HPゲージを更新する関数
private void UpdateHealthBar()
{
// HPゲージの更新処理を書く
}
}
え、これまんまC#じゃない?
Udon Sharpって言ってもC#とほぼ同じなのか…。
最初に using UdonSharp; とだけ書けばUdon Sharpの機能を使えるみたいです。
C#と同じでStart()とかUpdate()とかにコードを書いていけばいいっぽい?


Q, ありがとうございます。Udon#も基本的にはC#と同じで、start()やupdate()の中に処理を書いたり、メソッドを記述していけばいいのでしょうか?
ChatGPTはい、Udon#は基本的にC#に似た構文を持っています。Udon#スクリプトでのプログラムの構造は、C#と同様に、メソッドや変数の定義、条件文、ループ、関数の呼び出し、クラスの作成などが行えます。
Udon#スクリプトでは、以下のような基本的な構造を持っています:
using UdonSharp;
using UnityEngine;
public class YourScriptName : UdonSharpBehaviour
{
// Udon#のスクリプトはMonoBehaviourを継承したクラスと同様に、Start()関数を持つことができます
void Start()
{
// 初期化処理などを記述します
}
// Update()関数は毎フレームごとに呼ばれます
void Update()
{
// フレームごとの処理を記述します
}
// 自分で定義した関数を記述できます
void CustomFunction()
{
// 任意の処理を記述します
}
}
上記の例では、
Start()
関数はスクリプトの初期化処理を行うために、Update()
関数は毎フレームごとの処理を行うために使用されます。また、自分で定義した関数(CustomFunction()
など)を作成して、それを必要な場所で呼び出すことができます。Udon#はUnityのエディタ内で使用され、テキストベースでスクリプトを記述することができます。基本的なC#の知識があれば、Udon#のスクリプトも書くことができるでしょう。必要に応じてVRChatの公式ドキュメントやUdon#のリファレンスを参照しながら、スクリプトを進めていくと良いでしょう。
なぜUdonという名前なのか?蕎麦やラーメンではダメだったのか聞いてみる
前から疑問だったけどChatGPTなら知ってるかもしれないので聞いてみますw


Q,
ちなみになぜUdonという名前なのでしょうか?VRChatの開発陣の中に日本びいきの人がいて、日本食のうどんが好きなのでしょうか?蕎麦やラーメンではダメだったのでしょうか?
ChatGPT
UdonSharpおよびUdon(VRChatの開発言語)の名前は、Unity製の言語「Boo」に由来しています。BooはPythonライクな構文を持つ言語で、Unityのスクリプト言語としても使用されていました。
「Udon」は、Boo(ブー)の次のアルファベットである「B」よりも次のもの、といった連想的な要素が含まれています。また、日本食である「うどん」が選ばれたのかについては、具体的な開発者の意向や好みに基づく可能性がありますが、公式な詳細は提供されていません。
開発者やコミュニティがプロジェクトに愛着を持つために、ユニークで楽しい名前が選ばれることがあります。特にVRChatはグローバルなコミュニティを持っており、様々な文化の影響が反映されていることも考えられます。
えっこれほんと?なんかウソトリビアみたいに見えるけど本当なのかなぁ。
検索したらテラシュールブログさんの記事が引っかかったけど、本当にそんな言語があったみたい。へー。
しかし
「Udon」は、Boo(ブー)の次のアルファベットである「B」よりも次のもの、といった連想的な要素が含まれています。
のくだりは??(・・?? ちょっと良く分からなかったです(;^_^A
恐らくVRChat開発陣が初期の頃に「ノードを組んでプログラムできたらイイナ!あ、このノードは日本料理のウドンに似てるからUdonって名前にシマス!」みたいなノリでつけたと予想w
少しだけ分かったような気がするので実際に動かしてみる
サンプルとか動かしてみたいと思います。
サンプルを動かしてみる
VRChat公式ドキュメントにいくつかサンプルが載っているので動かしてみます。

キューブがスピンするサンプル
このコードをキューブにアタッチすればいいっぽいです。
短いので引用させてもらいます。
using UnityEngine;
using UdonSharp;
public class RotatingCubeBehaviour : UdonSharpBehaviour
{
private void Update()
{
transform.Rotate(Vector3.up, 90f * Time.deltaTime);
}
}
回転させたいオブジェクトにUdon Behaviorを追加して、New Program ⇒ Udon C# Program Assetを選ぶ。


Create Scriptをクリック。


これで.csファイルを作成します。
普通のC#と同様、クラス名とファイル名を一致させておく。


できた.csファイルをダブルクリックするとVisual Studioが立ち上がったので、これで編集すればいいかな。


とりあえずエラーは出なかったので保存します。


まあ一応動きました。
キューブをPick Upして接地面を変えたら、回転が推進力になって自走していってしまったが…(笑)。
Udon関係のファイルはシーンファイルがある場所にできていた。 デフォルトだとAssets/Scenesかな。
ちなみにこのワールドはサンプルシーンをそのまま作っていったので、シーン名はSampleSceneのままです(笑)


追記:久々にやったらエラーが出たけど保存したり再起動したら直った
久々にUdon#を動かしてみようと↑のサンプルをコピペして動かしてみたら、赤字でコンパイルエラーって出ました。
しかしプロジェクトを保存したりUnityエディター再起動したりしたらコンパイル通りましたね。
どうもUdonのコンパイルは不安定なのかな…?コードが合ってても良く分からないところでエラーが出たりするようです。
↓あとこういうエラーも以前出たので、詰まったら試行錯誤する必要があるかも(^_^;)
ワープする床を作ってみる
公式にインタラクトでワープさせるサンプルもあるけど、

床に乗ったらワープさせるスクリプトを書いてみます。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
public class TeleportPlayer : UdonSharpBehaviour
{
[SerializeField] Transform targetPosition;
// OnPlayerTriggerEnterメソッドをoverrideする
public override void OnPlayerTriggerEnter(VRCPlayerApi player)
{
//プレイヤーをワープ先に移動させる
Networking.LocalPlayer.TeleportTo(targetPosition.position,
targetPosition.rotation,
VRC_SceneDescriptor.SpawnOrientation.Default,
false);
}
}
コライダーの「トリガーにする」にチェックする。
デフォルトのコライダーでやったら検知範囲が狭すぎて発動しなかったので、Y軸を大きくして検知範囲を広くしました。


Target Positionにテレポート先を指定するんだけど、移動先をコピーしたテレポート床にしたら無限ループしてしまったので注意。
Udonノードで使ったイベント命令をそのまま使えるっぽい
↑のサンプルだとOnPlayerTriggerEnterを使ってるけど、これは以前Udonノードグラフを組んだ時も使った。
↓公式ドキュメントにイベント命令の説明が載ってるので、上のスクリプトのOnPlayerTriggerEnterのところを別の命令に書き換えるだけで色々試せます。

これで動いた!
普通に動作しましたね。
まぁこのくらいの動作ならUdonノードでも組めるかな?
おわりに
C#と同じような感じで動かせるみたいで良かった。
簡単なギミックならUdonノードグラフでいけるけど、複雑な動作をさせたいならUdon Sharpを使った方がいいかも。
今度はもう少し複雑な動作をさせていって、ゲームっぽいワールドも作ってみたいなぁ。
もう少しいじってみます(*^-^*)