public override void Process() { if (handMRManager_ == null) { handMRManager_ = FindObjectOfType <HandMRManager>(); } if (colliders_.Count <= 0) { addColliderToSelectable(); } bool noHands = true; foreach (var hand in Hands) { if (hand.IsTrackingHand) { noHands = false; break; } } if (noHands) { if (Time.time - prevDetectTime_ > LeaveTime) { Selectable[] selectables2 = Selectable.allSelectablesArray; changeEnabledSelectable(true, selectables2); base.Process(); reEnabledSelectable(selectables2); } return; } Transform cameraTrans = handMRManager_.GetCameraTransform(); List <RaycastHit> tempHits = new List <RaycastHit>(); bool handIsOpened = false; foreach (var hand in Hands) { if (!hand.IsTrackingHand) { continue; } bool grabed = false; if (GrabDetect) { #if false grabed = true; bool opened = true; for (int loop = 1; loop < 5; loop++) { if (hand.GetFingerOpened(loop)) { grabed = false; } else { opened = false; } } if (Vector3.Distance(hand.GetFinger(4).position, hand.GetFinger(8).position) < 0.03f) { grabed = true; opened = false; } if (opened) { handIsOpened = true; } #endif grabed = hand.IsGrab; handIsOpened = !grabed; } Vector3 forward = (hand.GetFinger(8).position - cameraTrans.position).normalized; RaycastHit[] hits = Physics.RaycastAll(cameraTrans.position, forward, Mathf.Infinity, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.Collide); if (hits != null && hits.Length > 0) { float nearDistance = float.PositiveInfinity; GameObject nearObj = null; RaycastHit nearHit = hits[0]; foreach (RaycastHit hit in hits) { if (hit.distance < nearDistance) { nearDistance = hit.distance; nearObj = hit.transform.gameObject; nearHit = hit; } } float distance = Vector3.Distance(nearHit.point, hand.GetFinger(8).position); if (grabed || (distance <= TouchDistance && TouchDistance > 0f)) { uiDetectControl(nearObj, nearHit.point, grabed); return; } else { tempHits.AddRange(hits); } } } if (handIsOpened) { isGrabDetected_ = false; } if (tempHits.Count > 0) { float nearDistance = float.PositiveInfinity; GameObject nearObj = null; foreach (RaycastHit hit in tempHits) { if (hit.distance < nearDistance) { nearDistance = hit.distance; nearObj = hit.transform.gameObject; } } if (eventSystem.currentSelectedGameObject != nearObj) { eventSystem.SetSelectedGameObject(nearObj); } return; } if (prevDetectObj_ != null && submitPointerData_ != null) { GameObject submitObj = ExecuteEvents.GetEventHandler <ISubmitHandler>(prevDetectObj_); if (submitObj != null) { ExecuteEvents.Execute(submitObj, submitPointerData_, ExecuteEvents.submitHandler); addColliderToSelectable(); prevDetectTime_ = Time.time; } submitPointerData_ = null; } if (Time.time - prevDetectTime_ > LeaveTime) { resetSelect(); prevDetectObj_ = null; Selectable[] selectables = Selectable.allSelectablesArray; changeEnabledSelectable(true, selectables); base.Process(); reEnabledSelectable(selectables); } }
void LateUpdate() { if (handMRManager_ == null) { return; } if (colorAlpha_ > 0f) { Transform cameraTrans = handMRManager_.GetCameraTransform(); float zLength = 0f; int zLengthCount = 0; foreach (var hand in handMRManager_.Hands) { var sHand = hand.GetComponent <HandVRSphereHand>(); if (sHand.IsTrackingHand) { zLength += cameraTrans.InverseTransformPoint(sHand.HandCenterPosition).z; zLengthCount++; } } if (zLengthCount <= 0) { colorAlpha_ = 0f; } else { if (!isSetThickness_) { renderer_.material.SetFloat("_ThicknessX", renderer_.material.GetFloat("_ThicknessX") * handVRMain_.Height / handVRMain_.Width); renderer_.material.SetFloat("_ThicknessInnerX", renderer_.material.GetFloat("_ThicknessInnerX") * handVRMain_.Height / handVRMain_.Width); isSetThickness_ = true; } zLength /= zLengthCount; float height = Mathf.Tan(handVRMain_.FixedFieldOfView * Mathf.Deg2Rad * 0.5f) * zLength * Size; float width = height * handVRMain_.Width / handVRMain_.Height; if (ParentForScale != null) { transform.localScale = new Vector3(width * ParentForScale.lossyScale.x, height * ParentForScale.lossyScale.y, 1f); } else { transform.localScale = new Vector3(width, height, 1f); } Vector3 localPos = new Vector3(handVRMain_.ShiftX, handVRMain_.ShiftY, zLength); transform.position = cameraTrans.TransformPoint(localPos); transform.rotation = cameraTrans.rotation; } } renderer_.material.SetColor("_Color", new Color(defaultColor_.r, defaultColor_.g, defaultColor_.b, defaultColor_.a * colorAlpha_)); renderer_.material.SetColor("_ColorInner", new Color(defaultColorInner_.r, defaultColorInner_.g, defaultColorInner_.b, defaultColorInner_.a * colorAlpha_)); }