Net.Like.Xue.Tokyo/Assets/Plugins/Character Controller Pro/Utilities/Scripts/CapsuleColliderComponent3D.cs

69 lines
2.0 KiB
C#
Raw Normal View History

2024-11-03 16:42:23 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Lightbug.Utilities
{
/// <summary>
/// This component represents a capsule collider in a 3D world.
/// </summary>
public class CapsuleColliderComponent3D : ColliderComponent3D
{
CapsuleCollider capsuleCollider = null;
public override Vector3 Size
{
get
{
return new Vector2(2f * capsuleCollider.radius, capsuleCollider.height);
}
set
{
capsuleCollider.radius = value.x / 2f;
capsuleCollider.height = value.y;
}
}
public override Vector3 BoundsSize => capsuleCollider.bounds.size;
public override Vector3 Offset
{
get => capsuleCollider.center;
set => capsuleCollider.center = value;
}
protected override int InternalOverlapBody(Vector3 position, Quaternion rotation, Collider[] unfilteredResults, List<Collider> filteredResults, OverlapFilterDelegate3D filter)
{
var up = rotation * Vector3.up;
var centerToTopCenter = (0.5f * capsuleCollider.height - capsuleCollider.radius) * up;
var center = position + rotation * capsuleCollider.center;
var bottom = center + centerToTopCenter;
var top = center - centerToTopCenter;
var overlaps = Physics.OverlapCapsuleNonAlloc(
bottom,
top,
capsuleCollider.radius,
unfilteredResults,
Physics.DefaultRaycastLayers,
QueryTriggerInteraction.Ignore
);
return FilterValidOverlaps(overlaps, unfilteredResults, filteredResults, filter);
}
protected override void Awake()
{
capsuleCollider = gameObject.GetOrAddComponent<CapsuleCollider>();
collider = capsuleCollider;
base.Awake();
}
}
}