プログラミング未習得者でも作れるVRChat SDK3ワールド

#こんな人に向けて書きます
・今までVRChat SDK2でワールドを作った経験がある
・つよつよな人が作ってくれたUdonギミックを使ってワールドを作りたいけど、そもそもSDK3ワールドの作り方がわからないウギギ
・だからSDK3を覚えたいんだけど、Udonってプログラミングなんでしょ……？（絶望）

こういった、プログラミングがわからないワールドクリエイターに向けて、
SDK2のような感覚でSDK3ワールドを作れるようになってもらうのが当記事の目標です。
「Udonの作り方」ではなく、「Udonの使い方」です。
極力、プログラミングの話はしないように心掛けたいと思います。

# まずは基本的なパッケージインポートから
まず、最低限必要なパッケージのインポートを行いましょう。
次の２つは確実に必要です。

1.VRChat SDK3-World
2.UdonSharp

1は説明不要ですね。VRChat公式からダウンロードしてインポートしてください。
2についても、あらゆるUdonのツールを使う上ではほぼ必須となります。

そもそもUdonというのは、公式ではこういったUdonGraphという編集画面を用意して、ノードを作ってつないでいろんな機能を使えるようにしたものです。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/60750b09-383a-8757-d741-cbade049e1ef.png)
めちゃくちゃ凄いですね。
よし、これを使っていろんなUdonを作ってみよう！
となるわけですが、内容はけっこうプログラミング寄りなので、プログラミングわからん勢には難しいし、
プログラミングわかる勢にも実はちょっと不評なのです。
いつものC#というプログラミング言語で記述すれば２，３行で済むようなことが、
画面いっぱいにノードを作ってつないで、を重ねないとダメだったりします。
あぁ……これをC#で記述できたらなぁ……
と多くの人の願いが渦巻いたところで、神が降臨しました。
それが、UdonSharp（通称U#）です。

https://github.com/MerlinVR/UdonSharp

UdonSharpは、UdonプログラムをC#で記述できるようにしたものです。
その機能は本家UdonGraphに対して制限されるどころか、拡張されている感じさえあります。
もはや、Udonを作る上で、UdonSharpを使わない理由はなく、
今やほとんどの開発者がUdonSharpでUdonギミックを作っています。

前置きが長くなりましたが、
そういうわけなので、とにかくUdonSharpもダウンロードしてインポートしてください。例外はないです。

最新版パッケージのダウンロードはこちらから
https://github.com/Merlin-san/UdonSharp/releases/latest

#便利なSDK3対応アセットをインポートする
次にあなたが入れたいアセットを入れましょう。
まず、以下はSDK3に対応している、オススメのアセットです。
VRChatでワールドを巡っている人であれば、必ずどこかで見たことがあるはず。
有難いことに、どれも無料です。

・[Lura's Switch](https://booth.pm/ja/items/1969082)
ミラーなど、ワールドでよく使うスイッチがモデル付きで提供されています。

・[iwaSync3](https://booth.pm/ja/items/2666275)
ビデオプレイヤーといえばコレ！

・[Qv Pen](https://booth.pm/ja/items/1555789)
色とりどりの色鉛筆でワールドに絵や文字が描けるペンツールです。

この３つが備わっているだけでも、VRChatのワールドとして形になるでしょう。
これにプラスして、あなたが使いたかったUdonならではのワールドギミックをインポートしてみましょう。

#ギミックを作りたいなら
そうはいっても、やはり独自ギミックは必要ですね。
今のままでは、ただのスイッチすら作れません。
SDK3には、SDK2のギミック作成の肝だったVRC_Triggerが（今のところ）存在しません。
ギミックを作りたい？
Udonがありますよ！　Udonをこねましょう！
という状態です。
プログラミングわからん勢には厳しいですよね。

これまでも、あらゆる開発者が便利なツールを作ってくださっていますが、
もう一つ汎用性に欠けるとか、何かが足りないとか……
いや、やっぱり、皆さんはVRC_Triggerが欲しいはず。

ということで、私が作ってしまいました。

こちらの「Trigger2to3」を使ってください。
https://github.com/hoke946/Trigger2to3/
VRC_Triggerの代替ツールです。

使い方は、この記事を一度読んだ後に見てください。
VRC_Triggerが使える人であれば、きっとすぐにモノにできるはずです。

（追記）その後、cyanlaser氏による[CyanTrigger](https://booth.pm/ja/items/3194594)が発表されました。
　　自由度が高く、おそらく品質はTrigger2to3より優れていると言え、おススメです。
　　ただ、CyanTriggerは英語ベースであることと、
　　Trigger2to3はSDK2との互換性を重視して作っているため、
　　SDK2に慣れた人で、日本人で、そこまでの自由度を求めないのであれば、
　　Trigger2to3がきっと扱いやすいとは思います。

#UdonBehaviourとProgramAsset
さて、SDK3-Worldを知るためには、まずUdonBehaviourとは何かを知っておいた方がいいかと思います。
SDK3では、UdonBehaviourというコンポーネントによって様々な機能を動かすことになります。
UdonBehaviourの内容は自由度が高く、
Udonプログラミングによって様々にカスタマイズしてAsset化することができます。
そのカスタマイズしてAsset化されたものが、ProgramAssetです。
これをUdonBehaiviourのProgramSourceにセットすると、そのカスタマイズされた機能が使えるようになります。

例えば、先ほどご紹介したLura's Switchの「Mirror_WithSwitch」を覗いてみると、
Prefabの中にある「Switch_Mirror」にUdonBehaviourというコンポーネントがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/247ea248-ec2a-2085-6eb1-358319f61760.png)
そのProgramSourceに、ProgramAssetがセットされていますね。
ここに、「インタラクトしたときにミラーを出したり引っ込めたりする」というUdonプログラムが入っています。
そして、そのプログラムがUdonSharp製であれば、ProgramScriptにC#のアセットが紐づいています。つまり、ソースのソースです。
UdonSharp製のUdonプログラムは、この２つがセットで必要になります。

#Sceneの作り方
SDK3のSceneの作り方は、SDK2と殆ど違いがないです。
コントロールパネルも同じです。
VRCWorldを設置すれば、そこがリスポーン地点になります。
ただ、SDK2の場合はVRC_PlayerModsを設置してジャンプできるようにしたり、歩行速度を変えたりしていましたが、
SDK3にはそれに相当するUdonが既に備わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/6b760149-74dd-5b61-de29-6e4ea46fdb7f.png)
この４つのパラメータを設定すればOKです。

#SDK3はSDK2の完全上位互換ではないという話
ここで、SDK3のデメリットについてもお話したいと思います。
まだアルファ版だから、という理由はあるかもしれませんが、
SDK2でできたことがSDK3で厳しくなってしまっていることもあります。
その最も重大なことといえば、
途中でスポーンさせたオブジェクトに対する挙動です。

現状、私が知る限りでは、途中スポーンさせたオブジェクトは

・グローバル化して共有できない
・PickUpで動かない
・内部に組み込まれているUdonも動かない

という問題が発生します。
もはや、置き物しか生み出すことができないのです。

対処としては、スポーンさせるという考えをやめ、
個数は有限になりますが、Sceneに最初から配置して、非表示にして隠しておくということです。
これでうまくやりくりするしかありません。

「Trigger2to3」には、子のGameObjectを一括で非表示にしたり、１つずつ表示させたり、という機能を用意してみました。
これが助けになれば幸いです。

（追記）公式でも、VRCObjectPoolという機能が実装されました。（ちょっとクセがありそうですが）

あとは、SDK2で備わっていたVRCのまとまったコンポーネントがSDK3ではあまり用意されていないという弱点もあります。
例えば、VRC_AudioBankとか。
これから増えていくのでしょうか。

（追記）VRC_AudioBankはTrigger2to3の中で再現実装しました！

#オブジェクト同期について
~~SDK3にはVRC_ObjectSyncがありません。
SDK3のオブジェクト同期といえば、UdonBehaviourのSynchronize Positionにチェックを入れることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/847eaf93-1ea5-b3fe-90f5-4638728f0cc7.png)
これで、そのGameObjectのTransformは全ユーザーに同期します。
Program Sourceは空でも問題ありません。~~

（追記）SDK3でVRCObjectSyncが実装されました！

別の方法は、位置の同期ではなく、トリガの共有です。
誰かがトリガを引いたら、全ユーザーの元でそれぞれ実行する、という考え方です。
つまりVRC_Triggerでいう、Broadcastの設定をやりたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/364d08d1-7302-04b7-e507-5292098bfb5a.png)
SDK3の標準では備わっていないのですが、「Trigger2to3」には準備されています。
これで同期も怖くない！（多分）

#まとめ
まとめると、Udonプログラミングがわからなくても、
私の「Trigger2to3」を使えばなんとかなりますよ、という手前味噌な宣伝話になってしまいました。
元々は、それがなくてもワールドが作れるという話にしたかったのですが、
ちょっと難しそうだったので、力づくで実現させた格好です。
当記事と、「Trigger2to3」がお役に立てれば幸いです。

#余談
こちらは有料（200円）なのですが、
ハンドルをぐるぐる回してオブジェクトやアニメーションを動かせるギミックを作りました。
あなたのSDK3ワールドに、手回しの仕掛けはいかがでしょう？
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Animationも再生できるようになったよ<a href="https://twitter.com/0ne_chan?ref_src=twsrc%5Etfw">@0ne_chan</a> <a href="https://t.co/K6Lpo7UDlX">pic.twitter.com/K6Lpo7UDlX</a></p>&mdash; ほけ (@hoke946) <a href="https://twitter.com/hoke946/status/1354310424439656450?ref_src=twsrc%5Etfw">January 27, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

・販売所
https://hoke.booth.pm/items/2707355