_xiaofang/xiaofang/Assets/Obi/Scripts/Common/Collisions/ObiCollider.cs
杨号敬 bcc74f0465 add
2024-12-18 02:18:45 +08:00

118 lines
3.8 KiB
C#

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;
/// <summary>
/// The Unity collider that this ObiCollider should mimic.
/// </summary>
/// 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;
/// <summary>
/// The distance field used by this collider.
/// </summary>
/// Setting a distance field will cause the collider to ignore its <see cref="m_SourceCollider"/> 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<Collider>();
else
AddCollider();
}
}
}