void FixedUpdate() { // Destroy itself when monitored joint was destroyed. if (Joint == null) { Destroy(this); return; } else if (!Joint.enabled) { return; } Vector2 reactionForce; float reactionTorque; if (Joint is DistanceJoint2D) { var specificJoint = Joint as DistanceJoint2D; reactionForce = specificJoint.GetReactionForce(Time.fixedDeltaTime); reactionTorque = specificJoint.GetReactionTorque(Time.fixedDeltaTime); } else if (Joint is HingeJoint2D) { var specificJoint = Joint as HingeJoint2D; reactionForce = specificJoint.GetReactionForce(Time.fixedDeltaTime); reactionTorque = specificJoint.GetReactionTorque(Time.fixedDeltaTime); } else if (Joint is SliderJoint2D) { var specificJoint = Joint as SliderJoint2D; reactionForce = Vector2.zero; reactionTorque = specificJoint.GetMotorForce(Time.fixedDeltaTime); } else if (Joint is SpringJoint2D) { var specificJoint = Joint as SpringJoint2D; reactionForce = specificJoint.GetReactionForce(Time.fixedDeltaTime); reactionTorque = specificJoint.GetReactionTorque(Time.fixedDeltaTime); } else if (Joint is WheelJoint2D) { var specificJoint = Joint as WheelJoint2D; reactionForce = Vector2.zero; reactionTorque = specificJoint.GetMotorTorque(Time.fixedDeltaTime); } else { Debug.LogWarning("Unsupported joint type: " + Joint.GetType().Name, this); Destroy(this); return; } if (reactionForce.magnitude >= DebugPrint_MinForce) { print( "reactionForce: " + reactionForce.magnitude + ", reactionTorque: " + reactionTorque ); } if (reactionForce.magnitude > BreakForce || reactionTorque > BreakTorque) { var messageData = new BrokenJointData() { BreakableJoint = this, Force = reactionForce, Torque = reactionTorque }; SendMessage(BrokenJointData.MessageName, messageData, SendMessageOptions.DontRequireReceiver); if (BreakBehaviour == JointBreakBehaviour.Disable) { Joint.enabled = false; } else if (BreakBehaviour == JointBreakBehaviour.Destroy) { Destroy(Joint); } } }
void OnJointBreak2D(BrokenJointData brokenJointData) { footWeldDestroyedTimestamp = Time.fixedTime; }