private ConfigurableJoint SetupStabJoint(HVRStabbableSettings settings, Transform tip, Rigidbody otherRB) { var joint = Rigidbody.gameObject.AddComponent <ConfigurableJoint>(); joint.autoConfigureConnectedAnchor = false; joint.axis = StabLineLocal.normalized; joint.secondaryAxis = HVRUtilities.OrthogonalVector(joint.axis); joint.yMotion = ConfigurableJointMotion.Locked; joint.zMotion = ConfigurableJointMotion.Locked; joint.angularXMotion = ConfigurableJointMotion.Locked; joint.angularYMotion = ConfigurableJointMotion.Locked; joint.angularZMotion = ConfigurableJointMotion.Locked; //if (IsDualStabber || CanRunThrough) //{ // joint.xMotion = ConfigurableJointMotion.Free; //} //else { joint.anchor = tip.localPosition; joint.xMotion = ConfigurableJointMotion.Limited; } var limit = joint.linearLimit; if (settings.LimitStabDepth) { limit.limit = settings.StabDepthLimit; } else { limit.limit = Length; //using world because local magnitude is affect by scaled objects if (IsDualStabber || CanRunThrough) { limit.limit += .3f; } } joint.linearLimit = limit; joint.connectedBody = otherRB; if (joint.connectedBody) { joint.connectedAnchor = joint.connectedBody.transform.InverseTransformPoint(tip.position); } else { joint.connectedAnchor = tip.position; } return(joint); }
private bool CheckUnstab() { if (_stabbedTime < Stabber.Settings.UnstabDelay) { _stabbedTime += Time.deltaTime; return(false); } var tipCheck = !_tipValid && _entryToTip.magnitude > _unstabThreshold; if (tipCheck) { return(true); } var point = HVRUtilities.FindNearestPointOnLine(_tip.position, _base.position, StabEntryPosition); var line = StabEntryPosition - point; if (line.sqrMagnitude > Stabber.Settings.PerpendicularThreshold * Stabber.Settings.PerpendicularThreshold) { if (Stabber.VerboseDebugging) { Debug.Log($"{Stabber.name} -> {Stabbable?.name} unstabbed at d {line.magnitude}."); } return(true); } if (Stabber.DrawGizmos) { Debug.DrawLine(point, StabEntryPosition, Color.red); } if (Stabber.IsDualStabber || Stabber.CanRunThrough) { var baseCheck = !_baseValid && _exitToBase.magnitude > _unstabThreshold; if (baseCheck) { return(true); } } return(false); }