Microsoft Mesh - Custom Immersive Experience : Travel Group, Travel Point概要

# Microsft Meshのサービスの1つとして提供される Custom Immersive Experience

前回に引続きMeshでカスタム環境を構築技術の解説をしていきたいと思います。

https://qiita.com/miyaura/items/423414fb052e45a907a4

今回はMicrosoft Meshのカスタム環境を構築する際によく使うであろうオブジェクトの操作に関する機能について紹介。今回は概要編としてMeshではどういったオブジェクト操作が可能なのか、実装時に設定できる項目に触れていきます。Mesh Interactablesはいくつかの操作タイプがあり、設定も細かいので、今回は操作タイプと共通で設定可能な項目について紹介します。各操作タイプの詳細については別記事で紹介したいと思います。

https://learn.microsoft.com/ja-jp/mesh/develop/build-your-basic-environment/configuring-for-avatar-movement-and-teleportation#layers-in-detail?wt.mc_id=WDIT-MVP-5003104

## Travel Group, Travel Point概要

今回は空間内の移動を行う為の機能についてです。Microsoft Meshで構築できる空間内の移動についてはいくつか方法があります。
1つ目は「近距離移動」で主に（ガーディアンの範囲内で）歩く、コントローラでの移動、テレポートマーカによる移動で空間内を移動します。この手段については、主に視野で見えている範囲内への移動のために利用します。
2つ目は「遠方移動」です。例えば、雰囲気の異なる空間や部屋へ移動したりと、より遠くの場所や場面の切替え等を行いたい場合です。このような場合は、Travel Group,Travel Pointを利用することができます。
今回はこの空間を移動するためのTravel Group, Travel Pointについて紹介します。
Travel Pointとは移動先として空間内に設置可能な地点を設定できるMesh Toolkitの機能です。
設定したTravel Pointへの移動は実装により行います。例えばボタンの押したときに移動するといった実装をおこないます。
Travel Pointを複数まとめて扱うことが出来るTravel Groupも機能として提供されています。Groupを利用すると複数の地点のいずれかにランダム移動する事が可能です。

![2025-01-21-23-50-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/fc85693a-8f81-4b1e-bcba-74c4c0560601.png)

Travel Pointを利用すると様々なことが行えます。たとえば、空間をいくつかの領域に分割しTravel Pointで巡回できるようにすることで博物館のような体験をつくりだしたり、カンファレンス用の空間としてセッションルームやロビーといった領域を設計することも可能になります。

次に、Microsoft Meshで利用できるTravel Pointの使い方について紹介します。
大きくは3つの方法があります。

 * 初期位置
 * 特定の地点
 * 複数地点のいずれかに移動

 ### 初期位置としての利用
 Microsoft MeshのCustom Immersive Experienceで作った空間には必ず1つTravel Groupが必要です。これは初期位置のスポーン地点として利用されます。Meshにはこの仕様があるため必ず1つはTravel Group(配下にTravel Pointも)が必要です。
 また、初期位置として使うGroupについては、[Travel Group]のプロパティ[Default Spawn Group]にチェックする必要があります。

![2025-01-22-21-17-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e9a2be9a-28c5-44ee-8b00-cca71a67c317.png)
 
### 特定の地点
空間内の特定の位置に移動する処理を作りたい場合はTravel Pointを利用します。Travel Pointにはいくつかのパラメータがあり、スポーン地点のルールを設定することが可能です。

* Look At Transform<BR>スポーン後に注視するオブジェクト（任意）
* Radius<BR>スポーン半径
* Single Travel<BR>1人だけ移動できるか(True/False)

![2025-01-22-21-54-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/ef5be5cf-13c5-4516-8e69-13a16f999b0d.png)

Travel PointはGameObjectの座標を中心に指定されたRadiusの範囲内をスポーン地点として定義することが可能です。また、移動後に特定のオブジェクトの方向を向くようにしたい場合はLook At Transformに対象のオブジェクトを指定することですべてのアバターが同じオブジェクトを注視させることが可能です。
また、Single Travelにチェックを入れると、Travel Pointの範囲内にすでにアバターがいる場合は他のTravel Pointを選択するようになります。この機能については後述します。

### 複数地点のいずれかに移動
Travel Pointはある地点の範囲と移動先とすることができますが、Travel Gropuを利用して複数の地点を１つのグループとしてまとめることができます。移動の際にはグループ内の何れかの地点にスポーンするといったことがかのうになります。この機能自体は最初に説明した初期位置としての利用方法と同じものです。違いは[Default Spawn Group]のチェックの有無になります。

このTravel GroupとTravel PointのSingle Travelを組合わせると同じ地点に1人ずつ移動させるといったことも可能です。
Single Travelがtrueの場合、指令されたTravel Pointのスポーン範囲内にすでに誰かがいる場合は、Travel Group内の他のTravel Pointが対象として選択されます。例えば、3つのTrvel Pointが設定されており、全てSingle Travelにチェックがある場合、1人ずつ３つのポイントに移動することができます。例えば1on1形式のミーティングや面接用の部屋への移動といった使い方が可能になります。

次は空間の中でオブジェクトが操作されたときに移動するための実装について紹介します。

## Travel Point,Travel Groupへの移動
Travel Point,Travel Groupに移動したい場合はVisual Scriptingで実装します。例えば、オブジェクトを選択した場合に移動する実装をおこなう場合はGame ObjectにMesh Interactable Setupコンポーネントを追加し、以下のようにTravelPoint.TravelToPointメソッドを利用して実装します。この場合Travel Pointへの移動になるので特定の地点への移動になります。

![2025-01-23-22-42-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c798eeaa-6727-433c-9fc5-f1d0f91d969c.png)

Travel Group内の何れかのTravel Pointに異動したい場合は以下のようにTravelPointGroup.TravelToRandomTravelPointメソッドを利用して実装します。この場合は指定されたTravel Group内の何れかの地点にランダムで移動します。

![2025-01-23-22-47-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/991c0b02-8606-4755-8f20-e49339a95a2a.png)

:::note infomation
説明では、Mesh Interactable BodyのIsSelectedLocallyを利用しています。このプロパティは操作ユーザだけがオブジェクトを選択したかどうか判定することができるため、オブジェクトを選択すると移動するといった実装が可能です。IsSelectedLocallyの代わりにIsSelectedを使って実装することも可能です。この場合「空間内の誰かがオブジェクトを操作したか」を判定することになり、オブジェクトw操作すると空間内のユーザすべてが指定されたポイントに移動します。
![2025-01-23-22-51-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/76979ed6-53bd-415f-b199-c12085460d9c.png)
:::

## TravelPoint.SingleTravel - Travel Pointを使ったちょっとおもしろい機能

Mesh用に構築した空間内を移動する際にTravel Point, Travel Groupが利用できることを紹介しました。これらを使うと広い空間の中をさまざまな視点で鑑賞したり、打合せのためのルーム間の移動等をスムーズに行うことが可能になります。
さらにTravel Pointにはちょっとおもしろい機能があります。Travel PointにはSingle Travelというプロパティが用意されています。
このプロパティはTravel Groupを利用した移動で利用します。Travel Group内でSingle Travelにチェックを入れたTravel Pointを用意しTravelPointGroup.TravelToRandomTravelPointで移動を行います。この時、Gravel Group内の複数のPointのいずれかに移動するのですが、 **Single Pointにチェックを入れたTravel Pointについては、指定されている範囲内に既にユーザがいると移動対象から外されます。つまり、Single Pointにチェックが入っている地点には１人の参加者だけが移動できます。** これを利用すると複数の地点に１人ずつ移動させることも可能です。応用すると個別面談のような交流スペースをつくることも可能です。ただし、Travel Group内の全てのTravel Pointに対してSingle Pointを設定し、すべての地点にユーザが1人ずついる状態を作ると以降のユーザはランダムでTravel Pointに移動します。もし、すべてのTravel Pointに人がいる場合に移動をさせないためには別の対策が必要になります。

![2025-01-24-22-10-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/69f66b93-8d06-45aa-8fa8-dfaac27af5f5.png)

## まとめ
今回はMeshの空間内でアバターを移動させるときに使えるTravel Point, Travel Groupについて紹介しました。作った空間内のさまざまな地点にテレポートする際に等に利用できます。1人ずつ移動するような手段も作ることができるので大きな空間やイベントでの体験で色々と活用できると思います。