private void OnReleased(HVRGrabberBase arg0, HVRGrabbable arg1) { if (RecoilComponent) { RecoilComponent.HandRigidBody = null; } }
private IEnumerator GrabTimeoutRoutine(HVRGrabbable grabbable) { _timeoutGrabbable = grabbable; yield return(new WaitForSeconds(GrabTimeout)); _timeoutGrabbable = null; }
public override float DistanceToGrabbable(HVRGrabbable grabbable) { if (UseColliderDistance && _map.TryGetValue(grabbable, out var colliders) && grabbable.UseColliderClosestPoint) { var distance = float.MaxValue; var anchor = DistanceSource ? DistanceSource.position : Grabber.transform.position; foreach (var grabbableCollider in colliders) { if (!grabbableCollider) { continue; } Vector3 point; if (grabbable.HasConcaveColliders && grabbableCollider is MeshCollider meshCollider && !meshCollider.convex) { if (!grabbableCollider.Raycast(new Ray(anchor, grabbableCollider.bounds.center - anchor), out var hit, Vector3.Distance(grabbableCollider.bounds.center, anchor))) { continue; } point = hit.point; } else { point = grabbableCollider.ClosestPoint(anchor); } var current = Vector3.Distance(point, anchor); if (current < distance) { distance = current; } }
private void OnGrabbed(HVRGrabberBase arg0, HVRGrabbable arg1) { if (arg0 is HVRHandGrabber hand && RecoilComponent) { RecoilComponent.HandRigidBody = hand.Rigidbody; } }
private void OnHoverGrabbableReleased(HVRGrabberBase grabber, HVRGrabbable grabbable) { UnhoverGrabbable(grabber, grabbable); //drop could have been a hand swap or some other swapping action //so we wait til next frame and see if it's not grabbed by something else this frame StartCoroutine(TryGrabGrabbable(grabbable)); }
public override bool CanHover(HVRGrabbable grabbable) { if (!base.CanHover(grabbable)) { return(false); } var handGrabber = grabbable.PrimaryGrabber as HVRHandGrabber; if (handGrabber == null) { return(false); } //if a forward throw is happening don't grab it var velocity = handGrabber.ComputeThrowVelocity(grabbable, out var dummy); velocity.y = transform.position.y; if (Vector3.Dot(velocity.normalized, transform.forward) > 0f) { return(false); } return(true); }
public override bool CanHover(HVRGrabbable grabbable) { if (!SocketContainer) { return(false); } if (grabbable.IsBeingForcedGrabbed) { return(false); } if (grabbable.GrabberCount != 1) { return(false); } var handGrabber = grabbable.PrimaryGrabber as HVRHandGrabber; if (handGrabber == null) { return(false); } if (!SocketContainer.HasAvailableSocket(grabbable)) { return(false); } if (grabbable.IsStabbing || grabbable.IsStabbed) { return(false); } return(base.CanHover(grabbable)); }
public virtual bool IsValid(HVRGrabbable grabbable) { if (grabbable.IsStabbing && !CanGrabStabbingGrabbable || grabbable.IsStabbed) { return(false); } if (SocketFilters != null) { if (!grabbable.Socketable) { return(false); } var anyValid = false; foreach (var filter in SocketFilters) { if (filter.IsValid(grabbable.Socketable) && FilterCondition == SocketCondition.OR) { anyValid = true; break; } if (!filter.IsValid(grabbable.Socketable) && FilterCondition == SocketCondition.AND) { return(false); } } return(anyValid || FilterCondition == SocketCondition.AND); } return(true); }
protected override void OnHoverEnter(HVRGrabbable grabbable) { if (ReleasesOnHover && IsGrabbing) { ForceRelease(); } if (GrabsFromHand) { if (CanAddGrabbable && grabbable.IsBeingHeld && grabbable.GrabberCount == 1 && grabbable.PrimaryGrabber.IsHandGrabber && CanGrabEx(grabbable)) { grabbable.PrimaryGrabber.ForceRelease(); //need to let the joint get destroyed so it doesn't bring the hand into the socket area forcefully this.ExecuteNextUpdate(() => TryGrab(grabbable, true)); } return; } grabbable.Released.AddListener(OnHoverGrabbableReleased); base.OnHoverEnter(grabbable); if (HoverActions != null) { foreach (var action in HoverActions) { action.OnHoverEnter(this, grabbable, IsValid(grabbable)); } } }
protected void UpdateBowHandCollision(HVRHandGrabber hand, HVRGrabbable arrow, bool enable) { if (hand && arrow) { hand.UpdateCollision(arrow, enable); } }
private IEnumerator DropAndDestroy(HVRGrabbable grabbable) { yield return(null); grabbable.ForceRelease(); Destroy(grabbable.gameObject); }
private void OnBeforeTeleport() { if (LeftJointHand) { LeftJointHand.Disable(); } if (RightJointHand) { RightJointHand.Disable(); } _leftParent = LeftHand.transform.parent; _rightParent = RightHand.transform.parent; LeftHand.transform.SetParent(transform, true); RightHand.transform.SetParent(transform, true); if (LeftHand.GrabbedTarget) { _leftTeleportGrabbable = LeftHand.GrabbedTarget; _leftGrabbableParent = _leftTeleportGrabbable.transform.parent; _leftTeleportGrabbable.transform.SetParent(LeftHand.transform, true); } if (LeftHand.GrabbedTarget != RightHand.GrabbedTarget && RightHand.GrabbedTarget) { _rightTeleportGrabbable = RightHand.GrabbedTarget; _rightGrabbableParent = _rightTeleportGrabbable.transform.parent; _rightTeleportGrabbable.transform.SetParent(RightHand.transform, true); } }
private void HandleRigidBodyGrab(HVRGrabbable grabbable) { if (!grabbable.Rigidbody) { return; } switch (HoldType) { case SocketHoldType.Kinematic: { grabbable.Rigidbody.useGravity = false; grabbable.Rigidbody.velocity = Vector3.zero; grabbable.Rigidbody.angularVelocity = Vector3.zero; grabbable.Rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative; grabbable.Rigidbody.isKinematic = true; grabbable.SetAllToTrigger(); } break; case SocketHoldType.RemoveRigidbody: { _hadRigidBody = true; _mass = Rigidbody.mass; Rigidbody.mass += grabbable.Rigidbody.mass; Destroy(grabbable.Rigidbody); } break; } }
private void UpdateScale(HVRGrabbable grabbable) { if (!grabbable || !ScaleGrabbable) { return; } var extents = _modelBounds.extents; var axis = extents.x; if (extents.y > axis) { axis = extents.y; } if (extents.z > axis) { axis = extents.z; } axis *= 2; var ratio = Size / axis; ratio *= grabbable.Socketable.SocketScale; var counterScale = grabbable.Socketable.CounterScale; grabbable.transform.localScale = new Vector3(ratio * counterScale.x, ratio * counterScale.y, ratio * counterScale.z); }
private IEnumerator ContinueAutoGrab(HVRGrabbable grabbable, Transform grabPoint) { var elapsed = 0f; while (grabbable && elapsed < AdditionalAutoGrabTime && !grabbable.IsBeingHeld) { if (grabbable.Rigidbody.velocity.magnitude > MaximumVelocityAutoGrab) { grabbable.Rigidbody.velocity *= .9f; } if ((JointAnchorWorldPosition - grabPoint.position).magnitude < AutoGrabDistance) { if (HandGrabber.TryAutoGrab(grabbable)) { break; } } elapsed += Time.fixedDeltaTime; yield return(new WaitForFixedUpdate()); } _additionalGrabRoutine = null; }
protected override void OnHoverEnter(HVRGrabbable grabbable) { base.OnHoverEnter(grabbable); if (IsMine && !Mathf.Approximately(0f, HapticsDuration)) { HandGrabber.Controller.Vibrate(HapticsAmplitude, HapticsDuration); } if (grabbable.ShowForceGrabIndicator) { if (grabbable.ForceGrabIndicator) { _grabIndicator = grabbable.ForceGrabIndicator; } else { _grabIndicator = GrabIndicator; } if (_grabIndicator) { _grabIndicator.Enable(); _grabIndicator.Hover(); } } }
protected virtual void OnHandReleased(HVRHandGrabber arg0, HVRGrabbable arg1) { if (Arrow) { StartCoroutine(EnableBowHandCollisionRoutine(arg0, Arrow.Grabbable)); } BowHand = null; }
private void OnDialReleased(HVRHandGrabber arg0, HVRGrabbable arg1) { Joint.SetAngularXDrive(Spring, Damper, 10000f); if (StopOnRelease) { Rigidbody.angularVelocity = Vector3.zero; } }
protected void OnReleased(HVRGrabberBase grabber, HVRGrabbable hvrGrabbable) { if (DiscardAngle) { transform.rotation = RotationTarget.rotation; transform.position = RotationTarget.position; } }
public override bool CanHover(HVRGrabbable grabbable) { if (!CanGrab(grabbable)) { return(false); } return(base.CanHover(grabbable)); }
public bool TryAddGrabbable(HVRGrabbable grabbable) { if (TryFindAvailableSocket(grabbable, out var socket)) { return(socket.TryGrab(grabbable)); } return(false); }
private void CleanupRigidBody(HVRGrabbable grabbable) { if (HoldType == SocketHoldType.RemoveRigidbody && _hadRigidBody) { grabbable.Rigidbody = grabbable.gameObject.AddComponent <Rigidbody>(); Rigidbody.mass = _mass; } }
protected override void OnHoverExit(HVRGrabbable grabbable) { if (GrabbleMustBeHeld) { grabbable.Released.RemoveListener(OnHoverGrabbableReleased); } base.OnHoverExit(grabbable); }
protected virtual Quaternion GetRotationOffset(HVRGrabbable grabbable) { if (!grabbable || !grabbable.Socketable || !grabbable.Socketable.SocketOrientation) { return(Quaternion.identity); } return(grabbable.Socketable.SocketOrientation.localRotation); }
protected virtual Vector3 GetPositionOffset(HVRGrabbable grabbable) { if (!grabbable || !grabbable.Socketable || !grabbable.Socketable.SocketOrientation) { return(Vector3.zero); } return(grabbable.Socketable.SocketOrientation.localPosition); }
private IEnumerator TryGrabGrabbable(HVRGrabbable grabbable) { yield return(new WaitForFixedUpdate()); if (CanAddGrabbable && TryGrab(grabbable)) { } }
private void OnStringGrabbed(HVRHandGrabber arg0, HVRGrabbable arg1) { if (!bow.ArrowNocked && ArrowPrefab) { var go = Instantiate(ArrowPrefab); var arrow = go.GetComponent <HVRArrow>(); bow.NockArrow(arrow); } }
public override bool CanGrab(HVRGrabbable grabbable) { if (!ShotgunMagazine.CanAddBullet()) { return(false); } return(base.CanGrab(grabbable)); }
protected override bool IsValid(HVRGrabbable grabbable) { if (!base.IsValid(grabbable)) { return(false); } return(Grabber.CheckForLineOfSight(RayCastOrigin.position, grabbable, LayerMask, MaxDistanceAllowed, UseClosestPoint)); }
private void OnStabilizerReleased(HVRGrabberBase grabber, HVRGrabbable arg1) { Grabbable.ForceTwoHandSettings = false; if (RecoilComponent) { RecoilComponent.TwoHanded = false; } }