デモ
まずはデモです。手やコントローラーがオクルージョンされていることがわかります。ハードオクルージョンとソフトオクルージョンをボタンで切り替えています。
Depth API
Metaの提供するDepth APIを利用してオクルージョンを実現します。開発者が何か特別な実装をする必要はないので便利で助かります。
参考リンク:Depth APIの概要
以下に公式サンプルが用意されています。
バージョン情報
ツール/SDK | バージョン |
---|---|
Unity | 2022.3.3f1 |
Meta XR All in one SDK | 71.0.0 |
準備
以下をmanifest.jsonに追加します。(URPを想定)
"com.meta.xr.depthapi": "https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi",
"com.meta.xr.depthapi.urp": "https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi.urp"
PackagesにShaderが追加されるので、オクルージョン処理を行いたいオブジェクトに対して適用すればOKです。
サンプルコード
ボタン押下でShaderのオクルージョン状態を変更するサンプルです。EnvironmentDepthOcclusionController.csはMetaの提供するコードです。
using System;
using Meta.XR.Depth;
using TMPro;
using UnityEngine;
public class OcclusionToggle : MonoBehaviour
{
[SerializeField] private EnvironmentDepthOcclusionController _occlusionController;
[SerializeField] private TextMeshProUGUI _currentOcclusionsModeText;
private int _currentOcclusionTypeIndex = (int)OcclusionType.NoOcclusion;
void Update()
{
if (OVRInput.GetDown(OVRInput.RawButton.A))
{
SwitchToNextOcclusionType();
}
}
private void SwitchToNextOcclusionType()
{
_currentOcclusionTypeIndex = (_currentOcclusionTypeIndex + 1) % Enum.GetValues(typeof(OcclusionType)).Length;
var newType = (OcclusionType)_currentOcclusionTypeIndex;
_occlusionController.EnableOcclusionType(newType);
if (_currentOcclusionsModeText)
{
_currentOcclusionsModeText.text = $"Occlusion mode: {newType.ToString()}";
}
}
}