VRChat Udon (OPEN ALPHA) ことはじめ

2019/12/20時点での情報になります。
(追記2019/12/20) packageのインポート順が逆になっていたため修正
(追記2019/12/20) 公式フォーラムへの誘導を追加
(追記2019/12/21) Current Udon Statusの引用を追加

# はじめに
VRChat運営チームより、Udonを始めるにあたって以下の投稿を一読することが推奨されております。この記事を読み進める前にリンク先の投稿をお読みください。
[Getting Started with Udon](https://ask.vrchat.com/t/getting-started-with-udon/80)

以下、Udonの現在のステータスに関して、上記リンク先の投稿より一部を抜粋した引用文の機械翻訳を貼り付けておきます。
>うどんの現状
>うどんは現在OPEN ALPHAです。どういう意味ですか？

>オープン：基本的にうどんのすべてを自由に共有できます！投稿、ストリーミング、動画の作成などを行います。ただし、うどんを共有する際には、次の2つの点を考慮していただけると嬉しいです

>お使いのプラットフォームに該当する場合は、＃MadeWithUdonハッシュタグを使用して作業を共有してください！
VRChat Udonの作品を共有する場合は、視聴者/読者にUdonがまだアルファ版であり、まだ完全に機能していないものがあることを通知してください。これは、うどんの最終的な状態ではありません。
誰かがうどんを試したいときは、ファイルを送らないで、このスレッドに送ってください！ファイルを頻繁に更新し、すばやく繰り返します。また、Discordの＃open-beta-notificationsチャンネルで、新しいバージョンがプッシュされ、このスレッドが更新されることを発表します。 ＃open-beta-infoチャンネルの緑色のCommunity Labs反応をクリックして、必ずOpen Betaの役割を選択してください。

>アルファ：うどんは機能が完全ではなく、バグがあるため、アルファ状態と見なされます。やるべきことがたくさんあります。特に、Udon Syncはまだ完全には完了していません。つまり、変数と状態の同期はまだ完全には機能していません。これは、同期を必要とするSDKの内容にも影響します。詳細については、以下の既知の問題のセクションをご覧ください。
>また、これは、重大な変更が発生した場合にUdon SDKを更新し、Udonを使用したワールドを再アップロードする必要があることを意味します。うどんの世界を「アップグレード」するには、さらに手順が必要になる場合があります。グラフの再構築を余儀なくされるような完全に破壊的な変更を回避しようとしていますが、これが発生しないことを保証することはできません。
>最後に、まだ夢のメガプロジェクトを構築しようとしないでください。私たちはまだアルファにいるので、物事が壊れたり、修正されたり、追加されたり、削除されたりする可能性があります。バグの発見、問題点の文書化、ワークフローの確立に焦点を当てたいと思います。あなたが本当に私たちを助けたいのであれば、コア機能をテストしてみて、いくつかの「リミックス可能な」例を構築してみてください。あなたが基本的な世界のクリエーターだった場合、あなたの助けとなるシーンに簡単にコピー＆ペーストしたいものは何ですか？そのようなものを構築してみてください。

# 導入
- UnityHubをインストール (詳細割愛)
- Unity 2018.4.14f1をインストール (詳細割愛)
- Unity 2018.4.14f1で新規プロジェクトを作りVRCSDK3、UDON SDKの順でUnity Packageをインポート
    - VRCSDK3、UDON SDKは以下のリンクからDL
        - https://ask.vrchat.com/t/getting-started-with-udon/80

# Cubeを動かす
sin(time)でCubeをx方向に動かしてみます

- Hierarchy上で右クリックしてCubeを生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/09c7b240-f4cf-0ec6-841c-9b48dd0ffebb.png)


- シーンにCubeを置いて`Udon Behaviour`をアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/7de5f637-0055-a8af-8af7-52b88687e38c.png)

- `New Program`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/d9f8819b-f7c4-c7df-474b-0c9bf7b6e811.png)

- `Cube Udon Graph Program Asset`が生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/711830e6-b075-3374-9a54-7dcfabe479a1.png)

- `Open Udon Graph`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/3038f9bc-cb4b-e1b7-5ead-bbfdec4ff672.png)

- `Udon Graph`ウィンドウが開かれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/99f4f1f1-4642-e9f4-643a-bb58c72f983e.png)

- Spaceキーを押してノード選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/7a2d16f4-b54b-f021-e6b8-3d7cd0837e37.png)

- 検索フィールドに`FixedUpdate`と入力して`FixedUpdate`ノードを生成
    - 毎フレーム処理を行うためのノードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/5b012846-4470-8666-d5b8-56e4c413bcb2.png)

- `Events > FixedUpdate`と階層をたどって選択することもできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/df5b8640-4863-9e5c-df79-0b92004fda26.png)

- `Transform.Translate`ノードを生成
  - オブジェクトを平行移動させるノードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/771c7d32-0210-3fbe-02cb-c7aceef6d71e.png)


- `Fixed Update`と`Transform Translate`を接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/85e5f4b0-bbcc-43b7-fa85-686ef3b488d8.png)

- `Transform Translate`の入力を`(float, float, float)`にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/cfc1b85c-f0cf-def7-7ba5-9edf7c3bb8e9.png)

- `Time.get fixedTime(float)`を生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/6a1cbaca-03f3-b9b9-0c85-952532463fac.png)

- `Mathf.Sin(f)`を生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/4e5f5f3a-f17d-f15a-a8bf-d2dc8539a302.png)

- `Time Get Fixed Time`と`Mathf Sin`を繋ぎます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/21df5d40-ca3c-3f4e-209f-355c654eca64.png)


- `float.Multiplication(flaot, float)`を生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/5738bd4d-a96e-1419-9d78-e14df30af646.png)

- `Op Multiplication`の一方の入力欄に`0.1`を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/19db74d7-ad83-d5a1-5a91-83af0b531e9a.png)

- `Mathf Sin`を`Op Multiplication`のもう一方の入力欄に接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/ea9da93e-ba89-f93c-9996-b9d3c53b1b2e.png)

- `Op Multiplication`を`Transform Translate`のxに接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/169c0a8b-25c5-6e5f-1cd6-91bed4e59248.png)


- これでノードは完成です。`Ctrl+S`でシーンを保存してから`Ctrl+P`でPlayModeに移行するとCubeが動きます。
![cube.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/36d7c55c-721a-457d-4223-ba1ed4b6c82b.gif)

# 所感
- Unityのイベント関数やクラスがを使えるのでUnityの知識があれば活かすことができます。
    - かなりの数のUnityEngineのコンポーネントにアクセスできます。ヤバイ。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242383/6d4e718b-ec49-b44f-a11e-627b8e9192af.png)

    - 使い方がわからないクラスは[Unityのマニュアル](https://docs.unity3d.com/ja/2018.4/Manual/UnityManual.html)を読めば使い方が分かるようになると思います。
 
# 参考記事
- [Getting Started with Udon \- Udon \- VRChat Udon Discussion Forum](https://ask.vrchat.com/t/getting-started-with-udon/80)
- [Getting Started with VRChat Udon \- YouTube](https://www.youtube.com/watch?time_continue=111&v=NsIMuGFEcEg&feature=emb_title)


# 備考
- 今まで`Transform`クラスのメソッドにアクセスできなかった反動から、つい`Transform.Translate`ノードを使っていますが、位置を直接指定したい場合は`Transform.set postition`ノードが使えます。