UnityでVRゲームを開発する際の私的なメモです。
本記事は以下のメンターから頂いた知見を一部記載しています。
開発環境
私の開発環境
参考までに私の開発環境を記載しておきます。
- 開発用PC:Inspiron 16 Plus
- VRヘッドセット:Meta Quest 2
開発用PCの準備
VRゲーム開発にはGPUを搭載したPCがおすすめです。
また、私は外部の勉強会に参加することが多いので以下のノートPCにしています。ただ、以下のPCは指紋認証のログインが度々動作しなくなるので他のPCが良いかもしれません。
その他のPCおすすめは以下をご覧ください。
Unityのセットアップ
以下のページを参考にUnityをセットアップしてみてください。
インストールの際に、ビルドに使用するので以下のようにAndroid用のモジュールはインストールするようにしてください。
もしインストールの過程で2022 LTSがインストールされなければ、インストール後に以下の右上の「Install Editor」からインストールしてください。
VRヘッドセットのセットアップ
Unityのインストールが完了したら、以下のページの「Questを開発者モードにする」含めてそれより前の工程をすべて実行して、Quest 2をPCに接続できるようにしてください。
Quest以外のヘッドセットでも動作可能なXR Interaction Toolkitを活用する場合は以下の記事をご参照ください。
私はアセットは自作予定なので3D(URP)でプロジェクトを作成しています。
VRヘッドセットとPCの接続
以下の手順を参考に、VRヘッドセットとPCを接続するQuest Linkを実行してください。
接続することで、ゲームをビルド(実行可能なファイルにすること)をしなくてもUnity上でゲームをプレイできて時間の節約になります。
VRヘッドセットにapkファイルをインストール
PCと接続し続けなくてもプレイできる方法として、ビルドしたapkファイルをインストールする方法があります。ただ、Unityと接続してデバッグしながらプレイはできないのでご注意ください
開発用エディタのセットアップ
開発用エディタはUnityに付属のVisual Studioが利用いただけます。
本キットではデフォルトの開発用エディタが開発効率の観点からRiderになっています。
Visual Studioで開発する場合は、UnityエディタのEdit>Preferencesから以下の通り開発環境をVisual Studioに切り替えてください。
Riderに興味ある方は以下もご覧ください。
Riderは有料ですが、開発効率の向上につながる様々な機能があるため元が取れると考えています。
無料期間もあるのと、学生は無料なので是非使ってみてください。Riderの機能については以下をご参照ください。
Riderのセットアップ方法については以下をご参照ください。
バージョン管理ツールのセットアップ
バージョン管理ツールを使うことで、変更の履歴が保存されるので心置きなく変更できます。
私は操作がわかりやすいのでGitHub Desktopを利用しています。GitHub Desktopのセットアップは以下を参照してください。
VR開発スターターキット
以下のキットが無料で機能が揃っていて良いです。
上記のアセットをプロジェクトにインポートする前に、OpenXR Managementを先にインポートして以下の設定を行う必要があるのでご注意ください。
セットアップ動画は以下です。
VR酔い対策モジュール(TunnelingVignette)のセットアップ
XR Interaction ToolkitのSampleの中に含まれている、VR酔い対策で移動中などに視界が狭くなるツールです。
インポート後に以下のようにMain Camera配下に配置してLocomotion Viggette ProvidersにXR Originを追加し、視界を狭くしたい操作を選択する必要があります。
unityroomにアップできるようにする
unityroomにVRゲームをアップするには下記を参考にプロジェクトを作成してください。
ヘッドセットをかぶらずにプレイするXR Device Simulatorのセットアップ
- 移動するのはTキーを押してからWASD
- 向きを変えるのはYキーを押してからAキーかDキー
- ものを持つのはTキー(左手)かYキー(右手)を押してからマウスを動かしてGキー
mocopiを活用したモーション作成
私はモーションの作成に以下のmocopiを使用しています。肩より上に腕を持っていく動きが上手く取れないので、剣戟のモーションを作成する場合は要注意です。私は肩より上にあげないでよい動きに絞っています。
Unity用のSDKがあるため、そちらを使用してmocopiを装着した際の動きをUnityに送っています。
Unity上でモーションを録画してAnimationファイルにするのは、以下のEasyMotionRecorderを使用しています。
EasyMotionRecorderの手順を参考に、モーションのAnimation Clipを作成したら以下のようにMocopi Avaterに適用します
作成したAnimation Clipはデフォルトで床に沈んでしまうので、以下の設定を変更して床に沈まないようにします
Animationウィンドウで、余計な動きを削除します。一番上の行をドラッグして選択するとすべての行を選択できるので、その状態でDeleteキーです。
VRゲーム開発
ゲーム開発入門
Unityでのゲーム開発が初めての人は以下の入門書を読んで実際にやってみることをオススメします。
VRゲーム開発の入門要素はありませんが、まずはUnityの基本を学ぶのが大切です。
どちらかだけでもよいのですが、それぞれ別の機能を学べるので是非両方チャレンジしてみてください。
VRゲーム開発については、以下の本で学んだ後にVRの開発環境をセットアップして色々試しながら学ぶのがよいでしょう。良い教材ありましたら、Xで教えてください。
オープンソースで利用可能なアセット
Unityのアセットストアのアセットはオープンソースでの活用が禁止されています。そのため、オープンソースで活用できるアセットを利用するか自作する必要があります。
ここではオープンソースで利用可能、つまり再配布可能なアセットのサイトを列記します。
3Dモデルのアセットサイトです。アセット数も豊富でライセンスによる絞り込みが可能です。私は改変や商用利用に制限の無い「CC BY」、「CC0」の2つで検索することが多いです。
再配布可能な効果音やBGMのサイトです。特に効果音が豊富です。
日本語フォントを利用する場合は、以下のフォントが再配布可能です。
上記フォントの使い方は以下が参考になります。
3Dモデルのアセットのインポート
SketchFabのアセットのインポートをプラグインで行います。
上記プラグインはライセンスが明記されていないため、オープンソースのプロジェクトに含められません。そのため、私はインポート用の別プロジェクトを作成して上記ページの.unitypackageを実行してインポートしてから、ゲーム開発用のプロジェクトに移す方法を取ります。
バージョンは違いますが、インポート方法は以下です。
インポートした際にピンクになる場合は以下の対応を行います。
ユニティちゃんのURPプロジェクトへのインポート
インポート時にピンクになってしまったのですが、以下の記事を参照して解決しました。
VR上で武器を持つ
武器を持てるようにする
武器を持つには、以下のコンポーネントを武器にアタッチします。これで、武器にコントローラーから出る線を当ててグリップボタンを押すと武器を持てます。
例えば剣の柄を持ちたい場合など武器を持つ位置や角度を変えるには、武器に空のオブジェクト(以下ではAttachPoint)をアタッチして、以下のAttach Transformに設定します。AttachPointオブジェクトの位置や角度を変更すると、武器を持つ角度が変わります。
角度を変更する際は、実際にVRヘッドセットでプレイして持ちながら角度を変えて、値をコピーしておいてプレイ終了後にエディタに貼ると調整しやすいです。
自分で仮のオブジェクトを作成する場合は、変形しやすいのでProBuilderがやりやすいです。
オブジェクトの面を、他の面を変形させずに移動する(凹ませたりする)のはShiftキーを押しながら動かします。
武器を手元に引き寄せて持ちっぱなしにする
まず武器を手元に引き寄せるには、以下のコンポーネントのForce Grabにチェックをつけます。
武器を持ちっぱなしにするにはSelect Action TriggerをStickeyに変更します。
武器を最初から持っているようにしたい場合は、以下の部分に武器を設定します。XR Grab Interactableが設定されていないと表示されないので注意してください。
武器の軌跡を表示する
TrailRendererを使用する方法が簡単です。
敵を作る
巡回する敵を作る方法は以下です
Unity 2022以降は敵を移動させるNavMeshの使い方が変わったので、注意です。また、敵に壁を迂回させるためにNavMesh Obstacleを使う場合は「Curve」のオプションを有効にして、壁が埋まっている範囲を移動対象外にしないと、敵が壁に向かって進んでしまうので気をつけてください。
また、Navmesh SufaceのBakeをする際に該当オブジェクトのみにNavmeshを貼りたい場合は以下のオプションに変更してください。私はデフォルトのままでBakeして、親オブジェクトまでNavmeshが張られてしまいました。
イベントシーンを作る
イベントシーンを作るには、アニメーションや音楽・スクリプトを一括で制御できるTimelineを使うのがよいでしょう
また、私の場合はVRならではの演出として「①イベントシーン中にキャラがプレイヤー置いてどんどん動いてしまうので、プレイヤーはキャラを追いかけないと話が聞けない」及び「②プレイヤーはイベントシーン中に動けて、キャラを攻撃したりすると対応したアクションを行い、またイベントのセリフに戻っていく」を実現してインタラクティブにしたいと考えています。
共通してPlayable Trackという技術を使って特定の時点での制御を自前のスクリプトで行います。Playable Trackを使う際は、Playable AssetとPlayable Behaviour という2つのクラスをそれぞれ継承した2つのクラス作成し、各タイミングでやらせたい動作などをスクリプトで記述します。
以下の通りTimeline再生時にキャラの座標がずれることがあるのでご注意ください。
最適化を行う
VRはヘッドセット側のスペックの問題で、FPSを高くしておくことが望ましいです。
そうしないと、描画のちらつきなどの問題が発生します。
アクション系のVRを快適にプレイできるのは理想を言えば90-120FPS、少なくとも75FPSくらいは欲しいです。FPSは低いほど負荷が高い状態です。
FPSの測定をするためのProfilerの使い方は以下を参照してください。
最適化の方法としては以下があります。
カメラの描画範囲を狭くする
以下の記事の「Clipping Planes」の「Far」、つまりカメラの描画範囲を狭くするという方法です。
項目の場所は以下です。
私の場合は、狭くすることで後ろの方にデフォルトのSkyboxが表示されてしまったので以下をMain CameraにアタッチしてデフォルトからSkyBoxを変更しています。
オクルージョンカリング
カメラに描画されていない範囲を描画しないようにする方法です。以下の記事が詳しいです。
私は、描画を遮る壁(Occluder Static)も隠れてる場合は描画しないようにしたいので、描画消える側(Occludee Static)にも設定しています。
コメント