using UnityEngine; using UnityEngine.Serialization; namespace Obi { /** * Add this component to any Collider that you want to be considered by Obi. */ [ExecuteInEditMode] [RequireComponent(typeof(Collider))] public class ObiCollider : ObiColliderBase { [SerializeProperty("sourceCollider")] [FormerlySerializedAs("SourceCollider")] [SerializeField] private Collider m_SourceCollider; /// /// The Unity collider that this ObiCollider should mimic. /// /// This is automatically set when you first create the ObiCollider component, but you can override it afterwards. public Collider sourceCollider { set { if (value != null && value.gameObject != this.gameObject) { Debug.LogError("The Collider component must reside in the same GameObject as ObiCollider."); return; } RemoveCollider(); m_SourceCollider = value; AddCollider(); } get { return m_SourceCollider; } } [SerializeProperty("distanceField")] [FormerlySerializedAs("distanceField")] [SerializeField] private ObiDistanceField m_DistanceField; /// /// The distance field used by this collider. /// /// Setting a distance field will cause the collider to ignore its and use the distance field instead. public ObiDistanceField distanceField { set { if (m_DistanceField != value) { m_DistanceField = value; CreateTracker(); } } get { return m_DistanceField; } } /** * Creates an OniColliderTracker of the appropiate type. */ protected override void CreateTracker() { if (tracker != null) { tracker.Destroy(); tracker = null; } if (distanceField != null) tracker = new ObiDistanceFieldShapeTracker(this, m_SourceCollider, distanceField); else { if (m_SourceCollider is SphereCollider) tracker = new ObiSphereShapeTracker(this, (SphereCollider)m_SourceCollider); else if (m_SourceCollider is BoxCollider) tracker = new ObiBoxShapeTracker(this, (BoxCollider)m_SourceCollider); else if (m_SourceCollider is CapsuleCollider) tracker = new ObiCapsuleShapeTracker(this, (CapsuleCollider)m_SourceCollider); else if (m_SourceCollider is CharacterController) tracker = new ObiCharacterControllerShapeTracker(this, (CharacterController)m_SourceCollider); else if (m_SourceCollider is TerrainCollider) tracker = new ObiTerrainShapeTracker(this, (TerrainCollider)m_SourceCollider); else if (m_SourceCollider is MeshCollider) tracker = new ObiMeshShapeTracker(this,(MeshCollider)m_SourceCollider); else Debug.LogWarning("Collider type not supported by Obi."); } } protected override Component GetUnityCollider(ref bool enabled) { if (m_SourceCollider != null) enabled = m_SourceCollider.enabled; return m_SourceCollider; } protected override void FindSourceCollider() { if (sourceCollider == null) sourceCollider = GetComponent(); else AddCollider(); } } }