本日は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; }
長くなってしまったので続きはまた後日見ていきます。