メインコンテンツまでスキップ
バージョン: 1.0.4

MiRZAでVPSを実装

WARNING

本ページに記載の環境は本記事執筆時点(2024/12/19)のものです。
アップデートによって変更が生じている可能性がある点ご留意ください。

0. はじめに

今回の記事では、2025年に流行るモノとしてメディアでも話題沸騰中なMiRZAと**VPS(Immersal)**を絡めて、簡易的な道案内アプリを作成します。

【参考】 VPSとは

MiRZAとVPS組み合わせることで、本来現実世界にないものをそこにあるかのように表示できるようになるため、アイデア次第でいろいろなことが実現できます。

まずはその足掛かりとして本記事が参考になれば嬉しいです。

1. 開発環境

  • Windows 11
  • Unity 2022.3.37f1
  • Snapdragon Spaces SDK 1.0.1
  • Immersal SDK 2.0.4

2.アプリ概要

①MiRZAでImmersalのMapデータを認識し仮想空間(Unity)と現実空間の位置合わせを行

②目的地に対し案内表示をARで行う

どちらの機能もNTTコノキューおよびImmersal公式から提供されているサンプルがあるため、うまく組み合わせれば実現できそうですね。

ではやっていきましょう!

3.実装手順

3.1.VPS Immersal サンプルの取り込み

本手順を参考に、MiRZAのデベロッパー向けサイトで公開されているVPS Immersalサンプルを取り込みます。 今回のアプリではDual Render Fusion機能を使わないため、以下画面でチェックボックスはつけないようにしましょう。

なお、本サンプルは「2.アプリ概要」の中で説明した①の機能を担ってくれています。

3.2.道案内機能の追加

Immersal公式サンプルのNavigationSampleNavMeshシーンを参考に道案内機能を追加していきます。

参考シーンのパスはこちら。
Assets/Samples/Immersal SDK/2.0.4/Core Samples/Scenes/NavigationSampleNavMesh

今回はよりシンプルな実装にするために、上記サンプルのようなボタンクリックから案内表示を行うのではなく、VPSのマップを認識したタイミングで自動で案内表示を出す形で実装したいと思います。

3.2.1.NavigationUIオブジェクトの追加

まず、3.1で作成したシーンに対し、Navigation UIオブジェクトを追加します。

Navigation UIのプレハブのパスはこちら。
Assets/Samples/Immersal SDK/2.0.4/Core Samples/Prefabs/Navigation/Navigation UI

目的地選択用のUI表示を行わないため、Navigation UIの子オブジェクトは非活性化しておいてください。

3.2.2.案内表示処理の追加

目的地までの案内表示を行うために、Navigation Manager.csに以下を追記します。

public void InitializeNavigation_onMapDetected(GameObject targetObj)
{
    if (!m_managerInitialized)
{
    return;
}
m_NavigationTarget = targetObj.GetComponent<IsNavigationTarget>();
TryToFindPath(m_NavigationTarget);
}

3.2.3.マップ認識判定処理の追加

VPSのマップを認識したタイミングをウォッチしておき、認識したタイミングで案内表示処理が行われるように以下スクリプトを作成、Navigation UIオブジェクトにアタッチします。

using UnityEngine;
using Immersal;
using Immersal.XR;

namespace Immersal.Samples.Navigation
{
public class TrackinStatusChecker : MonoBehaviour
{
[SerializeField]
private GameObject targetObject;
private ImmersalSDK m_Sdk;
private bool successStatus = true;

void Start()
{
m_Sdk = ImmersalSDK.Instance;
}

void Update()
{
if (m_Sdk == null)
{
return;
}

if(successStatus)
{
ITrackingStatus trackingstatus = m_Sdk.TrackingStatus;
if (trackingstatus != null)
{
if(trackingstatus.LocalizationSuccessCount > 0)
{
NavigationManager.Instance.InitializeNavigation_onMapDetected(targetObject);
successStatus = false;
}
}
}
}
}
}

3.3.Mapデータの配置

こちらの手順を参考にし、XR Spaceオブジェクト配下にMapperアプリで取得したMapデータを配置します。
複数のMapデータを組み合わせて配置する場合など、Mapデータの位置調整が必要になる場合は、GLBファイルを一緒に配置することをおすすめします。
(調整後GLBファイルは非活性化しておいてください。)

3.4.プレーンの配置

NavMeshを設定するための地面(プレーンオブジェクト)を現実世界の歩行可能エリアに合わせて配置します。
今回は左手のドアをくぐり右手に進んだ先がゴール地点となるため、ProBuilderを使ってプレーンオブジェクトを現実世界の通路と同じL字の形に編集しています。

3.5.NavMeshの設定

3.4で配置したプレーンオブジェクトに対し、NavMeshを設定します。
Hierarchy上を右クリックし、AI > NavMesh SurfaceからNavMesh Surfaceオブジェクトを作成します。

NavMesh SurfaceオブジェクトのコンポーネントからAgentSizeの設定を行ったうえで、Bakeします。
今回は案内表示が壁にめり込んでしまわないよう以下のようなAgentSizeを設定しました。
(Bake後プレーンオブジェクトは非活性化しておいてください。)

3.6.ゴール地点の配置および設定

XR Spaceオブジェクト配下にゴール地点用のオブジェクトを配置します。

今回利用したゴール地点用のプレハブはこちら
Assets/Samples/Immersal SDK/2.0.4/Core Samples/Prefabs/Navigation/Navigation Target

また、3.2.3で作成したTrackinStatusCheckerコンポーネントのTarget Objectに対し、
上記で配置したオブジェクトを設定します。
これにより、アプリ側がマップデータを認識したタイミングの位置からゴール地点までの位置に対し案内表示が行われます。

今回はImmersalのサンプルの中で用意されているプレハブを利用しましたが、自作のオブジェクトをゴール地点に設定することも可能です。
その場合は、オブジェクトに対しisNavigationTargetスクリプトをアタッチしてください。

3.7.動作確認

ビルド後にMiRZA上で動作確認し、
マップ認識後、ゴール地点に向けて案内表示が行われていることが確認できました!

4. まとめ

今回はMiRZAとVPSを組み合わせることで、道案内アプリを作成しました。

道案内以外にも、自分の部屋を好きなキャラクターだらけにさせたり、町中に広告を表示したりとアイデア次第で色々な体験を作り出すことができます。