はじめに
何がクリスマスじゃあい!ちくしょう!

メリークリスマス、@Payayayayaです。
ディップ Advent Calendar 2020の最後の記事になります。
昨日の記事もクリスマスらしい記事なのでクリスマスっぽい記事にしました。
やってみること
毎年この日になると話題になるアニメ「巨人の星」のあのシーンのマネをしたいのですが、リアルではなかなかできないのでVRでやりたい。
UnityへのSteamVRのインポートからクリスマスツリーを投げるまでやってみます。
ちなみに、「何がクリスマスじゃあい!」と言ったのは星飛雄馬ではないです。
環境
- Unity (2019.4.16f1 LTS)
- SteamVR (beta 1.15.14)
- SteamVR Plugin (2.6.1)
- VIVE Cosmos Elite
SteamVR Pluginのセットアップをしよう
まずはUnityのプロジェクトをVR環境で実行できるようにします。
今回はValveが公開しているSteamVR Pluginを利用します。
SteamVR Pluginのインポート
アセットストアで「SteamVR Plugin」と検索し、Add to My Assetsでダウンロードします。

Unityのメニューバーからウィンドウ→Package Managerと開き、My Assetsを開いてSteamVR Pluginをインポートします。
インポートするものを選択するウィンドウが表示されるので、特に変更せずインポートを押しインポートします。
以下のようなウィンドウ(SteamVRの推奨設定に変更してみない?的なやつ)が表示されるので、Accept Allを押しUnityプロジェクトの設定をSteamVRの推奨設定に変更します。
推奨設定に変更すると、**You made the right choice!**とダイアログが表示されます。
SteamVR Inputの設定
Unityのメニューバーからウィンドウ→SteamVR Inputを開くと、以下のようなダイアログが表示されます。
Yesを押すとサンプルの入力設定JSONファイルがコピーされるので、Yesを押します。
JSONファイルのコピーが終わったら、表示されたSteamVRの入力設定ウィンドウのSave and generateを押します。
これでVIVEコントローラー等の入力をUnityで利用できるようになります。
SteamVR PluginのInteractionシステムでオブジェクトを投げよう
プロジェクトをSteamVR上で実行してみる
SteamVR Pluginのインポートが完了しているので、SteamVR上で実行する手順はとてもかんたんです。
最初から存在するMain Cameraオブジェクトをシーンから削除し、Assets/SteamVR/InteractionSystem/Core/Prefabs内にあるPlayerプレファブをシーン上に配置します。
実行画面
再生ボタンを押すと、シーンがSteamVR上で実行されます。
便宜上Unity上のゲーム実行画面のスクリーンキャプチャですが、ちゃんとヘッドセット上でもシーンが描画されています。
ヘッドセットの動きに合わせてシーンが描画されており、操作するVIVEコントローラーが手として表示され、
コントローラーを動かしたり、ボタンを操作することで手の形を変えられるようになっています。
オブジェクトを投げる
SteamVRのInteractionシステムを利用することで、簡単にオブジェクトを投げることができます。
まずは投げたいオブジェクト(今回はCapsuleオブジェクト)を用意します。
(ついでに床としてPlane(平面)、台として適当なBoxも用意します。)
オブジェクトの追加はヒエラルキー上で右クリック→3Dオブジェクト→任意のオブジェクトと選択して追加できます。

投げたいオブジェクトに以下のコンポーネントをアタッチします。(Throwableをアタッチすることで他2つも自動的にアタッチされます。)
- Throwable(スクリプト)
- Interactable(スクリプト)
- Rigidbody
これらをアタッチすることで、対象のオブジェクトを掴んで投げることができるようになります。
実行画面(※画面酔い注意)
デフォルトの操作設定では、実行中にオブジェクトの近くでコントローラーのトリガーを引くと、オブジェクトがゲーム内のコントローラー位置に追従し、トリガーを離すと追従しなくなります。
コントローラーを動かしている最中にトリガーを離すことで、オブジェクトを慣性により投げることができます。
とってもかんたんですね!
クリスマスパーティーの準備をしよう
クリスマスツリーを用意する
まずはクリスマスツリーを用意します。
今回アセットストアでFreeのものがあったのでこちらを使用します。
アセットのインポートはSteamVR Pluginのときと同様にPackage Managerから行えます。
ツリーの土台としてCylinderオブジェクトを使います。
空のオブジェクトを作成し、その子要素としてインポートしたアセット内のChristmasTreeプレファブと、土台とするCylinderオブジェクトを配置してあげます。

手で持てるように、適当なサイズにしたBox ColliderをChristmasTreeプレファブと、土台とするCylinderオブジェクトにアタッチし、
親要素として作成した空のオブジェクト(↑の画像ではTreeオブジェクト)にThrowableスクリプト、Interactableスクリプト、Rigidbodyコンポーネントをアタッチしておきます。
部屋を用意する
Boxオブジェクトを伸ばしたり縮めたりして気合で部屋を作っていきます。
割れるガラスもぜひ欲しいところですので、こちらを利用します。

ドロネー三角形分割から得たボロノイ図をメッシュの分割パターンに用いるものです。
Assets/Plugins/DelaunayフォルダとAssets/Scripts/BreakableSurface.csスクリプトをインポートします。
インポートしたBreakableSurfaceスクリプトをx, y方向に大きくz方向に薄いオブジェクトにアタッチします。
次に、アタッチしたオブジェクトのColliderをMesh Colliderに変更し凸状にするにチェックを入れます、
最後に、RigidbodyコンポーネントをアタッチしてUse Gravityにチェックを入れます。
あとはMesh RendererコンポーネントのMaterialを半透明なマテリアルにすれば、リアルタイムに割れるガラスが再現できます。
割れるガラスを使って窓を作ったり、CubeやCylinderの形状を変えて机や椅子、ケーキっぽいものを用意してそれっぽくします。
夜にしたり雪を降らせたり
パーティは18時からですので、シーンを夜にしてみます。
こちらのアセットを利用して、SkyBoxに夜空のマテリアルを設定します。

アセットのインポートが完了したら、Unityのメニューバーからウィンドウ→レンダリング→ライティング設定を開きます。
開いたウィンドウのスカイボックスマテリアルに、インポートしたUltra Skybox Fog/Materials/satera_night_8kを設定します。

最初からシーンに存在するDirectional Lightの強度を下げることで、夜っぽいシーンにできます。
いい感じですね。
せっかくなので雪を降らせましょう。
Unityのパーティクルシステムを使えば簡単に実装できます。
ヒエラルキー上で右クリックし、エフェクト→パーティクルシステムを選択して追加します。
InspecterのTransformでX方向の回転を90に設定することでパーティクルが重力方向に移動するようになります。
このままだと円錐状にパーティクルが放出されるだけなので、Particle Systemコンポーネントの形状をBoxにし、位置や拡大/縮小をイジって雪を降らせたい範囲に設定することで、雪っぽくパーティクルを降らせることができます。
クリスマスを楽しもう
準備が整ったら、あとは招待状を送った方々が会場に来るのを待つだけです。

...
...
...
...
結局、誰も来なかったという事か…!
うおおおおおおお!!
ちくしょう...
ビルドしよう
Unityのメニューバーからファイル→ビルド設定を選択してビルド設定ウィンドウを開きます。
最初からあるSample SceneをMainにでも改名して、ビルド設定ウィンドウのシーンを追加でMainシーンを追加します。
ビルドを押下すればビルドが始まり、exe形式の実行できるアプリケーションが完成します。

ビルドが完了するとこのようにフォルダ/ファイルが生成されます。
生成された.exeファイルを実行することで、いつでもクリスマスツリーを投げることができるようになりました。
おわり
Zoomのバーチャル背景で遊んでるときにふと思いついたアイデアでしたが、現実ではなかなか真似できないこともVR世界で簡単に再現できるのは楽しいですね。
SteamVR Plugin 2.0以降のInteractionシステムのおかげで、1行もコードを書かずに実現できたことはとても良かったです。
いろいろと準備している時に、クリスマスパーティーの準備をしている星飛雄馬の気持ちまで体感できたような気がします。
みなさんもぜひやってみてください。では。

