public void ApplyStatusToAll(ColliderStatus status) { for (int i = 0; i < m_Items.Length; i++) { if (m_Items[i]) { m_Items[i].Status = status; } } }
/// <summary> /// Configures the collider for the specified behavior. /// </summary> /// <remarks> /// <para> /// See the /// <a href="http://docs.unity3d.com/Manual/CollidersOverview.html">Collider Overview</a> /// page in the Unity Manual for details. /// </para> /// <para> /// This method is not appropriate for use with compound rigidbody collider configurations /// since it only updates the specified collider and its ridigbody. It does not try to /// locate other colliders that might be associated with the rigidbody. /// </para> /// <para> /// Transitions between rigidbody and static behaviors is not supported since doing so /// would required adding and destroying rigidbodys. /// </para> /// </remarks> /// <param name="collider">The collider to update.</param> /// <param name="status">The desired behavior type.</param> public static void SetStatus(this Collider collider, ColliderStatus status) { if (status == ColliderStatus.Disabled && !collider) { return; } var rigidbody = collider.GetAssociatedRigidBody(); switch (status) { case ColliderStatus.KinematicCollider: if (rigidbody) { rigidbody.detectCollisions = true; rigidbody.isKinematic = true; collider.isTrigger = false; collider.enabled = true; } else { Debug.LogErrorFormat( collider, BadRigidBodyTransition, collider.GetStatus(), status); } break; case ColliderStatus.KinematicTrigger: if (rigidbody) { rigidbody.detectCollisions = true; rigidbody.isKinematic = true; collider.isTrigger = true; collider.enabled = true; } else { Debug.LogErrorFormat( collider, BadRigidBodyTransition, collider.GetStatus(), status); } break; case ColliderStatus.Disabled: if (collider) { collider.enabled = false; } break; case ColliderStatus.RigidbodyCollider: if (rigidbody) { rigidbody.detectCollisions = true; rigidbody.isKinematic = false; collider.isTrigger = false; collider.enabled = true; } else { Debug.LogErrorFormat( collider, BadRigidBodyTransition, collider.GetStatus(), status); } break; case ColliderStatus.RigidbodyTrigger: if (rigidbody) { rigidbody.detectCollisions = true; rigidbody.isKinematic = false; collider.isTrigger = true; collider.enabled = true; } else { Debug.LogErrorFormat( collider, BadRigidBodyTransition, collider.GetStatus(), status); } break; case ColliderStatus.StaticCollider: if (rigidbody) { Debug.LogErrorFormat( collider, BadStaticTransition, collider.GetStatus(), status); } else { collider.isTrigger = false; collider.enabled = true; } break; case ColliderStatus.StaticTrigger: if (rigidbody) { Debug.LogErrorFormat( collider, BadStaticTransition, collider.GetStatus(), status); } else { collider.isTrigger = true; collider.enabled = true; } break; } }
/* * Design notes: * * Custom editors exist for this class. In order to reduce hard coded field names, * the fields are organized into sections. Take care when refactoring field names that * are marked as being used in the editor, and make sure you understand the custom * editor design before rearranging, adding, or deleting fields. */ #region Body Parts (Editor Section) public sealed override void ApplyBodyPartStatus(ColliderStatus status) { CheckInitializeBodyParts(); m_Parts.ApplyStatusToAll(status); }
/// <summary> /// Applies the colider status to all body parts. /// </summary> /// <param name="status">The desired status.</param> public abstract void ApplyBodyPartStatus(ColliderStatus status);