🥽
【Unity / Polyspatial】Apple Vision Proで3Dタッチ
Unity PolyspatialによるApple Vision Pro向けアプリで視線とピンチジェスチャーでオブジェクトを操作する3Dタッチを実装してみます。検証にはvisionOS 2.6、Unity 6000.1を使用しています。
オブジェクトに以下のコンポーネントとColliderを追加することで、3Dタッチの対象にすることができます。Colliderは視線が当たっているかどうかの判定に使われます。
TouchableObject.cs
using R3;
using Unity.PolySpatial.InputDevices;
using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;
public class TouchableObject : MonoBehaviour
{
Subject<Unit> touchedSubject = new();
public Observable<Unit> OnTouched => touchedSubject;
void OnEnable()
{
EnhancedTouchSupport.Enable();
}
void Update()
{
var activeTouches = Touch.activeTouches;
foreach (var touch in activeTouches)
{
var primaryTouchData = EnhancedSpatialPointerSupport.GetPointerState(touch);
if (primaryTouchData.targetObject == gameObject && touch.phase == TouchPhase.Began)
{
// 3Dタッチしたらここが実行される、このコードではR3によるObserverパターンで処理
touchedSubject.OnNext(Unit.Default);
}
}
}
}
3Dタッチの対象にするオブジェクトはProject Settings > Polyspatial
のCollider Objects Layer Mask
でLayer Mask単位で指定することができます。
オブジェクトを指で直接突くと反応するが、3Dタッチが上手くいかない場合に他のオブジェクトに視線を遮られている可能性があります。3Dタッチの対象だけをLayer Maskで分けて設定するとタッチできるようになるかもしれません。
Apple Vision Proでは視線がどこを向いているか取得できないので、オブジェクトに視線が当たっているかどうかをスクリプトで判定できません。VisionOSHoverEffect
コンポーネントにより視線が当たっているオブジェクトの見た目にハイライトなどの効果を付与することができます。
Discussion