更新情報
2021年12月22日: 配列についての補足説明を追加。VRCPlayerApi, Networkingに次記事への誘導を追加。回転系の処理について言及を調整。
2021年10月30日: ノード検索についての内容を追加・調整
目次
- 対象者
- この記事の概要
- Udonとは?
- 基礎知識編
- UdonGraph編
- 作例
-
種類別 よく使うノード一覧
- イベント(QS: Events)
- 分岐・ループ処理(QS: Special)
- 変数関連(QS: なし 検索不可)
- 計算(QS: System→任意の型名)
- 比較関連(QS: System→任意の型名 Equal系は更にその中のOther内)
- 条件分岐関連(QS: System→Boolean)
- 配列関連(QS: System→任意の型名[])
- GameObject系(QS: System→GameObject GetComponentのみ更にその中のGetComponents内)
- Transform系(QS: System→Transform GetComponentのみ更にその中のGetComponents内)
- VRCPlayerApi(QS: VRC→PlayerApi) Networking(QS: VRC→Networking) など
- その他
- おわりに
対象者
- VRChatのワールドギミックを作ってみたい人
- Udonって何?という人
- UdonSharpで挫折した人
など...
この記事の概要
- UdonGraphを使ったギミックの作り方説明
- UdonSharpは使わないので、追加で必要なものは無し
- プログラミングが分からなくてもOK
UdonGraphの情報が少ないので記事を書きました。
VRCユーザーがUdonをもっと手軽に扱えるようになりますように。
わかりにくいところや問題点があれば、Twitterなどにお願いします!
ちなみに、UdonGraphを用いたサンプルをBoothで無料配布していますので、良ければ参考にどうぞ。(随時更新)
Udonとは?
- Udon
- VRCSDK3で追加された、ワールドギミックのためのプログラミング言語
- 作った処理をゲームオブジェクトに付けて動作させることが出来る
- UdonGraph
- VRCSDK3を入れれば使える
-
ノード
を線で繋ぐことによって処理を作る(任天堂の「はじめてゲームプログラミング」に少し似ている) - 非プログラマー向けではあるが、前提知識が無いと少しつらい
-
UdonSharp
- C#の記法でUdon処理を作ることが出来るもの
- プログラマー向け(特にC#やUnityでゲーム制作の経験がある人など)
- 使うには追加でアセットを入れる必要がある(標準ではない)
動作確認環境
・Unity 2019.4.31f1
・VRCSDK3-WORLD-2021.09.30.16.18_Public
この記事は2021年10月22日時点の情報です。
Udonはアップデートされていくため、情報が古くなりやすく、最新版とは仕様が違うことがあります。
基礎知識編
- プログラミングの経験が無い方向けの用語説明
- 分かる方は読み飛ばし推奨
- Unityの知識が少し必要
- アバターやワールドを触ったことがあれば多分大丈夫
型
データの種類、と言えるものです。
その中でもUdonGraphでよく見かけるものを列挙し、少し雑に説明します。
-
int
整数
(例: -16, 0, 1, 32など) -
float(Singleと表記されることも)
実数(小数と整数)
(例: -1.2, 3.14, 5.0など) -
string
文字列
(例: VRChatなど) -
bool(booleanとも)
真偽値
(TrueかFalseの2種類で、それぞれ真、偽) -
GameObject
Unityのゲームオブジェクト
(例: CubeやEmptyなど、Unity上で設置出来るもの) -
Transform
Unityゲームオブジェクトの位置情報などが入った要素(Component)
(UnityのInspectorで見られる、座標や回転角度を入力出来るアレ) -
Vector3
位置情報(X, Y, Z)
角度の表現に使われることもある -
UdonBehaviour
Udonプログラム要素(Component)
(UnityのInspectorのAdd Componentにて、Udon Behaviourとして追加されるもの) -
VRCPlayerApi
VRChat内のプレイヤー情報
プレイヤー名やワールド上の位置などが取得出来る -
[]
型名に[]が付いたものはその型の配列(後述)
(例: int[], float[], GameObject[]など)
変数
変数とはデータを格納するための箱のようなもの、とよく表現されます。
この箱にデータを格納しておくことで、後から取り出して使うことが出来ます。
例えば、int型の変数xに2を代入する、といった感じです。
配列
配列とは、変数を複数纏めた棚のようなもの。
先頭を0番として、番号で指定して中身を取り出したりすることが出来ます。
この番号を配列の添え字、または要素番号と呼び、それぞれの中身のことを要素と呼んだりします。
例えば、int[]である[8, 1, 9, 2]の2番目の要素は9。要素数(要素の数)は4つです。
補足: 引っ掛かりやすいポイントですが、配列の要素番号は0から始まるため、0番目の要素が8、1番目の要素が1、2番目の要素が9、3番目の要素が2となります。
イベント
特定の条件が満たされた時などに実行される処理。基本的に、これを起点にして処理を作ることになると思います。
(ちなみに、「~された時に実行される」という言葉は、「~された時に呼ばれる」と表現されることがあります。)
オブジェクト
とても大雑把に言えば、モノ
です。どんな型・データが入っているかを考えず、一纏めにして扱うときに出てきます。
変数も値も、あらゆるものがオブジェクトと言えます。
その他用語
-
ループ
繰り返し処理のこと。 -
get
主にデータを取得したいときに出てくる。 -
set
主にデータを設定したいときに出てくる。
UdonGraph編
Udonをゲームオブジェクトに付ける方法や、その編集の仕方などを説明します。
Udonの付け方
InspectorからUdon Behaviour
Componentを追加します。
追加したら、ProgramSourceのプルダウンメニュー(右下の三角形のところ)を選択して、Udon Graph Program Asset
を選択し、New Programを押します。
Open Udon Graph
をクリックすることで編集画面を開けます。
基本的な組み方
Udon Graphはノードを線で繋いで処理を作ります。
ノードには、処理を分岐させるためのBranch
ノードや、オブジェクトからデータを得るためのget系ノードなど様々な種類があるので、作りたい処理に応じて使いたいノードを選択します。
ノードを検索するには、主にQuick Search
を使います。
Quick Search
は右クリックからCreate Node
を選択するか、スペースキーを押すことで開けます。型や種類で分類されていて、マウス等で選択して探すか、名前で分類を検索することが出来ます。
ノードを選択すると、画面上にノードが配置されます。
なお、名前は分かっているがどの分類にあるのか分からない、という場合はtabキーでFull Search
を開いて検索することも出来ますが、処理に少し時間が掛かります。
ノードを検索する方法はもう一つあり、線を何もないところにドラッグ&ドロップすることで入出力検索が出来ます。
これを使うことで、繋げたい入出力に対応したノードを検索することが出来ますが、一部の型(Objectなど)については対応しているはずのノードが表示されない場合があるため、ここに表示された検索結果を鵜呑みにはせず、参考程度に使用することを推奨します。
右向きの三角形で繋がった線が処理の流れ、丸で繋がった線がデータの流れになっています。
変数の追加・設定
ノードとは別に、変数が設定できます。設定した変数はノードで操作します(後述)
左上のVariablesメニューの+ボタンを押し、追加したい変数の型を選ぶと変数が追加されます。
変数左の三角形を押すと変数の設定画面が現れます。
public
はチェックを入れることでInspectorから値を入力出来るようになります。(上の画像は実際に変数に値を指定している例)
synced
はチェックを入れることで他の人と値を同期できるようになります。(一部の型のみ)
default value
で初期値を設定できます。
変数を右クリックすることで変数名の変更なども可能です。
なお、配列の場合はDefault ValueのところにEdit
ボタンがあり、これを押して初期値を編集します。
sizeは要素数で、これを変更したりして初期値を変更します。(要素の数だけ入力欄が出ます)
編集を終えたらSave
を忘れないようにしましょう。
作例
これは実際にUdonGraphを使ってスイッチを作ってみたものです。(私が配布している【無料】スイッチ数種類【説明付きUdon配布】の中の1つです)
個々のノードの説明は次節の一覧の中にあります。
種類別 よく使うノード一覧
Quick Search時に選択する箇所を(QS: 場所)として記します。検索キーワードを入力する場合はEventsやSystemなどを除いた名前で検索します。
イベント(QS: Events)
- Start
初回読み込み時に実行される。これを用いて初期化処理などを行うことが出来る。 - Update
毎フレーム実行される。リアルタイムに処理を行う場合などに用いる。 - Interact
オブジェクトを触った時に実行される。これに処理を繋げることで、Use
関連の設定がUnityのInspector(右側?)に表示されるようになる。 - OnPlayerJoined
プレイヤーがワールドにJoinした際に実行される。Joinしたプレイヤー情報(VRCPlayerApi型のデータ)が利用可能。 - OnPlayerLeft
プレイヤーがワールドから離れた際に実行される。離脱したプレイヤー情報(VRCPlayerApi型のデータ)が利用可能。
分岐・ループ処理(QS: Special)
- Branch
与えられたboolの値に応じて処理を分岐する。いわゆるif文と同じ。 - While
与えられるboolの値がTrueの間、Bodyに繋がっている処理を繰り返す。与えられるboolの値がFalseである、又はFalseとなった時、Exitに続く。 - For
startから始まり、indexがend未満の間、Bodyに繋がっている処理を繰り返す。処理を1週する度、indexにstep分の値が加えられる。処理終了後、Exitに続く。
変数関連(QS: なし 検索不可)
- Get Variable
画面上のVariablesから変数をドラッグアンドドロップで出るノード。変数の値を得る。 - Set Variable
画面上のVariablesから変数を、Ctrlキーを押しながらドラッグアンドドロップで出るノード。変数の値を設定する。チェックボックスにチェックを入れると、On Var Changeイベントが呼び出される。 - On Var Change
画面上のVariablesから変数を、Altキーを押しながらドラッグアンドドロップで出るノード。変数の値が変わった際に実行されるイベント。
計算(QS: System→任意の型名)
- Addition
2つの数を足した結果を得る。 - Subtraction
上の数から下の数を引いた結果を得る。 - Multiplication
2つの数を掛けた結果を得る。 - Division
上の数を下の数で割った結果を得る。
intの場合、割り切れなくても計算結果が整数になることに注意が必要。 - Remainder
上の数を下の数で割った際の余りを得る。
比較関連(QS: System→任意の型名 Equal系は更にその中のOther内)
- GreaterThan
上の数が下の数より大きい時、Trueを得る。そうでない時、Falseを得る。 - GreaterThanOrEqual
上の数が下の数以上の時、Trueを得る。そうでない時、Falseを得る。 - LessThan
上の数が下の数未満の時、Trueを得る。そうでない時、Falseを得る。 - LessThanOrEqual
上の数が下の数以下の時、Trueを得る。そうでない時、Falseを得る。 - Equality または Equals
値が同じ時、Trueを得る。そうでない時、Falseを得る。 - Inequality
値が異なる時、Trueを得る。そうでない時、Falseを得る。
条件分岐関連(QS: System→Boolean)
- ConditionalAnd
boolの値で「かつ」を処理する。(2つの値が共にTrueならTrueを得る) - ConditionalOr
boolの値で「または」を処理する。(2つの値がどちらかTrueならTrueを得る) - ConditionalXor
boolの値で「どちらかが真なら」を処理する。(2つの値が異なる時、Trueを得る) - UnaryNegation
boolの値を反転させる。
配列関連(QS: System→任意の型名[])
- Get または GetValue
index番目(要素番号の位置)の要素を得る。 - Set または SetValue
index番目(要素番号の位置)の要素を設定する。 - get Length
配列の要素数を得る。
GameObject系(QS: System→GameObject GetComponentのみ更にその中のGetComponents内)
※unity gameobjectで検索すると詳しい情報が得られると思います。
- get activeSelf
ゲームオブジェクトのアクテイブ状態を得る。 - get name
ゲームオブジェクトの名前を得る。 - get transform
ゲームオブジェクトのTransform要素を得る。 - SetActive
ゲームオブジェクトのアクテイブ状態を設定する。 - GetComponent
ゲームオブジェクトにある任意の要素(Component)を得る。ただし、同じ種類の要素が2つ以上ある場合、意図しない動作をする可能性がある。例えば、UdonBehaviourが2つ付いていた場合、どちらか参照されるか分からない。
Transform系(QS: System→Transform GetComponentのみ更にその中のGetComponents内)
※unity transformで検索すると詳しい情報が得られると思います。
- Find
子のゲームオブジェクトを名前で探し、得る。(/
を用いることで孫のゲームオブジェクトなども得られる。) - get gameObject
そのTransformを持つGameObjectを得る。 - get position
座標を得る。ワールドの絶対座標であることに注意。 - get localPosition
座標を得る。親のゲームオブジェクトに対する相対座標であることに注意。(つまり、UnityのInspectorで見られる数値) - set position
座標を設定する。ワールドの絶対座標であることに注意。 - set localPosition
座標を設定する。親のゲームオブジェクトに対する相対座標であることに注意。(つまり、UnityのInspectorで見られる数値) - Translate
現在位置から指定した座標分移動させる。 - GetComponent
そのtransformを持つゲームオブジェクトにある任意の要素(Component)を名前で得る。ただし、同じ種類の要素が2つ以上ある場合、意図しない動作をする可能性がある。例えば、UdonBehaviourが2つ付いていた場合、どちらか参照されるか分からない。
回転系の処理は少し複雑なため割愛します..."unity transform 回転"などで調べていただければ情報が得られるかと思います。
(いつか別記事に纏められたらなと思います。)
VRCPlayerApi(QS: VRC→PlayerApi) Networking(QS: VRC→Networking) など
量が多いため別の記事に纏めます。
纏めました。
【VRChat】VRCPlayerApi と Networking【SDK3】
その他
- UnaryMinus(QS: System→任意の数値系型名)
数値の正負を反転させる。 - Tostring(QS: System→任意の型名→Other)
値を文字列に変換する。つまり、Stringが得られる。 - To<任意の型名>(QS: System→Convert)
任意の型に値を変換する。(例えば、intからfloatなど) - Const This(QS: Special)
このノードを置いたUdon Behaviour要素の付いているゲームオブジェクトが得られる。
(例えば、AというゲームオブジェクトのUdon内でThisを用いると、Aが得られます。) - Const 任意の型名(QS: System→任意の型名)
任意の型の定数(決まった値)を設定し、得る。 - Is Valid(QS: Special)
オブジェクトが有効なものであるかどうかで処理を分岐する。 (分かる方向けに言えば、Nullチェックに用いる) - IsValid(QS: VRC→Utilities)
オブジェクトが有効なものであるかどうかの真偽値を得る。 (分かる方向けに言えば、Nullチェックに用いる)
おわりに
ご覧いただきありがとうございます。
参考になれば幸いです。