UnityのUの字もわからないレベルから始めるVRChatのワールド作り(応用編) ※古い記事です

# 注意
<b>この記事の内容は古い内容となっております。</b>
基本的な動作は現在と相違ありませんが、VRC Triggerが関わる内容は全て変更されています。


# 基本編
[基本編はコチラ](https://qiita.com/tamsco274/items/f8fb52eafe012a40e76f)

# できるようになること
自分で作ったモデルの設置(フルスクラッチワールド)
当たり判定の調整
スクリーンショット/絵を壁に貼る
ライトの調整
軽量化
メタリックの反射
スイッチで鏡とかON/OFFできるようになる
物を持てる(ピックアップ)出来るようになる


# 自分で作ったモデルを置きたい！

流れは、<b>「Unityにインポート→シーンに配置→サイズ等を調整→当たり判定を付与→質感を調整」</b>になります。
自作モデルを配置しては調整、配置しては調整という流れを繰り返します。

UnityのProjectタブに自分が作ったモデルをドラッグします。
私はいつも<b>テクスチャを投げてからモデルを投げてます。テクスチャがデフォルトで設定される(?)ので</b>。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c4470fff-cbb0-51af-c077-737e26a62ad1.png)


<b>間違いなくごちゃごちゃになるのでModelsフォルダ等作って整理しましょう。</b>
私は3DモデルをModelsフォルダに入れて、テクスチャをMaterialsフォルダに入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/7a40ebe9-8085-3b51-f000-93cf7c0c7d1d.png)

## マテリアルをエクスポートする
たぶんVRChatにアバターをアップロードしたことあるなら大丈夫だよね…？
「Project」タブの3Dモデルを選択し、右側のInspectorの「Materials」を選択
<b>「Use Embedded Materials」を「Use External Materials」に変更し、「Apply」を押します。</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/57c2ce85-94c2-5b1e-ec4c-c4e11680c9ee.png)

すると、モデルのマテリアルが出てきます。丸い奴です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/2a39de4b-ecb5-048a-950a-c95cff539f9f.png)

##配置する
ProjectタブからSceneタブにドラッグして配置します。配置したらとりあえず座標を0にしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/6d57afda-f42a-e122-0f7b-c3dc44ffb7c1.png)

…サイズ感がわかりませんね。サイズの目安になるものを出しましょう。
~~VRCSDKの中には、一般的(?)な男性モデルが用意されています。それを使いましょう。~~
~~All Modelsの中の、「VRChat_Tut…」となってる青い男をSceneタブに投げましょう。~~投げたら座標を(0に)合わせましょう。
<b>追記</b>
SDKの中のTutorial_Avatarがなくなりました。さみしいね。
代わりに、All Prefabs内の「VRCChair」を参考にしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/b83a2d0a-c775-2a27-b3e2-ce7cf2bd0ce1.png)

この青い男はリサイズ等しなければ良い身長の目安になります。Nikeiとかベニスマン位だと思ってください。
現状、私が配置したワールドモデルは<b>大きすぎる</b>ので、サイズの調整をします。
Inspectorの中のTransformのScaleを手打ちで調整するも良し、左上のタブからガイドカーソルをいじるも良しです。
私は手打ちでやってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/6c228b14-bf92-2153-fe7f-b864cf9c105e.png)

…それっぽいサイズになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/dd4aad0c-4c23-98e5-641e-baa6f9313347.png)

##当たり判定を付ける
壁とか床だったりした場合、当たり判定を付けなければすり抜けてしまいます。
当たり判定は、一般的に<b>「コライダー」</b>と呼ばれているものを設定することで付与できます。

コライダーの設定方法はいくつかありますが、VRChatのワールドに使われるコライダーは基本的に二種類で、「Box Collider」と「Mesh Collider」です。

・Box Collider
四角い当たり判定です。Mesh Colliderと比較すると「負荷は少ないが設定が大変」です。
・Mesh Collider
モデルの見た目通りの当たり判定です。Boxと比較すると「細かいモデルの凹凸を表現できるが負荷もある」です。

正直このコライダーで負荷が左右されるレベルのワールドを作る人がこの記事を読むとは考えづらいので、<b>「わからない内はMesh Collider」「単純な形ならBox Collider」</b>位の意気込みでいいです。

###Mesh Colliderの設定方法
左にあるHierarchy上のモデルを選択し、右にあるInspectorの「(Skinned)Mesh Renderer」と「Mesh Filter」が存在するモデルであることを確認し、下にある「Add Component」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/6d3ee76a-095f-524b-2947-fc01a4313dea.png)

「Physics」→「Mesh Collider」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/23642905-ca96-37b0-eb65-fa11f8686900.png)　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/46cd3f93-e4c1-0cf5-dc13-2182627819a7.png)

一応これで当たり判定を付与することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/e080db86-2a13-82e4-9457-b6f469647f1d.png)
boxコライダーも同様に付けることもできますがあまりやりません。調整が必要なので。

###Box Colliderの(一般的な)設定方法

<b>「Cubeを生成し、設定したい当たり判定の形に配置した後に見た目だけ消す」</b>がとても楽なやり方です。
Hierarchy上で右クリックして「3D Object」→「Cube」と選択し、出てきた箱の位置角度大きさを調整し
以下の画像の様に、思い描いていた当たり判定の位置に合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/9bf25c77-a4c4-c4b6-5535-b36e6f587f18.png)

Mesh Rendererのチェックを外すかコンポーネントを削除します。
私は消してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/9de75b60-26ad-b2f3-1e5b-f4aedc153390.png)

Tips:画像の様に、Shiftを押しながら選択することで複数選択することが出来ます。
コンポーネントが全く同じものが付与されている場合、まとめて操作することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c257e48e-22c7-82d6-1456-93b97c7fe6a0.png)

消しました。緑の枠線は当たり判定がどのように付与されているのかを表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/8d32997e-c41f-76a2-1791-9bec1884cd8d.png)

##質感を調整する
マテリアルを操作します。シェーダーはなるべくStandardを使いましょう。
わからない人はとりあえず赤い丸の部分だけでも理解しましょう。

Metarlic(メタリック)とSmoothness(スムース)は調整したら壊れる！というものではないので、
とりあえず数値をいじってどんな感じになるか確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/7876e8af-ebea-a247-6ef0-eaf6946441d4.png)

私のモデルは金ピカをイメージしていたのでこのようになりました。
リフレクションプローブというものを使用してますが後で説明します。
とりあえず金ぴかになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/f199d43d-6945-4962-5d54-ae2e0a9d7152.png)

自作モデルの設置は大まかにいうとこれで終わりです。
置く→調整→置く→調整を繰り返します。
理解している人はNormal mapとかEmissionとか調べてみるといいかもね

#スクリーンショットとか絵を置きたい！
額縁とか使わずに張るだけなら簡単です。

###貼りたいものを用意する
スクリーンショット(以下SS)や絵をUnityにインポート(ファイルをProjectタブにドラッグ＆ドロップ)します。ごちゃつくからフォルダ整理とかちゃんとしましょうね。
当然、SSを貼りまくればワールドの<b>容量は増えます</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/d3e923c3-7bba-9dfc-aaef-f1fff9353c40.png)


###Quadを作成
続いて、Hierarcyの何もないところを右クリックし、「3D Objects」→「Quad」と選択します。
<b>Quadは、片面だけ描画される厚みのない板です。</b>
当たり判定があっても邪魔なので、QuadについているMesh Colliderは消しましょう。
また、Quadが透明な場合は180度反転させてあげましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/d326c291-a064-6226-4d51-c129b354c0c3.png)


###比率を調べる
元のSS/絵の縦横の比率を調べましょう。Windowsのペイントソフトとかに入れるとpixel数が表示されるのでそこから計算してもいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c75fac8f-8845-fac8-2088-a084ea230e9e.png)
この画像は1:1ですね

###Quadのサイズを調整
Quadのサイズ比率を合わせます。手打ちで入力しましょう。
例えばVRChatの中のカメラで撮影したSSは比率が16:9になるので、Scaleを{16,9,1}にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/27883265-b604-c354-6def-3049ddfc2196.png)

サイズが大きすぎたり小さすぎたりした場合は、Unity左上の拡大縮小ボタンを選択し、<b>ガイド(矢印みたいなの)の中心の白い立方体を使ってリサイズ</b>しましょう。
これを使えば<b>比率を維持したまま拡大縮小</b>できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/f1e692bc-d1de-bf96-c7b7-bb8448c863d0.png)


サイズを調整したら、画像をQuadにD&Dしてマテリアルを調整しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/833dd566-b425-50ef-947e-9902fe043a71.png)


###壁に貼り付ける
貼りたい壁に座標を合わせます。
私は大まかに矢印で近づけた後に手打ちで調整しています。
壁のオブジェクトと親子構造にするといろいろ便利ですが<b>後で詳しく説明します。</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/ee7f012a-913b-3aa3-fa0c-b5b2ea7d88e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c0ff4efe-0058-e886-9d92-347569b4cd73.png)

#ライトの調整
>[Unity、入門ライティング設定！](https://qiita.com/Nekomasu/items/8845d076c4356809f0ff) (どなたかURLのきれいな引用方法教えてください)
ねこます氏のこの記事を読むとわかりやすいです。ライトのベイクについては最適化の項で説明します。


Unityのライトにはいくつか種類がありますが、ここではよく使う三つのライトを説明します。
左側のライトが「Spot Light」であり、そのまんまスポットライトの照らし方をします。
右側のライトが「Point Light」であり、電球の様に全方面を照らします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/e1a525e7-30ff-1ce5-525b-0e7dbe830e44.png)

また、デフォルトの状態では、プロジェクト内にDirectional Lightが一つあります。これは「太陽の様に」全てのモデルを照らします。詳しくはねこます氏の記事を読んでください。

###各種設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/4b5eb27b-a0ef-dd7c-674e-8c7f54291f2d.png)
Lightコンポーネントでよくいじる設定だけ説明します。
●Range
光が届く距離です。疑似的に光の強さが変わります。
●Color
光の色を調整します。
●Mode
RealtimeとMixed、Bakedがあります。
<b>最適化の項目で説明します。</b> 
●Intensity
光の強さです。この数字を上げすぎると眩しすぎて目が死にます。
過去にDirectional LightのIntensityを<b>222</b>にしてVRChatの運営に怒られた人がいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/dc8f4e5b-a603-53fa-d036-8a967f91ae5f.png)
●Indirect Multiplier
反射光の明るさに関するものですが私はいじったことありません(断言)
●Shadow Type
影のタイプです。<b>負荷に直結します。</b>
最適化の項目で説明します。
●Culling Mask
照らすレイヤーを設定します。レイヤーについては発展編で説明します。

#軽量化
よくありますよね。「このワールド重いんだけど！」
こう言われないようにワールドを軽量化しましょう。
##ライトのベイク
「全く動かないオブジェクト(壁とか床)」と「全く動かないライト」があったとして、毎秒光の計算しても答えは変わりませんよね？
動かないオブジェクトの影を予めテクスチャに焼きこむ作業をベイク(Bake)と言います。
手順としては
1.モデルのライトマップのUVを展開する
2.モデルとライトをStaticにする
3.ライトのShadow TypeをHard ShadowかSoft Shadowに設定する(影をOnにする)
4.ライティング設定をいじる
5.ベイクする
です。

###ライトマップのUVを展開する
Projectフォルダ内のモデルを選択し、Modelを選択、Generate Lightmap UVsをチェックし右下のApplyを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c5525a6d-3a5b-6b3b-fc2a-b6ee095144fa.png)

###モデルとライトをStaticにする
Staticとは、「静的」という意味です。
<b>動かないオブジェクトは全てStaticにチェックを入れましょう。かなり負荷が軽減されます。</b>
ここをチェックします。Do you want to ~といったダイアログが出た場合、「このオブジェクト、子がいるけど子も全部Staticにするか？」と聞かれています。まあ大体の場合「Yes, change children」で全てStaticにして問題ないです。<b>トリガーで動いたりするものはStaticのチェックを外しましょう。</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/fff1cd1b-b2e5-c452-ea94-9dd763b5bb55.png)

###ライトを設定する
ライトの設定です。
まずはライトのModeをMixedかBakedに変更します。
<b>「動くものにはリアルタイム、動かないものはベイク」するのがMixed、「動くものには何もせず、動かないものはベイク」するのがBakedです。</b>プレイヤーは「動くもの」ですが、Unityには環境光というものがあるので全てのライトをBakedにしてもプレイヤーは照らされます。(環境光が真っ黒でない限り)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/13fccb92-231e-5ab6-768d-620089724822.png)

続いてShadow Typeを「Hard Shadows」か「Soft Shadows」に変更します。「No Shadows」にすれば影は発生しません。
影がない場合<b>壁越しでも光ります</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/036014ca-7ce9-4dac-4cf5-1a1faa61bc57.png)

###ライティングを設定する
Unity上部のメニューより、「Window」→「Lighting」→「Settings」を押し、ライティングを開きます。
上部のタブを操作して矢印の場所に投げると楽です。私はそうしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/74662bf0-8614-694f-9c52-ddb11b66bc8a.png)
以下よくいじるヤツの説明
●「Environment」の中のEnvironment Lighting
環境光です。Sourceのデフォルトは「Skybox」ですね。環境光は説明するよりいじった方が早い(説明できない)ので、「Skybox」から「color」等に変更して色をいじるとどんな挙動するのか確認してみてください。

●「Lightmapping Settings」の中のLightmap Size
ライトマップの画像のサイズです。数字が高ければ高いほど高品質になります。
128位でも問題ないですが影が汚いときは数字を上げてみてください。

●「Lightmapping Settings」の中のAnbient Occlusion
隅っことか凹んだ所に影を作ります。

###ベイクする
諸々準備したら一番下の「Generate Lighting」を押します。下の方で青いメーターが動きます。
CPUの性能によりますが<b>滅茶苦茶時間が掛かります。CPUもいっぱい使います。</b>
広大なワールドの場合数時間かかる場合もあります。

青いメーターが消えたらベイク完了です。
ライトを消しても<b>ベイクし直さない限り影は残ります。</b>

ライトの感じが気に食わなかっりするときは各種調整をしてまたベイクします。
再ベイクする時はGenerate Lightingのボタンの右側の▼より「Clear Baked Data」をしておきましょう。

#リフレクション
メタリックの反射です。リフレクションプローブという物を使います。
Standardシェーダー等のMetaricの設定が入っているモデルに対して作用してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/c58c9323-2d0e-be14-7dd1-8e4c64b82346.png)
これです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/ff0c0823-5e66-dc42-80ed-630335dc4d21.png)

リフレクションプローブはStaticにするのが無難です。
わからない内はTypeをBakedにしましょう。
表示されている立方体の枠はメタリックの反射の範囲です。<b>この範囲内のみが対象というわけではないので注意してください。</b>(語彙力)
部屋ごとにリフレクションプローブを炊くといいらしいですが同じような見た目の場合は一つで十分です。
Culling Maskをいじることで反射に写すレイヤーを設定できます。レイヤーについては<b>発展編で詳しく説明します。</b>
下のBakeボタンを押すことで周囲のモデル等から反射の計算をしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/f2bc90ef-0d94-066d-9450-22783062d281.png)


#鏡をボタンでオンオフできるようにする
大事ですね。
いろんな人がいろんなPrefab配布してますがとりあえず自作してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/dc9b04b6-59a8-30b6-2a15-36e13f2d61a8.png)

###スイッチになるオブジェクトを用意
Unityで作れるCubeでも問題ないです。人形等自分で用意したものでも大丈夫です。
今回はどこかで見たことあると思われるコレにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/bfd6c57d-0024-5cc4-0b7a-64ddc22b517d.png)

###コライダーを設定する
スイッチにするオブジェクトにコライダーを設定します。
<b>触り判定を付与する必要があるからです。</b>
BoxでもMeshでも大丈夫です。

###VRC_triggerを設定する
よくわからない名前の物が出てきました。
Inspector下部の「Add component」より検索して出した方が見つけやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/848583af-c277-a627-a967-2f15fa04a296.png)

###触ったときのイベントを設定する
何言ってるかわけわかんない時はとりあえず指示に従いましょう。
まずはAdvanced Modeにチェックを入れます。
画像の様に、「Custom」となってる部分を「OnInteract」に変更します。変更したら「Add」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/153a705f-0c7f-4440-9463-f2718bf27bfd.png)


以下の画像の赤い丸の所
●Always~をLocalに変更します。Localがない場合はAdvanced Modeのチェックを確認
 <b>Local設定をすることでいわゆるローカルにすることが出来ます。</b>
●Interaction Textをわかりやすい文に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/1ac1db03-a3f7-4049-3baa-ced649e870b6.png)
●Actions(List is Empty)の右下の「+」を押します
押したら、「Basic Events」の中にある「SetGameObjectActive」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/8f249116-5b13-61c3-3668-a806f1fb8203.png)

一見変化がありませんが、下の画像の「SetGameObjectActive」を押すことで展開されます。画像の所の「+」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/50cfc68b-9a9e-71f9-b592-25dbc5ade895.png)

「None(Game Object)」となっている部分に表示のオンオフをしたいオブジェクトをドラッグ&ドロップします。「+」を押すことで一度にオンオフを切り替えるオブジェクトを増やせます。
赤丸の部分のOperationを「False」から「Toggle」に変更しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/ac565831-507f-f330-a255-cf81b3998ade.png)

うまく行ってれば画像の様に白い線で結ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/eb22565f-423f-b755-a014-0085126dcdda.png)

###デフォルトを非Activeにする
任意です。<b>鏡は初期状態をオフにしてスイッチで出現させるのが主流です。</b>
このチェックを外せば非Activeになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/baa370d6-e289-06d6-bf4b-9fe0f9098e42.png)

#ピックアップ出来るものを置きたい
###コライダーを付与
持てるようにするには当たり判定を付与する必要があります。
MeshでもBoxでもなんでも構いません。

###コンポーネントを付与
持てるようにしたいモデルを選択し、「VRC_Pickup」コンポーネントを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/ad19c4a1-7cf9-ad3f-7950-f18557c09aa3.png)
###Rigidbodyの設定
Rigidbodyは物理演算されるオブジェクトに付与するコンポーネントです。
「VRC_Pickup」を設定すると<b>「Rigidbody」は自動的に付与されます。</b>
●Use Gravity
チェックを入れると重力落下します。
●Is Kinematic
チェックを入れると手にもって動かしている時以外動かなくなります。(宙に浮いて静止します)
<b>両方にチェックを入れた場合Is Kinematicが優先されます。</b>
<b>両方にチェックを入れなかった場合、モデルは無限に飛んでいきます。</b>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/3a16482f-12c4-db9c-52f6-459c04310f57.png)

###同期
「VRC_Object Sync」コンポーネントを付与することで相手との間で同期がとれます。
<b>「モノ持ってるけど相手に見えていない」といった原因はコレを付けてないことが原因です。</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399875/90a8609a-717c-795b-0ed4-137344fd7823.png)




#さいごに
だいぶいろんな知識が増えてきましたが、原理に触れてないのがほとんどなのが現状です。
発展編では原理やもう一歩踏み込んだ技術について触っていきたいと思います。