Programming in VRChat

VRChat でのプログラミングについて調べたことの書き溜め

2022/12/15 付け Developer Update の読み解き / 前編

はじめに

2022/12/15 の VRChat Developer Update の主な内容は、 ワールド作成関連の機能開発状況と 2023 年の年間目標について伝えるものでした。 ここのところ話されることのなかった長期計画について突然と語られたので界隈は盛り上がっていました。 一方で、プログラミングの知識を前提にして書かれている所があったり、 説明が大雑把であるために良く分からないという声も聞かれました。

私も疑問に思うことが多々ありました。 その後、VRChat の開発者との質疑や技術情報の調査などを通して、ある程度内容が見えてきたので、 それら情報を補足しながら今回の Developer Update を読み解いてみたいと思います。

この記事は前編と後編から構成されます。 前編は全体の要約と一般的な話題の補足、 後編Udon 2 の実装技術の詳細を深掘りします。

注意:この記事は未確定な事や予測なども含むため、結果的に正しくないことも書いているかもしれません。 必要に応じて最新の情報を追ってください。

要約

今回の Developer Update 中のワールド作成関連の開発内容を要約すると以下のようになります (これは整理・解説を加えたものであり、翻訳ではありません)。

  • 最近の開発アイテム
    • Udon でのネットからの文字列の取得 / Remote String Loader
    • Udon からの動画保存 / Video Recording
    • Udon からの画像保存 / Image Saving
    • 基本的な機能は作り終わってる。これからアクセス制限を検討・調整する
    • 補足:これらは Udon 2 とは関係ない。おそらく先行してリリースされる
  • 2023年の SDK 関連の年間活動計画
    • リエータに対するコミュニケーションを活発にする
    • ユーザからのフィードバックへの応答を改善する
    • Udon 2 (仮題)
      • Udon を改善するシステムを開発する
      • 互換性を保ちつつ、速度改善、機能追加を目指す
      • 補足:これは年間の開発計画であり、すぐに提供されるものではない。段階を踏んだリリースを考えていて、最初のリリースの基本的な部分はすでに作り終わっている

最近の開発アイテム

現在進行中の開発内容として次のものの紹介がありました (記事中 Ongoing Development )。

これらは VRChat による新年イベントのワールド「VRC NYE 2022」の中で既に使われていたので、基本的な機能は作り終わっているようです。 ワールド作成者に機能提供する前の残る作業として、アクセス制限などの検討調整をするとのことです。 これら機能は後で述べる Udon 2 とは関係はありません。

技術的な話: Remote String Loader によってネットワークからの情報取得が明示的に解禁されるにあたって、 取得元の URL を自由に組めるようになるかは関心が寄せられるところだと思います。 話を聞いたところ、まだ決定されたわけではない言いぶりでしたがさしあたり現状の制限をかけたままになるようです。

補足:URL を Udon プログラムから自由に組める機能があると、 例えばワールド作成者がユーザの行動記録を取るといったことが簡単に行える可能性があります。 そのような事情を考慮して機能制限を設けているようです。

コミュニケーションの改善

Developer Update 記事中 Increasing Communication with Creators は要約すれば「VRChat からの情報伝達の改善」、 Improving and Supporting What We’ve Got は「クリエータからの情報伝達への応答の改善」で、 全体として 2023年はクリエータとのコミュニケーションの改善に取り組んでいくとのことです。

具体的には、以下のようなことが述べられています(口語調のものを箇条書きにした意訳です)。

  • これまでの Developer Update のように、定期的な情報伝達をする
  • 現在の開発状況と、次に何をするつもりなのかを知らせていく
  • 計画の変更があったら都度知らせるようにする
  • 深刻な不具合に関して対応を強化する
  • SDK 関連の Canny 投稿をさらいなおして、それら不具合と要望を解消する期間を設ける
  • ドキュメント(動画やサンプルを含む)の改善を続ける

記事では触れられていませんが、この背景には 2022年10月頃の Twitter での意見交換があると思います。 それは次のような流れで起きた会話でした。

  1. EAC の導入と共に mod の締め出しが行われた
  2. 悪用の意図ではない「mod の機能が必要だ」との声に対する“回答”として、一部の mod が実現していた機能を追加するアップデートが矢継ぎ早に行われた
  3. それらは一般のユーザの日々の利用での快適性改善に関するものだった
  4. それに比べ、アバターやワールドを作るクリエータが欲している機能や改善要求は放置されたままだ(どうすればいいんだ)、 という不満がクリエーターから寄せられた
  5. これをうけて VRChat のユーザコミュニケーション担当の tupper さんから 「クリエーターの問題を解決する要求の処理方法の改善が必要だ、と考えさせられた。何ができるだろうか」という趣旨の 問いかけ がされ、
  6. リエータから現状の問題点と改善策の提案が寄せられた (当時の私のまとめ

私も以下のような 提案をしました

  • 定期的な情報更新はありがたい。(続けて)
  • ドキュメントを正確に最新に保って
  • 当初案から延滞が起きたら追って情報を出して(変更が起きるのはしょうがない。でも言いっぱなしにしないで)
  • 情報が十分に寄せられていて簡単に直せそうな不具合はさっと直して

Developer Update で書かれた内容を見る限り、 意見を寄せたクリエータが感じている事が課題であると認識されたようであり、 記事に書かれたことは良い方向への歩みであるように思いました。 実際にどう変わっていくかは今後の様子を見たいと思いますが、 もしも困る状況が続くようであればここでの目標設定を足掛かりにして話が出来るようになったと思います。

蛇足: B2C な「users」と B2B な「creators」

この Twitter での対話の中で FairlySadPanda さんが指摘していた内容 「ワールドやアバターやツールなどのクリエーターと VRChat 社の関係は、 B2C(business-to-consumer 企業と消費者間のコミュニケーション)というよりは B2B (business-to-business 企業間のコミュニケーション)に近い」 は、なるほどそうだなと思いました。

リエーターではないユーザ向けの情報は、特に前提知識を必要とすることなく誰にでも分かるように伝えていく必要があるでしょう。 一方クリエーターには正確で詳細な(ある意味で遠慮のない)技術者レベルでの対話が必要になります。 実際に例えば、リリースノートで前者向けと思われる平易な表現をしていて後者にとっては情報が不足していることが見受けられます。

この意識を持ってみると既に「users」と「creators」という表現との微妙な使い分けが既に起きているようにも思えてきました。 これまでは冗談めかして「VRChat のユーザはゲームクリエータ」というようなことも言われていましたが、今後は徐々に分かれていくのかもしれません。

Udon の新しい実行環境: Udon 2 (仮題)

Udon 2 (working title) は、現行の Udon スクリプトを実行する仕組みを大きく変える開発が進行中であるという話です。 これはワールド作成者にとっては、

  • Udon プログラムの動作が速くなる
  • プログラムをほぼ普通の C# として書けるようになり、従来 U# に比べて使える言語機能が増える
  • Graph エディタでの作成を容易にしていく機能が追加される

ということを目指すものです。変更にあたっては互換性を重視して、

  • 新たに提供される SDK でビルド&アップロードし直せば、それだけで速くなる(つまり、ワールドのシーンやスクリプトの書き換えの必要はない)
  • 従来アップロードされているものは、システムが更新されてもそのまま動き続ける

という方針が示されました。

(ワールド作成者ではない)ユーザにとっては(Udon 2 は直接使う機能追加ではないので)ある意味影響はありません。 あえて言えば「今のよりももっと複雑な凝ったワールドが多く作られるようになる」かもしれません。

C# が出来ること概ね何でも」のくだり

Udon 2 で出来ることの説明として 「You can use Lists, Dictionaries, Actions etc. – pretty much anything that C# can do. This makes it a lot easier to port existing work to VRChat」 という一節がありました。

これはつまり噛み砕くと

  • C# の言語機能は概ね全て使える
  • 具体的には例えばジェネリクスを伴う List, Dictionary、デリゲートを使っている Action が使える
  • U# ではサポートされていなかったために書けなかった普通の C# としての書き方が出来るようになる
  • 結果的に既存のプログラムを VRChat に持ってくるのが容易になるという効果も望める

ということだと思われます。

つまりここでの「全て」は「C# の言語機能として全て」の意味であって「通常の Unity プログラミングで C# でできること全て」ではありません。 Udon から利用できない範囲の API 、つまりはワールド作成者には触らせたくない機能の範囲の方針は変わっていません。 (これは記事中「you’ll still need to work within the Udon VM sandbox」のくだりなどから読み取れます)

また C# のバージョンについて「the compiler will use C# 7.3 for Unity 2019 compatibility」という注意書きがありましたが、 これは 「概ね全てとは言うものの、いくらかの制限はかかる。例えば Unity との互換性のために C# のバージョンが低く押さえられるといったような可能性はある」 という意味だとのことです。 (「Unity 2019 のままにする」という意味ではない。「この部分、過剰に意味を取りすぎ」とのコメントがありました。)

カスタム・グラフ・ノード / Graph エディタの Nodes の拡張

Custom Graph Nodes は U#(というか C#)でプログラムを書いて、それを Graph エディタからノードの一種として呼び出せるようにする機能追加です。

これまで Graph エディタで Udon プログラムを作成する際の大きな問題として 「グラフとして図形的に表記するにしてはあまりにも(粒度として)細かい記述が要求される」 「結果、あまりにもグラフ全体が大きくなりすぎて扱いにくい」 「見通しが悪くなりがちで、維持する(メンテナンスする)のがつらい」 といった要は図として書く十分に旨味が得られていない点が指摘されてきました。

このカスタム・グラフ・ノードの機能はこれら改善するものになるかもしれません。 「ギミック作成者が U# でプログラムを書いて提供して、 それを Graph エディタを使ってワールド作成する人が利用する」 といった使い方(あるいは役割分担、分業)の道が開けます。 上手く行けば Graph エディタで書くことは主に 「ワールド内で起きる物事(イベント)に対応して、U# で作られている部品の機能を呼び出す」 というものになるでしょう。

グラフとして書かれることが「結び付け」に絞られるならば、 グラフは分かりやすく見渡せるようになり、 現在よりももっと気楽に使い始められるものになるかもしれません。

Udon 2 リリース時期の見通し

Udon 2 は少なくとも二段階に分けてリリースすることを考えているようです。 (記事中 When do I get all this cool stuff?!?! の部分)

最初の段階(現状の Udon を Phase 1 とすると Phase 2)ではカスタム・グラフ・ノードが提供されます。 これを動かす基本的な部分は概ね作成済みで、現在は使いやすくするようにする部分の作業中とのことです。 これはそれほど長くかからずにリリースされてくると期待できます。

その次の段階(Phase 3)についてはリリース目標期日の設定はされていないとのことです。

後編へ

この記事の 後編 では、Udon 2 の実装の技術詳細を深堀りします。

Udon Graph エディタ ガイド (2020/6月版)

ノードを接続して Udon プログラムを作るエディタが改修されました。 新機能や変更点を中心に、ざっと紹介します。

(ツールの使い方の紹介なので Udon プログラムの作り方は説明していません。 この記事は closed beta版をもとに作成したため、リリースされたものとやや異なっている部分があるかもしれません。)

追記:VRChat 2020.3.1 アップデートで SDK が VRCSDK3-UDON-2020.07.16.10.33_Public に更新され、この記事で書いている新しいエディタが正式リリースされました。

f:id:naqtn:20200613021034p:plain

主な変更点

  • 表示の全面的な改修
    • UI が全面的に新しいものになりました。
    • 全体的に動作が機敏になりました。
    • 接続線が直線的に描画されるようになりました。
    • 編集画面の拡大縮小(ズーム)が出来るようになりました。
  • Variables ウィンドウ の導入
    • 変数定義は専用のウィンドウの中で一括して行うようになりました。
    • 変数にアクセスするノードは、ここからドラッグ&ドロップして作るようになりました。 通常のドロップ操作で Get Variable、Ctrl キーを押しながらドロップで Set Variable ノードが生成されます。
  • ノード作成時の検索機能 の改善・変更
    • 動作速度が改善されました。表示されるまで待たされることが無くなりました。スクロールバーが機能していなかったのが修正されました。
    • クラスを選択してから、メソッドを選択する二段階方式になりました。無暗に検索結果が長くなるという不便が解消されます。
    • 表示一覧を、選択しているノードに関連したものにあらかじめ絞り込む機能が追加されました。既に置かれているノードのクラスの別のメソッドの追加が楽になりました。
  • グループの追加
    • ノードを見た目で束ねられる「グループ」機能が追加されました。
  • 明示的なオープン操作
    • 明示的なオープン操作をした時にだけ、編集対象のグラフ・アセットが切り替わるようになりました。
    • エディタ上の選択の変更に追従して表示対象が変更される従来の動作は廃止されました。表示を元に戻す煩わしさが解消しました。
  • ノード追加を便利にする操作の追加
    • Hierarchy ウィンドウから GameObject をドロップすると、それを値とする変数と Get Variable ノードが作成されます。
    • 同様に Inspector ウィンドウから Component をドロップして参照できます。
    • 接続線を伸ばして何もない所で離すと、接続する可能性のあるノードが表示されます。選択すると接続した状態でノードが作成されます。

f:id:naqtn:20200613151747p:plain:w500
以前はこのくらいの規模までグラフを大きくすると私のマシンでは動作がカクカクしてきてしまい作業を続けるのが困難でした。新しいエディタでは十分に編集できるようになりました。(まだ反応性の悪い操作もあります)

画面表示内容

Welcome 画面

f:id:naqtn:20200624065759p:plain:w400

  • Unity メニュー > VRChat SDK > Udon Graph で表示開始した場合は、まず Welcome 画面が表示されます。
    • ツールバー にある Welcome ボタンを押す事でも表示できます。
  • 変更点の案内、設定(Settings)、最後に編集したグラフを開くボタンが表示されます。
    • グラフを開くボタンは、最後に編集したグラフが現在のプロジェクトの中に現在もある場合にのみ表示されます。
  • Settings の内容(設定項目)
    • Grid Snap Size: ノードを移動した時に位置合わせ(スナップ)する長さ。ゼロにするとスナップしなくなります。
    • Focus Search On Selected Node: ノード作成の一覧を、選択しているノードにあらかじめ絞り込むか否か。詳細別記
    • Search On Noodle Drop: ノードから接続線を伸ばして何もない場所で離した時(ドラッグを終了した時)に、そこに接続しうる新規ノードを検索する機能を使うかどうか 詳細別記
    • Use Neon Style: ネオンサインのような異なる色合いでの表示を使用するか否か。
      • (見た目を変えられる機能を備えることのデモ的な意味。そのうちユーザがこのような表示テーマを作れるようになるはず。)

f:id:naqtn:20200616131736p:plain:w400
Neon スタイル(左)と通常スタイル(右)

グラフ編集時のツールバー

f:id:naqtn:20200613170408p:plain:w400

Udon Graph ウィンドウの上部にはツールバーがあります。ツールバーの内容は左から以下のようになっています。

  • Welcome : Welcome 画面を表示するボタン
  • 編集中のグラフ・アセットの名前
  • Settings プルダウン
    • MiniMap と Variables ウィンドウの表示非表示切り替え
  • Compile ボタン
  • Reload ボタン
    • グラフ・アセットを読み込みなおします。
  • 状態表示(status box)
    • コンパイル結果を表示します。成功していると「OK」、失敗していると「!」が表示されます。
    • コンパイルを自動的に実行した時に短時間点灯します。
    • クリックすると、生成したアセンブリ(ないしはエラーの詳細)がテキストで表示されます。

グラフ編集画面

f:id:naqtn:20200616165007p:plain
グラフ編集画面、右クリックメニュー表示時。

  • 右クリックのメニュー Create Node などからノードを作成します
    • (従来ツールバーにあった Add Node ボタンは無くなりました)
    • 作成するノード種の一覧表示は多くの変更があります。 詳細は別記
    • スペースキーの入力でもノード作成の開始になります。
  • ノード選択操作
    • ノードを選択するには、ノードを左クリックします。
    • 地の部分をドラッグすると範囲にかかったノードを選択できます。
    • コントロールキーを押しながら選択すると追加選択になります。
    • 範囲選択でもコントロールキーでの追加選択動作が働くようになりました。
    • 地の部分を左クリックするとノード選択は解除されます。
  • ノードの編集
    • 左ドラッグで任意の位置に配置できます。
      • Welcom 画面Grid Snap Size を設定しておくとスナップ動作します。
    • バリエーション(メソッド・オーバーロードなど)がある場合はドロップするメニューがあらわれます。
    • 配列値を扱う場合、編集ボタンがあらわれます
    • 右上の「?」ボタンをクリックするとブラウザでドキュメントを表示します。
      • (リンク先が正しくなっていないものが含まれているようです。)
    • 選択したノードのカット、コピー、ペースト、デュプリケート(複製)が出来ます。
      • Unity で一般的に使用される Edit メニューとそのショートカット、右クリックメニューで実行できます。
      • 新たなノードはマウスの場所を基準とした位置に作られます。
      • コピーしたグラフは、テキストとして保存したり、他のエディタでペーストすることが出来ます。
      • (ペーストした際に変数の選択が復元されない不具合は修正されました。)
  • 接続線( Noodles(公式ドキュメント)
    • 直線的な表示に変更されました。ノードの背後に描画されるようになりました。
    • 流れの逆向きに入力側のノードからのドラッグでも接続できるようになりました
    • 接続操作がしやすくなりました。接続可能かの判定範囲が広くなり、またドラッグを完了する前に仮の接続線が表示されるようになりました。
    • Welcom 画面Search On Noodle Drop を有効にしておくと、接続線を引き出す操作をきっかけに接続先のノードを作成することができます。 詳細は別記
    • 右クリックのメニューから切断できます。
    • 切断するために選択する必要はなくなりました。マウスカーソルを重ねるとクリックの前に反応する接続線が強調表示されるようになりました。
  • 入力データの型表示
    • 入力接続点(ポート)の上にマウスカーソルを置くと、型情報がポップアップします。
  • ズーム
    • マウスホイールでズームが出来るようになりました。
    • MiniMap に表示されている数値がズーム倍率です
  • 表示領域の移動(パン操作)
    • マウスのミドルボタンのドラッグで表示している範囲が移動します。
    • Alt + 左ボタンドラッグでも同じです。
    • ノードをドラッグしている際に表示領域外へ移動しようとすると、表示領域がそちら方向へ移動します。
  • キーボードによる表示変更
    • a : (All) 全てのノードが出来るだけ入る様に表示位置とズームが調整されます。
    • o : (Origin) 表示位置を原点に移します。ウィンドウ左上がグラフの原点位置になるように表示位置が移動され、ズームが 1.0 になります。
    • [] : 押すたびにノードを順番に中央に、選択状態にして適切なズーム倍率で表示します。
  • 白い輪っかは原点の場所を表します。特に機能はありません。

ノード作成時の検索機能

ノードを作成する時に使う、ノード種の検索機能が一新されました。 検索対象が異なる複数のモードが追加されましたが表面的な表示は従来のものと同じなので、 使い始めの際には差異により戸惑うことがあるかもしれません。 特に Focus Search Selected Node 機能は、ぱっと見では分かりにくいので注意してください。

  • 検索ウィンドウの表示
    • 編集画面の地の部分で右クリックで表示されるメニューから Create Node を選択すると、検索ウィンドウが表示されます。
    • ツールバーにあった AddNode ボタンは無くなりました。)
    • スペースキーの入力でも開けます。
    • この検索モードは Quick Search(公式ドキュメント) と呼ばれます。 新しいグラフエディタではこのモードが検索の基本動作になっています。
  • ノード種の選択
    • メソッドを表すノードの作成では、まずクラスを選択・確定してから、メソッドを選択する二段階方式になりました。
    • テキストを入力した時に検索対象になるのはクラス名になりました。
    • (動作を速くするために、内部的な事情によってこうなっているようです。)
    • メソッド一覧から < をクリックして直前の表示に戻ることは出来ません。
      • クラス選択を間違った場合は、いったん一覧外をクリックして(あるいは ESC キーを押して)追加操作をキャンセルして、初めから操作しなおします。

f:id:naqtn:20200613155247p:plain:w200
検索欄に「float」と入力したした時の表示。まずは型名だけが表示されます。

f:id:naqtn:20200614011838p:plain:w200
Floatクラスを選択すると、メソッド等が一覧されます。

f:id:naqtn:20200613155423p:plain:w300
(参考)従来の検索での表示。メソッドも結果に現れるので候補リストが長く不便でした。

  • 選択しているノードによって、一覧をあらかじめ絞り込む機能が追加されました。
  • Event や Special に分類されるノードもメソッドと同様に同じ種類のノードに一覧が限定されるようになります。
  • Welcome 画面 にある設定項目 Focus Search Selected Node にチェックを入れるとこの機能が使えます。(初期状態では無効化されています。)
  • 全ての選択肢を表示するには地の部分をクリックしてノードの選択を解除します。(あるいは Focus Search Selected Node を無効にします。)
  • この検索モードは Focused Search(公式ドキュメント) )と呼ばれます。

f:id:naqtn:20200613154618p:plain:w300
ノードを選択していない場合。従来と同様の最上位カテゴリが並びます。

f:id:naqtn:20200613154850p:plain:w300
ノードを選択している場合。メニューを開いた段階で既に、選択したノードが属している String 内の選択肢が表示されます。(ウィンドウのタイトルも Systemstring に変化しています)

Search on Noodle Drop

  • 接続線を引き出す操作をきっかけにして、ノード種を検索し、選択したら自動的につないでくれる機能が追加されました。 (公式ドキュメント: Search on Noodle Drop
  • この時、検索の選択肢はその接続線がつなぎうるもののみに、あらかじめ限定されて表示されます。
  • Welcome 画面 にある設定項目 Search On Noodle Drop にチェックを入れるとこの機能が使えます。(初期状態では無効化されています。)
  • 実装されたばかりの機能であるため、これから表示されるリストの内容はこれから改善・調整がおこなわれるかもしれません。
    • 定義済みの変数の Get/Set も型が適合すればリストにあらわれます。
    • フロー(プログラムの進行を表す接続線)では機能しません。
  • 従来方式の検索ウィンドウも Tab キーを押すことで表示できるようになっています。
  • 初回表示されるまで時間がかかります。
  • (この検索機能は Full Search(公式ドキュメント) と呼ばれるようになりました。)

その他の変更

  • 一部のノードは分類が変更されました。移動されたり検索欄では扱わないようになりました。
  • Comment は以前はSpecial の中に分類されていましたが、独立したメニュー項目に移動しました。
  • 以前は Special の中に置かれていた Get Variable, Set VariableVariables ウィンドウ からのドラッグで作るようになりました。検索には現れなくなりました。
  • 変数を作る項目(それぞれの型の中にあった Variable 項目)は無くなり、Variables ウィンドウで作るようになりました。
  • UnityEngine/Debug は頻繁に使うためアクセスしやすくするためメニューの上位に移動されています。
  • VRChat 固有のクラスなどは VRC という分類にまとめられました。
  • Event には UdonEvent, VRCEvent という下位分類が作られました。
    • UdonEvent は Unity 由来のイベントなどが含まれます。(Update, OnTriggerEnter など)
    • VRCEvent は VRChat 固有のイベントなど含まれます。(Interact, OnDrop など)
    • この下位分類は Focus Search Selected Node 機能で適用されます。
    • 探しているイベントが見つからない場合は、別の下位分類に絞り込まれているためかもしれません。選択を外してから再度試みるとよいでしょう。
  • アイコンが C# ファイルのものになりましたが、一律にそうなっているだけで、さしあたり意味はなさそうです。

ノード作成時の動作(私見

ノード作成時の検索機能は、まだまだ今後の改善余地がありそうです。 「分岐のノードとして If を探す人が結構居る。Branch という名前は分かりにくいのでは?」 「Custom Event が Special に分類されているのは分かりにくい」といった意見を伝えたところ、 要望の必要性について開発担当の人から一定の理解は得られました。 ですが、UI ではない所まで波及してしまうのでさしあたり今回の変更・機能追加は見送られました。 「別名を付けたりして使いやすくするようなことが必要かもしれない」とのことでした。

また、Search On Noodle Drop 機能(ポートから接続線を伸ばしてノードが無い位置でリリースした時に、 候補を表示してそこからノードを作成して接続する機能)はまだまだ可能性がありそうです。 これはちょうど、テキストベースのエディタでの自動補完に相当していると言えるでしょう(Visual Studio でいうところの InteliSense)。 未完成のノードの状況から賢い候補選択をするというのは、技術的にもなかなか面白そうな課題だと思います。

特に「ノードのインプット側からデータの上流に向かって伸ばしていける」 というのはノードエディタの特徴をうまく活用することにつなげられそうです。 最初に処理の結果部分を「こういう風にしたい」と置いてから、 「では、それをするためのデータはどうすればいいんだろう?」というような作り方が無理なく行えるようになるかもしれません。 (フローを逆向きに作る事の有用性は、 Factorio や 工業系 MOD を入れた Minecraft といったゲームをプレイしたことのある人には、 「ああ、あれか」と納得してもらえると思います。)

これらの他にも、コンポーネントのドロップで変数を作る機能、ノードからヘルプを見る機能、といったものがあります。 これらをうまく組み合わせると、 「知識をまだ十分には持たない人が試行錯誤しながら学びながらプログラムを作る環境」というものに発展していくのかもしれません。

Variables ウィンドウ

変数の定義は、Variables ウィンドウで一括して行うように変更されました。

f:id:naqtn:20200613160639p:plain:w200
Variables ウィンドウの表示例

  • 追加と削除
    • 変数を追加するには右上の + をクリックします。表示された型の一覧から追加したいものを選びます。
    • 右クリックのメニュー Delete でその変数定義が削除されます。
    • Hierarchy から GameObject をグラフの地の部分にドラッグ&ドロップすることでも変数を作れます。
      • Variables の中にドロップした GameObject を初期値とする変数が作られ、ドロップした場所には Get Variable ノードが作られます。
      • 作られた変数は public になり、UdonBehaviour のインスペクタ表示 Public Variables 上で、ドロップしたオブジェクトが設定されていることが分かります。 (インスペクタへの反映は少し遅れます。欄はすぐに作られますが、値が入るには変数追加後にコンパイルが成功する必要があります。 自動コンパイルが起きるまで少し待つ必要があります。)
      • Drag and Drop for GameObjects and Components(公式ドキュメント)
    • 同様に Inspector からコンポーネントをドラッグ&ドロップすることでも変数を作れます。
      • Inspector 内のコンポーネントのアイコン表示(あるいは名称の部分)をドラッグします。

f:id:naqtn:20200626064341g:plain:w250
Hierarchy からのドロップ操作で、その GameObject を初期値に持つ変数を作成できます

f:id:naqtn:20200626194902g:plain:w400
Inspector からコンポーネントをドロップする事でも変数を作れます

  • 変数の利用
    • Variables からグラフの地の部分へ向けてドラッグ&ドロップすることで、その変数にアクセスするノードが生成されます。
    • Ctrl キーを押しながらドロップすると値を設定する Set Variable ノード、押さない場合は変数の値を取得する Get Variable ノードになります。
    • Drag and Drop for Variables(公式ドキュメント)
    • Get Variable ノードの output の型は従来 object でしたが、変数の型に変更されました。関連が無い型の input につなぐことは出来なくなりました。

  • 改名
    • 右クリックのメニュー Rename で名前の編集ができます。
    • (あるいはダブルクリックでも)
    • 編集は Enter キーで確定、ESC キーで中断します。
  • 命名の制限
    • 名前に使える文字に制限がかかるようになりました。
    • 制限を満たしていない場合、編集完了後空白表示になります
    • プログラム言語でよくある制限になっています。(英字かアンダーバーか数字のみ。ただし先頭に数字は不可。)
    • 以前のエディタで作製した物はそのまま表示されます
  • 詳細設定
    • 一覧中の「>」をクリックすると詳細情報が開きます。
    • Public 設定、Sync 設定、初期値の設定が含まれます。
  • ウィンドウ右下の縁をドラッグしてウィンドウのサイズを変えられます。

MiniMap ウィンドウ

MiniMap はグラフ全体を縮小表示するものです。大きなグラフでも全体を見渡せるようになりました。

f:id:naqtn:20200614190845p:plain
MiniMapの表示例

  • ツールバーにある Settings > Show MiniMap で表示の on/off が出来ます。
  • 黄色の枠が表示している範囲です。
    • (水平方向へずれて表示される不具合があります。)
  • ドラッグでウィンドウを移動できます。
  • 右クリックメニューの Anchor は、MiniMap 自体のドラッグを行えないようにする機能です。
  • MiniMap に縮小表示された個々のノードをクリックすると、それを選択して中央に表示します。
    • 通常のノードはポイントするには小さいので グループ 機能で、複数のノードを処理の塊ごとに囲っておくとグラフ全体を閲覧しやすくなります。

コメントノード

コメントノードに専用の表示形態が与えられるようになりました。 従来のものは、他の一般のノードと同様に作られていたため表示にやや難がありました。

f:id:naqtn:20200625194353p:plain:w300
コメントの表示例と追加メニュー

  • コメントは、ノード作成時の検索一覧の中で従来 Special の下に分類されていましたが、独立したメニューに移動されました。
  • 表示形態が一新されました
    • サイズを自由に変更できるようになりました。
      • 小さくしてもスクロールバーは現れません。意図せずテキストの一部が隠れてしまう、という事が起こるので注意してください。
    • ダブルクリックで編集を開始できます。入力し終わったら地の部分などをクリックして編集を終了します。
    • 複数の行を入力できるようになりました。
      • 改行の入力には(おそらく Unity 側の)問題があるようです。Enter キーを押すと改行が入力されますが、同時に編集確定になってしまいます。 長いテキストを入力する場合は、別途テキストエディタで編集してからコピー&ペーストしたほうが便利そうです。
  • 日本語入力
    • 日本語入力(IME)が使用できます。
    • 漢字はフォントが中国語のものであるため、奇妙に見えてしまう所があります。
    • (ユーザがフォント指定を出来るように要望を出しました。planned になっています。)
  • 既知の不具合・制限事項
    • コメントは今はまだ copy&paste、duplicate に対応していません。
  • Comments(公式ドキュメント)

グループ

ノードを見た目で束ねておける「グループ」という機能が追加されました。 ( Groups(公式ドキュメント)

f:id:naqtn:20200616185516g:plain:w250
グループ機能の基本的な動作(動きがぎこちないのは gif アニメーションで表示しているため)

  • プログラム実行時の意味や機能は無く、編集時に扱いやすくするものです
    • 視覚的にノードの塊が区別できるようになります
    • 個々のノードを選択せずに、まとめて動かせるようになります
    • グループには名前を付けることが出来ます
  • 右クリックメニューの Create Group で作成します。
  • ノードの取り入れ、取り外し
    • ノードをドラッグしてグループに重ねると下部が光るのでそこにドロップすると、ノードがそのグループに属すようになります。
      • グループにグループを入れることは出来ません。(グループを入れ子にすることは出来ません。)
    • 逆にノードをグループから出すには、ノードを選択して、シフトキーを押してからドラッグして取り出します。
      • (右クリックメニューの Remove From Group でも取り出せます。ただ、この項目が表示されなくなる不具合があります。)
  • 先にノードを選択しておいてからグループを作成すると、それらノードが入ったグループが作成されます。
  • 名前部分をダブルクリックすると名前が変更できます。
  • 名前部分をポイントしてドラッグすると全体を移動できます。
  • グループの矩形の大きさを変更することは出来ません。内部のノードを囲うように矩形は自動的に拡縮します。
  • MiniMap でグループを選択すると、グループ全体が見渡せるように表示位置調整がされます。グラフ全体を大きく移動しながら眺める時にも、ノードをグループに分けておくと便利です。
  • 既知の不具合
    • グループは今はまだcopy&paste、duplicate に対応していません。コピー先でグループが復元されません。

その他の改善点、既知の問題など

改善、変更点

  • ノードをコピー&ペーストした際に、変数選択が復元されない不具合は修正されました。
  • 一部のノードのラベルが分かり易いように変更されました。
    • 例:float の加算のノードが従来は「+」であったのが「Single +」と型が見てわかるようになりました。
    • (なお、この float と Single が表示上の不一致を起こしている問題は認識されています。)
  • const array をサイズ 0 で素直に作れるようになりました
    • 以前は表示と実際が異なることが起こり得ました。
  • 従来の Type ノードは生成した後に Type 値を変更できましたが、その機能は廃止されました。
  • 表示上の接続線と実際に内部で把握している接続にずれが生じることがあった不具合は無くなりました
    • こういった表示上の扱いは新規に作り直されているのでそのような不具合は結果的に無くなりました。 ただし新規作成ゆえに別の不具合が作られている可能性はあります。

Tips

  • 既に引かれている接続線をつなぎ変える時に便利な方法: 接続が1本である側(つまり、制御の流れならば出口側、データの流れならば入り口側)からドラッグして新たな接続を張る。 こうすると既に有った接続は自動的に削除されます。

グラフ・アセットを移行する際の注意

  • 以前のエディタで作成したグラフ・アセットはそのまま読み込んで使用できます。
  • 変数名の文字に制限がかかりました。従来のものはそのまま取り込まれますが、その後の編集の際には注意が必要です。
  • 変数のそばにコメントノードを置いていた場合、変数がノードではなくなったので何を指していたのか分からなくなりがちです。

不具合について

  • 「エディタ上で実行する際に、一度プレイボタンを押さないとプログラムが更新されない」というような不具合は相変わらずあります。内部的にはそれはグラフエディタの機能ではないので、まだ改善されていません。
  • ウィンドウを開く時(およびロードする時)に Scene ウィンドウと同じ場所に表示しようとします。その結果、勝手にウィンドウレイアウトが変更される場合があります。
  • ペースト操作したノードが以前に開いていたアセットに入ってしまう不具合があります。
    • ペースト操作の前に地の部分を一回クリックしてやると防げます。

リファレンス

操作一覧

(表を簡潔にするため、UIの見掛けで判別のつきそうなものは省略しています。)

分類 操作 機能
グラフ閲覧 解説
マウスホイール ズーム
ミドルボタンドラッグ 表示位置変更(パン操作)
Alt + 左ドラッグ 同上
a キー (All) 全てのノードが出来るだけ入る様に表示位置とズームを調整
o キー (Origin) 表示位置を原点に移し、ズーム等倍
[ キー 押すたびにノードを順番に閲覧(選択状態にして中央にしてズームを調整)
] キー ノードを逆順にたどり、上記と同じことをする
ノード選択 解説
Ctrl + A 全てのノードを選択
ノードを左クリック そのノードのみを選択状態に
地の部分で左ドラッグ 矩形範囲に入ったノードの選択
Ctrl + ノードを左クリック ノードを追加選択
Ctrl + 地の部分で左ドラッグ 矩形範囲に入ったノードを追加選択
ノード追加 解説
(スペース)キー ノードを作成する検索の表示(Quick Search か Focused Search(ノードを選択している場合))
Tab キー ノードを作成する検索の表示(従来方式である Full Search)
右クリックメニュー Create Node 上記スペースキーと同じ
ノード編集 (Unity での一般的なエディタ操作と同じ。Unity メニュー、右クリックメニューにも)
Ctrl + X キー カット
Ctrl + C キー コピー
Ctrl + V キー ペースト
Ctrl + D キー デュプリケート(複製)
接続線 解説
ポートをマウスでポイント 型の表示
ポートからポートへ左ドラッグ 接続線の作成(接続数が1の側から引き直した場合は既存のものは削除)
ポートからドラッグ&何もない場所でリリース ノードを作成する検索の表示(ポートの型に応じた検索&確定後接続)
変数 解説
Variables ウィンドウからドラッグ&ドロップ Get Variable ノード作成 (ノード編集の地の部分へのドロップ)
Ctrl + 上記 Set Variable ノード作成
Hierarchy ウィンドウからドラッグ&ドロップ 変数作成 (GameObject のノード編集の地の部分へのドロップ)
Inspector からドラッグ&ドロップ 変数作成 (Component のノード編集の地の部分へのドロップ)
MiniMap 解説
ノードを左クリック そのノードを選択状態にして中央にしてズームを調整
グループ 解説
右クリックメニュー Create Group グループを作成
ノードを選択して Create Group グループを作成して、選択したノードを格納
ノードを左ドラッグ&グループへドロップ ノードをグループに入れる
Shift + ノードを左ドラッグ グループからノードを取り出す
テキスト部分ダブルクリック テキスト編集開始 (Enter で編集終了。ESC で中止。)
コメント 解説
右クリックメニュー Create Comment コメントノードの作成
枠の右下をドラッグ 表示サイズ変更
テキスト部分ダブルクリック テキスト編集開始(他の部分をクリックて編集終了)

オープン操作

グラフエディタで編集を開始する手順はいくつかあります。(従来と同じです)

  • Unity メニュー から
    • VRChat SDK > New Udon Graph
    • Welcome 画面 が開かれます。前に編集していたグラフがある場合はオープンするボタンが表示されます。
  • インスペクタ中の UdonBehaviour コンポーネント表示から
    • UdonBehaviour コンポーネントの ProgramSource に Udon Graph Program Asset が設定されている場合 Open Udon Graph ボタンが表示されます。
    • 新規に作成する場合は、GameObject に UdonBehaviour を追加した後、 プルダウンメニューで Udon Graph Program Asset を選択した後に、New Program ボタンを押します。
  • インスペクタ中の Udon Graph Program Asset の表示から
    • Project ウィンドウで Udon Graph アセットを選択すると Open Udon Graph ボタンが表示されます。
    • 新規に作成する場合は、Project ウィンドウでフォルダを選択した後に、右クリックメニュー(あるいは Asset メニュー)の Create > VRChat > Udon > Udon Graph Program Asset を選択します。
    • (作成されるものは UdonBehaviour コンポーネントNew Program ボタンと同じです。初期の格納フォルダが異なるだけです。)

内部的な話題

  • 新しいグラフエディタは UIElements という Unity 2019 の新機能を使って作られています。
  • 用語メモ
    • ノード Node
    • エッジ Edge ノードをつなぐ線(ないしは辺)。向きがある。
    • ポート Port ノードに属するエッジがつながる場所。型情報など持っている。
      • input port ノードに入ってくる向きのポート
      • output port ノードから出ていく向きのポート
    • フロー Flow プログラムの進行を表すエッジ