10using System.Collections.Generic;
23 [AddComponentMenu(
"")]
56 Vector3 scale =
collider.transform.lossyScale;
58 SphereCollider sphere =
collider as SphereCollider;
59 return Mathf.Min(sphere.radius * scale.x,
60 Mathf.Min(sphere.radius * scale.y,
61 sphere.radius * scale.z)) * 2F;
63 else if (
collider is CapsuleCollider) {
64 CapsuleCollider capsule =
collider as CapsuleCollider;
65 return Mathf.Min(capsule.radius * scale.x,
66 Mathf.Min(capsule.radius * scale.y,
67 capsule.radius * scale.z)) * 1F;
70 BoxCollider box =
collider as BoxCollider;
71 return Mathf.Min(box.size.x * scale.x,
72 Mathf.Min(box.size.y * scale.y,
73 box.size.z * scale.z));
76 return Mathf.Min(
collider.bounds.size.x * scale.x,
77 Mathf.Min(
collider.bounds.size.y * scale.y,
109 Dictionary<IInteractionBehaviour, float> contactingInteractionBehaviours =
new Dictionary<IInteractionBehaviour, float>();
119 void OnCollisionEnter(Collision collision) {
121 bool hitNonInteractionObject =
false;
124 if (collision.rigidbody ==
null) {
126 hitNonInteractionObject =
true;
130 IInteractionBehaviour interactionObj;
133 if (interactionObj is InteractionBehaviour) {
134 switch ((interactionObj as InteractionBehaviour).contactForceMode) {
150 if (collision.impulse.magnitude > 0f) {
151 if (!contactingInteractionBehaviours.ContainsKey(interactionObj)) {
153 contactingInteractionBehaviours.Add(interactionObj, Time.fixedTime);
159 hitNonInteractionObject =
true;
165 if (hitNonInteractionObject) {
167 Debug.LogError(
"Contact bone collided with something that's not an Interaction"
168 +
"Behaviour! This is liable to cause contact bones to build unstable "
169 +
"velocities and produce bad behavior. Please check your layer "
170 +
"settings in the Interaction Manager, and avoid placing any non-"
171 +
"Interaction objects in layers that contain Interaction objects.",
177 private void OnCollisionStay(Collision collision) {
178 if (collision.rigidbody ==
null) {
return; }
180 IInteractionBehaviour interactionObj;
181 float timeEntered = 0;
183 if (collision.impulse.magnitude > 0f && !contactingInteractionBehaviours.ContainsKey(interactionObj)) {
185 contactingInteractionBehaviours.Add(interactionObj, Time.fixedTime);
186 }
else if (contactingInteractionBehaviours.TryGetValue(interactionObj, out timeEntered) && Time.fixedTime - timeEntered > Time.fixedDeltaTime * 10f) {
188 contactingInteractionBehaviours.Remove(interactionObj);
193 void OnCollisionExit(Collision collision) {
194 if (collision.rigidbody ==
null) {
return; }
196 IInteractionBehaviour interactionObj;
198 if (contactingInteractionBehaviours.ContainsKey(interactionObj)) {
200 contactingInteractionBehaviours.Remove(interactionObj);
205 void OnTriggerEnter(Collider
collider) {
206 if (
collider.attachedRigidbody ==
null) {
return; }
208 IInteractionBehaviour interactionObj;
216 void OnTriggerExit(Collider
collider) {
217 if (
collider.attachedRigidbody ==
null) {
return; }
219 IInteractionBehaviour interactionObj;
void NotifySoftContactCollisionExit(ContactBone bone, IInteractionBehaviour intObj, Collider collider)
void NotifySoftContactCollisionEnter(ContactBone bone, IInteractionBehaviour intObj, Collider collider)
void NotifyContactBoneCollisionEnter(ContactBone contactBone, IInteractionBehaviour interactionObj)
void NotifyContactBoneCollisionExit(ContactBone contactBone, IInteractionBehaviour interactionObj)
InteractionManager manager
Dictionary< Rigidbody, ContactBone > contactBoneBodies
Maps a Rigidbody to its attached ContactBone, if the Rigidbody is part of an interaction controller.
Dictionary< Rigidbody, IInteractionBehaviour > interactionObjectBodies
Maps a Rigidbody to its attached interaction object, if the Rigidbody is part of and interaction obje...