🙄

【Unity】2024年版Cardboard用プロジェクトを作る方法

2024/12/07に公開

概要

この記事はxRギルド Advent Calendar 2024 の記事です。他にもXR系の記事が上がりますので是非読んでみてください。

今回は古のVRデバイスGoogle Cardboardを現在のUnity6で使う方法を紹介します

Google Cardboardはスマホを専用のケースに入れることで気軽にVRが体験できます。数万円~数十万円する高価な専用デバイスを購入しなくても、VRが体験できるのでVRブーム初期は重宝されていました。一時的にGoogleが開発を止めていて、Unity用の公式プラグインが無い時期もありました。しかし、2024年12月現在開発が再開されており、日々アップデートが行われています。

環境

Unity6000.0.26f1
URP

今回作成したプロジェクトは下記においてますので、もしうまくいかない場合は参考にしてみてください
https://github.com/tkada/unity6_cardboard

プラグインのインストール

まずSwitch PlatformしてAndroidかiOSにしておきます。
Unity6ではFile->Build ProfilesからSwitch Platformできるように変わっています

次にCardboardプラグインをインストールします
Window->Package Managerを開き
Add package from git URLhttps://github.com/googlevr/cardboard-xr-plugin.gitを入力してインストールします。

インストールできたらSamplesのタブからサンプルもインポートしておきましょう。

シーンの設定

Assets/Samples/Google Cardboard/<version>/Hello Cardboard/Scenesにサンプルシーンが入っています。HelloCardboardシーンを開いてみましょう。

このサンプルには視点操作の機能も含まれています。視点操作を有効にするために下記の操作を行います。

まず、視点操作の対象となるオブジェクトにLayerを付与します。Add Layerを選択しLayer編集メニューを開き、新たなLayerを空いている場所に追加します。今回はInteractiveという名前にしました。

視点操作対象のオブジェクトのLayerを先ほど追加したLayerに設定します。

次にPlayer->Main Camera->CardboardReticlePointerにアタッチされているCarboard Reticle PointerReticle Interaction Layer Maskを先ほど追加したLayerに設定します。

シーンが設定できたらBuild Profilesを開き、SceneListにHelloCardboardシーンを設定しておきます。

Androidプロジェクトの設定

ビルドするためにProject Settingsからプロジェクトの設定をしていきます。

Player

Resolution and PresentationDefault Orientation Landscape LeftまたはLandscape Rightに設定します

Other Settings Minimum API LevelAndroid 8.0より高いバージョンに設定しておきます。また、Internet AccessRequireに設定します。なお、Scripting BackendIL2CPPである必要があります。

Vulkanを使っている場合はVulkan Settingsにある Apply display rotation during renderingのチェックを外しておきます

Application Entry PointGameActivityのチェックを外しActivityにチェックを入れます。

Publish SettingsCustom Main Gradle TemplateCustom Gradle Properties Templateにチェックを入れます

チェックを入れるとAssets/Plugins/Android/にファイルが生成されます。
mainTemplate.gradleには下記を追記します

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
+   implementation 'androidx.appcompat:appcompat:1.6.1'
+   implementation 'com.google.android.gms:play-services-vision:20.1.3'
+   implementation 'com.google.android.material:material:1.6.1'
+   implementation 'com.google.protobuf:protobuf-javalite:3.19.4'
**DEPS**}

gradleTemplate.propertiesには下記の2行を追記します。

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
unityStreamingAssets=**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**
+ android.enableJetifier=true
+ android.useAndroidX=true

XR Plug-in ManagementCardboard XR Pluginを有効にします。

iOSプロジェクトの設定

Player

Resolution and PresentationDefault Orientation Landscape LeftまたはLandscape Rightに設定します

Camera Usage Descriptionに任意の文字列を入れておきます。

XR Plug-in ManagementCardboard XR Pluginを有効にします。

ビルド

設定ができたらビルドしてみましょう。

このダイアログが出てきたらYesで問題ありません。

ビルド出来たら実行してみましょう。正しく設定できていれば空間が表示されます。

このサンプルではオブジェクトに視点を当てたまま画面をアップすると、オブジェクトが別の場所に移動する機能が実装されています。

コンポーネント解析

インタラクションを制御するにはObjectControllerを解析すると分かりやすいです。CardboardReticlePointerからOnPointerEnter(),OnPointerExit(),OnPointerClick()の各関数がSendMessage経由で呼び出されています。

public void OnPointerEnter()
    {
        SetMaterial(true);
    }

    /// <summary>
    /// This method is called by the Main Camera when it stops gazing at this GameObject.
    /// </summary>
    public void OnPointerExit()
    {
        SetMaterial(false);
    }

    /// <summary>
    /// This method is called by the Main Camera when it is gazing at this GameObject and the screen
    /// is touched.
    /// </summary>
    public void OnPointerClick()
    {
        TeleportRandomly();
    }

独自のインタラクションを作りたい場合は、この作りを応用して作るといいでしょう。またVRモードと平面モードの切り替えはVrModeControllerを参考にしてみてください。

おわりに

Google Cardboardプラグインを使うことで気軽にVRコンテンツを作成することができます。是非試してみてください

Discussion