VRChatのUdonで遊ぼう
Udonとは?
UdonとはVRChatでWorld製作時、使用することのできるグラフィカルなノードプログラミング言語です。こんなの。
画像は操り人形を作った時のGraphで、Udon環境にはC#をほぼそのまま記述する(いわゆるプログラミング言語のフツーのイメージの)udonsharpという有志開発の環境もあります。
不評なUdon Graph
Udon Graph、情報を求めて検索すると大変不評です。実際、VRChat World向けの高機能なasset(部品)を作成・配布している開発者はudonsharp利用派が圧倒的多数です。どうやら初期のUdonの機能があまりに少なく、画面操作もこなれていなかったために忌避され、udonsharpの登場でSDK3移行組が増えたみたい。また、プログラミングスキル持ちはテキストベースの開発言語の方に慣れているのでグラフィカルなノードプログラミングは迂遠に感じたのかも。
Udon Graphの実際
実際はどうなのだろう、と触ってみました。
悪くない。
少なくとも、
- Animation起動
- 音の再生
- オブジェクトの回転・移動
程度のことであればとても楽です。具体的には、
- ドアの開閉
- オブジェクトの表示/非表示
- 入場音の再生
といったあたりでしょうか。udonsharp(やunity標準のC#)のようにプログラミング初学者には呪文でしかない変数宣言から解放されるのは好印象。unityのHierarckyタブにある目当てのオブジェクトをUdon Graph画面にドラッグしてくればそのまま利用できるのです。ノードを繋ぐ作業自体も楽しい。
一方でうんざりしたのは四則演算や条件分岐でした。
型変換や掛け算、割り算ひとつするごとにノードをひとつずつ増やさなくてはいけません。数式を、数式のままの形で扱えない……。if文の条件に入る論理演算も同様です。数式を扱うような処理はudonsharpを利用した方が断然楽です。
どハマリしたとこ
以下は個人の体験に基づいているので錯誤している可能性も大いにあります。
Udon Graphで大いに填まったのが変数の代入です。
「え?」って感じですよね。
試しに i=i+1 に相当するノードをUdon Graphで組んでみてください。
C言語系に慣れた人は上のようになると思うでしょう? ところが下のようにするのが正解のようです。(実は正解ではない。後述するがChimeCountを直接Set TempCCに代入してるのは結果をnullにする可能性があるっぽい)

Udon Graphは処理手順に注意が必要なようです。
また、芳しくないバグ?仕様?もあります。
- debug.logでconsoleに変数内容を表示しようとしてもnullが表示されることがある。
- 変数から変数へ、演算を経ない代入をすると値がnullになることがある。
- Udon Graphで用意されたGet系ノードは変数に格納せずに呼ぶとnullを返すことがある。
- 分岐させた制御ノードを合流させると正常に動作しない。
- ノードの変数をドロップダウンから別のものへ変更すると接続できないはずの型へ変更できてしまう。
作例
以下は自作world『人形工房 Malion et Atelier』で使用したUdon Graphです。
- 時計の分針、時針を動かして現在時刻を表示
- 時鐘を鳴らす
というもの。簡単なはずの処理ですが割と複雑になってしまいました。
ゲームプログラミングということ
Unityも、その上で動くVRChatも、ゲームを前提としたシステムです。Udon Graphで記述する内容の多くはEvent発生時の一回だけの処理かOnUpdateのような毎フレーム行われる処理になります。特に後者の毎フレーム行われる処理はループの中にあることを強く意識しないとうまく機能しません。
まとめ
基本的な使い方でトラブルに遭遇しがちなUdon Graphですが、UnityC#の提供している機能の多くにアクセスできるようにはなっていきていて、初期のUdon(SDK3)がSDK2に比べて使える機能が少なすぎたというのは過去の物と思います。アニメーションの起動やシンプルなギミックはUdon Graphのノードプログラミングが簡単で楽しく、数式を扱うならudonsharpが良さそうです。ひとつのworldでUdon Graphとudonsharpが混在していても問題ないので、機能ごとに向いた方を使っていこうと思います。
悪くないよ、Udon Graph!
udonsharp構築したMerlin氏すごい!
| 固定リンク