MRが楽しい

MRやVRについて学習したことを書き残す

MagicLeap2のディミング機能をスクリプトから実行する

本日は MagicLeap2 の小ネタ枠です。
MagicLeap2のディミング機能をスクリプトから実行する方法を記事にします。

ディミング機能

MagicLeap2 で利用可能なグラスの調光機能です。
グラスの不透明度をあげることで明るい環境でホログラムを見えやすくしたり、MagicLeap2 を VR 機器のように利用することができます。

MagicLeap2 に搭載されているディミング機能には大きく分けて、グローバルディミングとセグメントディミングの2つのディミング機能があります。

グローバルディミング

ディスプレイ全体適用されるディミング機能です。
不透明度を 0(透明) から 1(不透明) の値で調整することができます。
developer-docs.magicleap.cloud

セグメントディミング

ディスプレイの一部を不透明にするディミング機能です。
ホログラムに対して自動でディミングを利かせるシンプルなユースケースと、専用メッシュとシェーダを使って任意の箇所にディミングを聞かせるユースケースがあります。
developer-docs.magicleap.cloud

サンプルコード

以下、ディミング機能を試すための簡単なサンプルコードです。
メニューボタン押下中にグローバルディミングが、バンパーボタン押下中にセグメントディミングが有効になります。
・DimmerTest.cs

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using UnityEngine;
using UnityEngine.XR.MagicLeap;

public class DimmerTest : MonoBehaviour, IMixedRealityInputActionHandler
{
    private void OnEnable()
    {
        // ハンドラーを登録する
        CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputActionHandler>(this);
    }

    private void OnDisable()
    {
        // ハンドラーの登録を解除する
        CoreServices.InputSystem?.UnregisterHandler<IMixedRealityInputActionHandler>(this);
    }
    
    public void OnActionStarted(BaseInputEventData eventData)
    {
        // メニューボタン押下時にグローバルディミングを有効にする
        if (eventData.MixedRealityInputAction.Description == "Menu")
        {
            MLGlobalDimmer.SetValue(1);
        }
        
        // バンパーボタン押下中にセグメントディミングを有効にする
        if (eventData.MixedRealityInputAction.Description == "Bumper Press")
        {
            MLSegmentedDimmer.Activate();
        }
    }

    public void OnActionEnded(BaseInputEventData eventData)
    {
        // ボタン押下完了時に全てのディミングを無効化する
        MLGlobalDimmer.SetValue(0);
        MLSegmentedDimmer.Deactivate();
    }
}

セグメントディミングを試すため、シーンには何かしらのゲームオブジェクトを配置して置く必要があります。

また上記スクリプトでは MagicLeap2 向け MRTK パッケージを利用してコントローラの押下イベントを取得しています。
試す際は以下の記事を参考に、MagicLeap2 向け MRTK のインポートを実施してください。
bluebirdofoz.hatenablog.com