はじめに
何がクリスマスじゃあい!ちくしょう!
メリークリスマス、@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形式の実行できるアプリケーションが完成します。
おわり
Zoomのバーチャル背景で遊んでるときにふと思いついたアイデアでしたが、現実ではなかなか真似できないこともVR世界で簡単に再現できるのは楽しいですね。
SteamVR Plugin 2.0以降のInteractionシステムのおかげで、1行もコードを書かずに実現できたことはとても良かったです。
いろいろと準備している時に、クリスマスパーティーの準備をしている星飛雄馬の気持ちまで体感できたような気がします。
みなさんもぜひやってみてください。では。