本日は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では手の指の情報を取得して、メニュー操作を行う際はコライダーを無効化しています。
本日は以上です。