見出し画像

Udon のはじめかた

対象読者

・Udon は導入したけど、使い方が何も分からない人
・C# は分かるけど、プリミティブな Udon も知っておきたい人
C# が分かる人は初めから UdonSharp を使った方がいいかも知れません

注意事項

Udon は現時点で Alpha です。
今後のアップデートで、ここに書かれた記述が正しくなくなる可能性があります。
また、なるべく簡単に説明をするために、正確性を犠牲にしている可能性があります。

準備

ここでは解説していませんので、準備の上で読み進めてください
・Unity2018 4.20f1 のインストール
・VRCSDK3+UDON を公式からダウンロードしてインポート

Udon Program を作成する

最初に、 Udon を使うために、 Udon Behaviour というコンポーネントを追加する必要があります。
[Add Component] -> [Udon Behaviour] を追加しましょう。

画像1

続いて、コンポーネントから Udon Program Source の右側の [New Program] ボタンを押しましょう。
自動的に Udon Program が作成され、コンポーネントに登録されます。

画像2

[Open Udon Graph] ボタンを押すと、 Udon Graph (Udon Programを作成するための画面) が表示されます。

画像3

ここに「どういう条件を満たした時に」「どういう処理を行うか」を記述します。
処理の記述は「ノード」を「線でつないで」行います。

Udon にノードを追加する

右上の [Add Node] をクリックするか、 Spaceキーを押すと、ノードを選択して追加できる画面が表示されます。
この中から、追加したいノードを選択します。
上部で検索も可能です。

画像4

Udon ノードの分類

注意:この分類は筆者独自のものです。公式の分類ではありません。

この記事では、独自にノードを5種類に分けて考えます。

・開始ノード
・操作ノード
・データノード
・制御ノード
・変数ノード

開始ノード

開始ノードは、なんらかの一連の操作の開始地点となるノードです。
種類によって、どのような条件を満たしたら処理が開始されるのかが異なります。

画像5

開始ノードは全て [Events] にまとまっています。
詳細は以下の通りです。

On から始まるノード
・ノードごとに決められた条件を満たした時に処理が始まる(衝突した、Pickup した、誰かがワールドに Join した、など)
・旧 SDK にあった VRC_Trigger の On から始まる条件とほぼ同じもの。
・ただし、 VRC_Trigger より使える条件は増えている。
Interact ノード
・旧 SDK にあった VRC_Trigger の OnInteract と同じで、 Interact すると処理が始まる。
・このノードを追加すると、オブジェクトが Interact できるようになる。
Start ノード
・オブジェクトが生成された瞬間に処理が始まる。
・最初からワールドにある物体ならワールドに入った瞬間、あとから出現する物体なら Spawn した瞬間、など。
Update, LateUpdate, FixedUpdate ノード
・いずれも、常に、何度でも繰り返し処理が開始される。
・LateUpdate は必ず Update の処理が全て終わった後に開始される。
・細かい違いは Unity のマニュアルを参照。

目的に合ったものを選択しましょう。

操作ノード

操作ノードは、 GameObject や Component などの値を設定したり変更したりするノードです。
開始ノードから、処理したい順番で必要な数だけ繋げます。
操作ノードは、操作する対象や設定する値などの情報を、直接入力するか、後述する「データノード」から受け取る必要があります。
よく使うことになるであろう操作ノードを2つ紹介します。

画像6

まずは GameObject.Set○○ 系のノード。
文字通りですが、 GameObject の設定を変更できます。
GameObject.SetActive なら、そのオブジェクトのアクティブ状態を設定します。
GameObject に何も指定しないと「この処理を呼び出したオブジェクト」が自動的に指定されます。
今回の例であれば、最初に Udon Behaviour を追加したオブジェクトが対象になるでしょう。
その下の Bool のチェックボックスで、オブジェクトをアクティブにするのか、非アクティブにするのかを設定します。

続いて Transform.Set○○ 系のノード。
こちらも文字通り、 Transform を設定できます。
Transform.SetPosition は、その Transform の X, Y, Z の値を変更します。
やはり GameObject に何も指定しないと「この処理を呼び出したオブジェクトの Transform 」が自動的に指定されます。

他にどのような操作があるか知りたい場合は Unityスクリプトリファレンス を調べると良いでしょう。

データノード

情報を取得したり計算したりして、他のノードに情報として渡します。
データノードに、更に別のデータノードからの情報を渡して処理することが可能です。

画像7

先ほどの処理に、対象とするオブジェクトを指定してみましょう。
GameObject.Find を使うと、指定した名前の GameObject を取得して、他の操作ノードやデータノードに渡すことができます(ただし、取得できるのはそのオブジェクトが「アクティブ状態」の時だけです)。
このようにすると、どこから呼び出されたかに関係なく Floor という名前のオブジェクトが非アクティブになります。

続いて、データノードからデータノードに情報を渡す例を見てみましょう。
今度は、 Transform の方でも、 Floor オブジェクトの Transform を設定するように変更したいと思います。

画像10

GameObject.GetTransform を使うと、 GameObject を受け取って、その GameObject の Transform を渡すことができます。
先ほどの GameObject.Find と組み合わせて、上記のように設定することで、 Floor の Transform を Transform.SetPosition に渡すことができます。

制御ノード

処理の流れを制御するためのノードです。
プログラムでは「if文」「forループ」「whileループ」と呼ばれるような構造を実現するノードです。

画像8

これらは全て [Special] の中にまとめられています。
順番に見ていきましょう。

Branch ノード
プログラムで言うところの if にあたります。
Bool に渡したデータが True なら上側、False なら下側に繋いだノードだけが、繋いだ順番に処理されます。
数値の大小比較や、等しいかの比較の結果を Bool に繋いで、条件分岐に使うのが一般的な使い方になるでしょう。
なお、 False の時は特に何もしない、という場合には、 False に何も繋がなくても問題ありません。
True も同様です。

For ノード
プログラムで言うところの for にあたります。
※未検証なので推測で書きます。
1番目の数値を変化させて、2番目以上になるまで Body を繰り返し実行するノードだと思います。
1回あたりどのくらい1番目の数字を変化させるかを3番目の数値で指定します。
繰り返しが終わった後は Exit が処理されると思います。

While ノード
プログラムで言うところの while にあたります。
※未検証なので推測で書きます。
Bool が True の場合は Body を繰り返し実行し、 False の場合は Exit を実行するノードだと思います。

変数ノード

後で使うために、数字や文字、オブジェクトなどを記憶してくれる「変数」を利用するためのノードです。

画像9

まず、変数ノードを使うためには、変数を使うことを宣言する必要があります。
追加するノードは、変数に何を入れたいかによって変わります。
文字列であれば String 、整数値であれば Int 、GameObject であれば GameObject ノードを追加してください。
この宣言ノードには矢印が1つもありませんが、特に繋ぐ必要はなく、ノードを追加さえすれば機能します。
最初の string は初期値、 name は変数名、 public は他の Udon Program と変数の値を共有するか(※未検証)、 synced は他のプレイヤーと変数の値を共有するか(※未検証)です。

次に、 SetVariable を使うと、変数にデータを保存できます。
どの変数に保存するかは、変数名で指定します。
保存したいデータをデータノードで取得して、 SetVariable の value に繋ぎましょう。
SetVariable は、既に入っているデータを上書きしますので、後で取り出せるのは最後に保存したデータだけです。

最後に、 GetVariable を使うと、 SetVariable で保存したデータを取り出せます。
前述の通り、複数回 SetVariable した場合には、一番最後に保存した情報が取り出されます。
また、一度も SetVariable していない場合には、初期値として設定した値が取り出されます。

最後に

この記事が少しでもこれから Udon を触ろうとしている人の助けになれば幸いです。
情報は気が向いたらアップデートするかも知れません。

この記事が気に入ったらサポートをしてみませんか?