本日はMRDLの[Surfaces]の調査枠です。
前回から[FingerSurface]クラスを見ています。
コード全文は次の様になっています。
前回はLateUpdateで指を定義しているところまでを見ていきました。
今回は続きを読み解いていきます。
protected virtual void LateUpdate(){
//各指のTipの定義
...
if (palms.Length == 2)
{
if (handJointService.IsHandTracked(Handedness.Right))
{
Transform palmTransform = handJointService.RequestJointTransform(TrackedHandJoint.Palm, Handedness.Right);
palms[0].gameObject.SetActive(true);
palms[0].position = palmTransform.position;
palms[0].rotation = palmTransform.rotation;
}
else if (!Application.isEditor || disableInactiveFingersInEditor)
{
palms[0].gameObject.SetActive(false);
}
if (handJointService.IsHandTracked(Handedness.Left))
{
Transform palmTransform = handJointService.RequestJointTransform(TrackedHandJoint.Palm, Handedness.Left);
palms[1].gameObject.SetActive(true);
palms[1].position = palmTransform.position;
palms[1].rotation = palmTransform.rotation;
}
else if (!Application.isEditor || disableInactiveFingersInEditor)
{
palms[1].gameObject.SetActive(false);
}
}
}
LateUpdateでは左右のHandTracking情報を取得するほかにTransform[]型の[palm]の大きさが2の場合別の処理が実行されます。
この[palm]はFixedUpdateで取得されます。
Unityでは毎フレーム処理を実行する[Update]のほかに[LateUpdate]、[FixedUpdate]といったものが用意されています。
これらの違いは以下の記事でわかりやすく解説されています。
[LateUpdate]は通常[Update]の処理の後に実行されます。[FixedUpdate]は物理挙動の変更の直前に呼ばれます。
[Update]との違いとして[Update]はFpsに依存していますが、[FixedUpdate]は1秒間に実行される数が決まっておりfpsの影響を受けません。
一つのクラスで[FixedUpdate]と[]デバッグログを入れて確認してみるとその違いが分かります。

[FixedUpdate]では次の様な処理が行われています。
protected virtual void FixedUpdate()
{
if (!Initialized)
return;
#region physics
// Disable finger colliders when menu is open to prevent them from interfering with menu operation
if (menu != null)
{
for (int i = 0; i < fingerColliders.Length; i++)
{
fingerColliders[i].enabled = !menu.IsOpen;
}
for (int i = 0; i < palmColliders.Length; i++)
{
palmColliders[i].enabled = !menu.IsOpen;
}
}
// Move rigid bodies to follow finger positions
for (int i = 0; i < fingerRigidBodies.Length; i++)
{
if (fingers[i].gameObject.activeSelf)
{
fingerRigidBodies[i].MovePosition(fingers[i].position);
fingerRigidBodies[i].MoveRotation(fingers[i].rotation);
}
}
for (int i = 0; i < palmRigidBodies.Length; i++)
{
if (palms[i].gameObject.activeSelf)
{
palmRigidBodies[i].MovePosition(palms[i].position);
palmRigidBodies[i].MoveRotation(palms[i].rotation);
}
}
#endregion
}
ここでは
Disable finger colliders when menu is open to prevent them from interfering with menu operation
で記載されているようにメニューを開いているときにコライダーを無効にして、メニュー操作の妨げにならないようにする処理を行っています。
まとめるとFingerSurfaceでは手の指の情報を取得して、メニュー操作を行う際はコライダーを無効化しています。
本日は以上です。