本日はMRDLのSurfaceを学んでいきます。
〇MRDLとは?

〇Volumeシーン
〇Volumeコンポーネント
Volumeシーンは[Smoke]と呼ばれるプレファブで構成されています。
[Somke]オブジェクトには[Volume]コンポーネントがアタッチされており、これがコアなコンポーネントになります。

[Volume]コンポーネントは[HandSurface]を継承したクラスで、[HandSurface]クラスは[FingerSurface]クラスを継承しています。
#pragma warning disable 0649 // For serialized fields
using Microsoft.MixedReality.Toolkit.Utilities;
using System;
using System.Collections.Generic;
using UnityEngine;
public class Volume : HandSurface
{
...
}
[HandSurface]クラス、[FingerSurface]クラスはそれぞれユーザーのHandTracking情報を取得、保持するクラスになります。
[Volume]コンポーネントのinspector上に表示されるプロパティのうち赤枠部分が[FingerSurface]クラスによるものです。

また以下の赤枠部は[HandSurface]クラスによるものです。

〇Update関数
private void Update()
{
if (!Initialized)
return;
if (drawConnections)
DrawConnections();
UpdateImpacts();
}
Update関数では[drawConnetions]の値がTrueであれば[DrawConnections()]関数が実行されます。
また[UpdateInpacts()]関数が実行されます。
[drawConnections()]は初期状態でfalseになっています。
[SerializeField]
private bool drawConnections = false;
これは[Valume]クラス内で動的にTrueにされることはなく、Privateの型であるため外部から参照されることはなく、どうやらデバッグ用の機能のようです。
〇UpdateImpacts()
private void UpdateImpacts()
{
UpdateVolumeImpacts(gen0);
UpdateVolumeImpacts(gen1);
UpdateVolumeImpacts(gen2);
UpdateVolumeImpacts(gen3);
for (int i = 0; i < fingerTips.Length; i++)
{
FingerTip ft = fingerTips[i];
if (fingers[i].gameObject.activeSelf)
{
Color impactColor = fingerImpactGradient.Evaluate(ft.ImpactIntensity);
ft.Block.SetColor("_EmissiveColor", ft.BaseColor + impactColor);
ft.Renderer.SetPropertyBlock(ft.Block);
ft.ImpactIntensity = Mathf.Clamp01(ft.ImpactIntensity - (Time.deltaTime * fingerImpactFadeTime));
fingerTips[i] = ft;
}
}
}
[UpdateImpacts]では最初に[gen]を引数に持つ[UpdateVolumeImpacts(gen)]関数が実行されます。
[gen]はChunk型の配列です。
private Chunk[] gen0 = new Chunk[0];
private Chunk[] gen1 = new Chunk[0];
private Chunk[] gen2 = new Chunk[0];
private Chunk[] gen3 = new Chunk[0];
Chunkは次で定義されています。
private struct Chunk
{
public float Diameter { get { return Radius * 2; } }
public int Parent;
public int Generation;
public float Radius;
public Vector3 TargetPoint;
public Vector3 TargetDir;
public Rigidbody RigidBody;
public ChunkImpacts Impacts;
public Renderer Renderer;
internal MaterialPropertyBlock Block;
}
長くなってしまったので続きはまた後日見ていきます。