Help us understand the problem. What is going on with this article?

クリぼっちなので「何がクリスマスじゃあい!」をVRでやってみたかった【Unity+SteamVR】

はじめに

何がクリスマスじゃあい!ちくしょう!
クリスマスツリーを投げるやつ
メリークリスマス、@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アセットストア

UnityのメニューバーからウィンドウPackage Managerと開き、My Assetsを開いてSteamVR Pluginをインポートします。

Package Manager

インポートするものを選択するウィンドウが表示されるので、特に変更せずインポートを押しインポートします。

import window

以下のようなウィンドウ(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プレファブをシーン上に配置します。

↓これです↓
Playerぷれふぁぶ

実行画面

再生ボタンを押すと、シーンがSteamVR上で実行されます。

動いて喜ぶわたし

便宜上Unity上のゲーム実行画面のスクリーンキャプチャですが、ちゃんとヘッドセット上でもシーンが描画されています。
ヘッドセットの動きに合わせてシーンが描画されており、操作するVIVEコントローラーが手として表示され、
コントローラーを動かしたり、ボタンを操作することで手の形を変えられるようになっています。

オブジェクトを投げる

SteamVRのInteractionシステムを利用することで、簡単にオブジェクトを投げることができます。

まずは投げたいオブジェクト(今回はCapsuleオブジェクト)を用意します。
(ついでに床としてPlane(平面)、台として適当なBoxも用意します。)
オブジェクトの追加はヒエラルキー上で右クリック→3Dオブジェクト任意のオブジェクトと選択して追加できます。
動いて喜ぶわたし

投げたいオブジェクトに以下のコンポーネントをアタッチします。(Throwableをアタッチすることで他2つも自動的にアタッチされます。)

  • Throwable(スクリプト)
  • Interactable(スクリプト)
  • Rigidbody

これらをアタッチすることで、対象のオブジェクトを掴んで投げることができるようになります。

実行画面(※画面酔い注意)

オブジェクトを投げるわたし

デフォルトの操作設定では、実行中にオブジェクトの近くでコントローラーのトリガーを引くと、オブジェクトがゲーム内のコントローラー位置に追従し、トリガーを離すと追従しなくなります。
コントローラーを動かしている最中にトリガーを離すことで、オブジェクトを慣性により投げることができます。
とってもかんたんですね!


クリスマスパーティーの準備をしよう

クリスマスツリーを用意する

まずはクリスマスツリーを用意します。

今回アセットストアでFreeのものがあったのでこちらを使用します。

クリスマスデコレーションプロップスアセット

アセットのインポートはSteamVR Pluginのときと同様にPackage Managerから行えます。

ツリーの土台としてCylinderオブジェクトを使います。
空のオブジェクトを作成し、その子要素としてインポートしたアセット内のChristmasTreeプレファブと、土台とするCylinderオブジェクトを配置してあげます。
じゃーん!クリスマスツリー!
手で持てるように、適当なサイズにしたBox ColliderChristmasTreeプレファブと、土台とするCylinderオブジェクトにアタッチし、
親要素として作成した空のオブジェクト(↑の画像ではTreeオブジェクト)にThrowableスクリプト、Interactableスクリプト、Rigidbodyコンポーネントをアタッチしておきます。

部屋を用意する

Boxオブジェクトを伸ばしたり縮めたりして気合で部屋を作っていきます。

割れるガラスもぜひ欲しいところですので、こちらを利用します。
OskarSigvardsson/unity-delaunay - GitHub
ドロネー三角形分割から得たボロノイ図をメッシュの分割パターンに用いるものです。
Assets/Plugins/DelaunayフォルダとAssets/Scripts/BreakableSurface.csスクリプトをインポートします。

インポートしたBreakableSurfaceスクリプトをx, y方向に大きくz方向に薄いオブジェクトにアタッチします。
次に、アタッチしたオブジェクトのColliderMesh Colliderに変更し凸状にするにチェックを入れます、
最後に、RigidbodyコンポーネントをアタッチしてUse Gravityにチェックを入れます。

こんなかんじに。
投げるコンポーネントの設定

あとはMesh RendererコンポーネントのMaterialを半透明なマテリアルにすれば、リアルタイムに割れるガラスが再現できます。
割れるガラスを使って窓を作ったり、CubeCylinderの形状を変えて机や椅子、ケーキっぽいものを用意してそれっぽくします。

パーティー会場

夜にしたり雪を降らせたり

パーティは18時からですので、シーンを夜にしてみます。
こちらのアセットを利用して、SkyBoxに夜空のマテリアルを設定します。
Ultra Skybox Fogアセット

アセットのインポートが完了したら、Unityのメニューバーからウィンドウレンダリングライティング設定を開きます。
開いたウィンドウのスカイボックスマテリアルに、インポートしたUltra Skybox Fog/Materials/satera_night_8kを設定します。
ライティングの設定
最初からシーンに存在するDirectional Light強度を下げることで、夜っぽいシーンにできます。

夜に見せる
いい感じですね。

せっかくなので雪を降らせましょう。
Unityのパーティクルシステムを使えば簡単に実装できます。
ヒエラルキー上で右クリックし、エフェクトパーティクルシステムを選択して追加します。

InspecterTransformでX方向の回転を90に設定することでパーティクルが重力方向に移動するようになります。
このままだと円錐状にパーティクルが放出されるだけなので、Particle Systemコンポーネントの形状Boxにし、位置や拡大/縮小をイジって雪を降らせたい範囲に設定することで、雪っぽくパーティクルを降らせることができます。

Let it snow!

クリスマスを楽しもう

準備が整ったら、あとは招待状を送った方々が会場に来るのを待つだけです。
しかし誰も来ない

...

...

...

...

結局、誰も来なかったという事か…!

うおおおおおおお!!

何がクリスマスじゃあいVR視点

完
ちくしょう...

ビルドしよう

Unityのメニューバーからファイルビルド設定を選択してビルド設定ウィンドウを開きます。
最初からあるSample SceneMainにでも改名して、ビルド設定ウィンドウのシーンを追加でMainシーンを追加します。
ビルドを押下すればビルドが始まり、exe形式の実行できるアプリケーションが完成します。
ビルド設定

ビルド後のファイルとか
ビルドが完了するとこのようにフォルダ/ファイルが生成されます。
生成された.exeファイルを実行することで、いつでもクリスマスツリーを投げることができるようになりました。

おわり

Zoomのバーチャル背景で遊んでるときにふと思いついたアイデアでしたが、現実ではなかなか真似できないこともVR世界で簡単に再現できるのは楽しいですね。
SteamVR Plugin 2.0以降のInteractionシステムのおかげで、1行もコードを書かずに実現できたことはとても良かったです。

いろいろと準備している時に、クリスマスパーティーの準備をしている星飛雄馬の気持ちまで体感できたような気がします。
みなさんもぜひやってみてください。では。

Payayayaya
コニチワー
dip-net
ディップ株式会社は「バイトル」「はたらこねっと」などの求人情報サービスをはじめ、人工知能専門メディア「AINOW」、スタートアップ専門メディア「スタートアップタイムズ」、アニメなどの舞台を紹介するサイト「聖地巡礼マップ」といった新しい分野のサービスを自社で開発・運営しています。
https://www.dip-net.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away