🥽

【Unity / Polyspatial】Apple Vision Proで3Dタッチ

に公開

Unity PolyspatialによるApple Vision Pro向けアプリで視線とピンチジェスチャーでオブジェクトを操作する3Dタッチを実装してみます。検証にはvisionOS 2.6、Unity 6000.1を使用しています。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@2.3/manual/Input.html
https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@2.3/manual/PolySpatialInput.html


オブジェクトに以下のコンポーネントと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 > PolyspatialCollider Objects Layer MaskでLayer Mask単位で指定することができます。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@2.3/manual/PolySpatialSettings.html

オブジェクトを指で直接突くと反応するが、3Dタッチが上手くいかない場合に他のオブジェクトに視線を遮られている可能性があります。3Dタッチの対象だけをLayer Maskで分けて設定するとタッチできるようになるかもしれません。


Apple Vision Proでは視線がどこを向いているか取得できないので、オブジェクトに視線が当たっているかどうかをスクリプトで判定できません。VisionOSHoverEffectコンポーネントにより視線が当たっているオブジェクトの見た目にハイライトなどの効果を付与することができます。

https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@2.3/manual/HoverEffect.html

Discussion