初心者向けUdonの概要【VRChat】

## 概要

最近(2020年4月)VRChatで**UDONがあつい**ですね。
UDONとはVRChat専用のノードプログラミング環境(あってる？)で、UDONを使う事で色々な制御ができるようになります。
最近になって実装されたというわけではなく、UDONはそこそこ前から使えたのですがクローズドβのVRChatのみでしか使えませんでした。
これが<a target="blank" href="https://twitter.com/VRChat/status/1245437458528915456">最近のアップデート</a>でいつも使ってる環境のVRChatでも使えるようになったので再注目されてるわけです。
また、VRChatのSDKも**SDK2からSDK3にバージョンアップ**されています。

現在、UDONはAlpha版となってるので、機能しないものとかバグとかもあるっぽいです。
そこらへん、覚悟の上で使うのが良さそう。

## 環境構築

1. UnityHubの導入
2. UDON対応のUnityをインストール 
3. 新規プロジェクトを作成し、SDK3+UDONのUnityPackageを導入する

対応バージョンのUnityの新規プロジェクトにパッケージをぶちこめば環境構築終了です。
公式の導入手順とチュートリアルもあるのでリンクを貼っておきます。

- <a target="blank" href="https://ask.vrchat.com/t/getting-started-with-udon/80">Getting Started with Udon</a> ※公式
- <a target="blank" href="https://docs.vrchat.com/docs/current-unity-version">VRChatに対応しているUnityVersion</a>
- <a target="blank" href="https://vrchat.com/home/download">SDK3+UDONのPackageのダウンロード</a> ※要ログイン

## サンプル

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">なるほど… <a href="https://t.co/w9IFgMAewD">pic.twitter.com/w9IFgMAewD</a></p>&mdash; けもみみおーこく (@kemomimi_oukoku) <a href="https://twitter.com/kemomimi_oukoku/status/1247648235792953344?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

スイッチとなるオブジェクトをインタラクトしてから、指定した秒数後に切り替わるようなものを作りました。
<a target="blank" href="https://github.com/Merlin-san/UdonSharp">UDONをC#みたいに書けるUdonSharp</a>というのがあるのですが、どういうものか知るために一旦ノードを使いました。
この程度のものを作るのにも結構苦戦しました。
<a target="blank" href="https://docs.vrchat.com/docs/getting-started-with-udon">公式のドキュメント</a>も殆どブランクのページになっていて、サンプルも無ければ、リファレンスもないので、他の人の情報を調べたり手探りでやる必要があります。

## サンプルのコード

![2020-04-08_12h00_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/3538f93f-fd6a-ee85-ada8-cad15e7deec9.png)

詳しくは説明しませんが、気を付けたほうがいい点と簡単なTips

・定数は「const (欲しい型)」で検索

・値の比較は「Less Than (欲しい型)」「Greater Than (欲しい型)」で検索

・入力に２つ以上のノードを扱うノードの場合、上と下が入れ替わると処理の結果が変わったりする事もある。

・Get Variableノードを直接Set Variableノードに繋ぐとSetできない。
　Get VariableノードのデータはObjectの状態？

・イベント関数のノード(updateとか)は１本しか生やせない（２本生やして複数に繋げない）
　イベント関数を分岐させるにはBlockノードに差して分岐させる必要がある

・暗黙的型変換は行えないので、型変換用のノードを差す必要がある
　UnityC#みたいにfloatを直接Textに表示させるとかはできない

単純な処理も簡単にドカッとノードが増えて冗長になりがちです。
基本的にコードの方が処理を追いやすいですね…

## UDONやった方がいい？

かなり目的によると思います。
*VRChatのモダンな開発がしたい(？)* のであればUdonSharpとGitを使った開発環境を整えるのがいいと思います。
必要なものが完成すればよくて、それがSDK2で実現可能でかつ簡単であるならSDK2でいいと思います。
今触るのは明確にUDONを触るモチベーションがある人が触るのがよさそう。

ただ、SDK2では作るのが難しかった、**値を使った処理**が素直に書けるのがUDONのメリットだと思います。
(詳しくないのですが)SDK2でもSlider使ったり、何かしらの方法で値をとる事はできると思うのですが、オブジェクトの現在地なんかを調べるのは難しいと思います。
(レンダーテクスチャのUV座標だとか、Standardassetのハックだとか、そういうのはあると思いますが）

UDONを使うとオブジェクトの現在地が現在地として知る事ができるので、値が素直に扱えます。
randomとかMathとかあるので、ゲームロジックとか、座標などの値のデータを使いたい処理があるのであればUDON一択だと思います。

## 初心者だけど何から学べばいい？

かなり難しい問題だと思います
何故なら、**C#(MONO)** の上にできてる **Unity** の上にできてる **VRChat** の上にできてる **UDON** の上にできてる **UdonSharp** を **ネットワーク(同期処理)** の事を考えながらやる必要があるからです。
どういう事かというと、Unity上で最新のC#の最新バージョンが使えるとは限らないし、UnityのC#にできてもUDONにできるとは限らないし、C#で書けてもUdonSharpでは書けない事もある とかそいうやつです。
そういうのを考えながら開発してゆく必要があります。
（ローカルで動くプログラムをネットワーク対応するハードルは結構高いし、VRC側のドキュメントも少ない）

また、理想を言えばShaderが書けたり、CGの基礎が分かってたり、3Dモデルをこしらえたり、デザインができたり、VRChatの仕様を把握していたりしたほうがいいという問題もあり
個人的に「VRChatはC#が書けないから素人のお遊び～」みたいなノリは完全に終わってる感じがします。VRChatの最前線でコンテンツ作るのは結構ヤバイ。

とはいえ、どこかしらから学習しないとUDONにたどり着けない。

### 個人的にいいんじゃないかな？と思う学習パターン

1.<a target="blank" href="https://prog-8.com/">Progate</a> のJavaコースを徹底的にやる
2.Unityのチュートリアルをいくつかこなす
3.UdonSharpで開発を開始し、分からなければぐぐったり聞いたりしながらコンテンツ制作をする

**※あくまで個人的な主観です、人によっても違うかと思います※**

#### Unityなのに何故Java？

「Javaをやる」というより**「クラスとか変数とかの基本概念を理解する」**のが目的です。
プログラミングの基本概念がわからない状態で闇雲にUnityのサンプルを作っても、スクリプトの部分でどうしてこの書き方になるのか？とか、スクリプトが何してるのか？とか分からないので、Progateじゃないにしろ**何かしらプログラムの基本概念**はおさえた方がいいです。
（クラスのインスタンス化、インスタンスからメソッドの呼び出し、引数戻り値、インスタンスへの変数のセット、コンストラクタ　辺りは分かった方が良さそう）
(Unityのサンプル作成はプログラムの深い所まで教えてない場合が多い、using の意味とか)

Progateのいい所

- 教材と課題を用意してくれる。自分で手探りしなくていい。１本道。
- Webで実習ができるので、自分で開発環境を構築する必要がない。
- Webでやれるので「隙間時間にちょっとやろ」みたいなのが気軽にできる。
- 仕事終わった後の勉強は腰が重いけど、Progateなら開ける（学習までの距離が近い）
- 一応、スマホアプリ版もある。

Progateの中に存在するコースの中でC#に近いと思うのがJavaなのでJavaコース。
Unityだとあまり扱わない純粋なクラスの作成、継承、インスタンス化の概念もProgateで学べる。

#### Unityのチュートリアル

ProgateのJavaコースをマスターした状態で、サンプルを作ると（分かる…分かるぞ…！）となると思います。
なので、下手にいきなりUnity開発におけるC#を学ぶより、プログラミングから入った方がよいという感じです。
ただ、ある程度Unityのクラスにアクセスする感覚があった方がいいとおもうので、ProgateからUdonに飛び級せずに、Unityで簡単なゲームをいくつか作った方がいいと思います。

## UDON関連のリンク

- <a target="blank" href="https://ask.vrchat.com/t/getting-started-with-udon/80">Getting Started with Udon</a> ※公式
- <a target="blank" href="https://kurotori4423.github.io/KurotoriMkDoc/VRChat/UDON%20%E3%81%A7%E3%82%AE%E3%83%9F%E3%83%83%E3%82%AF/">黒鳥さんの UDONメモ</a>
- <a target="blank" href="https://hatuxes.hatenablog.jp/entry/2020/04/05/013310">はつぇさんの U#入門</a>
- <a target="blank" href="https://qiita.com/amamagi/items/ac497db1b20cb754a1e6">あままぎさんの VRChat Udon (OPEN ALPHA) ことはじめ</a>

参考にさせていただきました。ありがとうございます。

### UDONの深い話

- <a target="blank" href="http://phi16.hatenablog.com/entry/2020/04/13/180940">Udon/U#についての諸記録</a>

今すぐ開発！な人はphiさんの記事を見ておくといいかも

## まとめ

VRChatとかいうUnityエンジニア養成プログラム