Files
UltimateFishing2020/Assets/Scripts/Assembly-CSharp/FIMSpace/FImp_ColliderData_Sphere.cs
2026-03-04 10:03:45 +08:00

124 lines
3.9 KiB
C#

using UnityEngine;
namespace FIMSpace
{
public class FImp_ColliderData_Sphere : FImp_ColliderData_Base
{
private float SphereRadius;
public SphereCollider Sphere { get; private set; }
public CircleCollider2D Sphere2D { get; private set; }
public FImp_ColliderData_Sphere(SphereCollider collider)
{
Is2D = false;
base.Transform = collider.transform;
base.Collider = collider;
Sphere = collider;
base.ColliderType = EFColliderType.Sphere;
RefreshColliderData();
}
public FImp_ColliderData_Sphere(CircleCollider2D collider)
{
Is2D = true;
base.Transform = collider.transform;
base.Collider2D = collider;
Sphere2D = collider;
base.ColliderType = EFColliderType.Sphere;
RefreshColliderData();
}
public override void RefreshColliderData()
{
if (!base.IsStatic)
{
if (Sphere2D == null)
{
SphereRadius = CalculateTrueRadiusOfSphereCollider(Sphere.transform, Sphere.radius);
base.RefreshColliderData();
}
else
{
SphereRadius = CalculateTrueRadiusOfSphereCollider(Sphere2D.transform, Sphere2D.radius);
base.RefreshColliderData();
}
}
}
public override bool PushIfInside(ref Vector3 point, float pointRadius, Vector3 pointOffset)
{
if (!Is2D)
{
return PushOutFromSphereCollider(Sphere, pointRadius, ref point, SphereRadius, pointOffset);
}
return PushOutFromSphereCollider(Sphere2D, pointRadius, ref point, SphereRadius, pointOffset);
}
public static bool PushOutFromSphereCollider(SphereCollider sphere, float segmentColliderRadius, ref Vector3 segmentPos, Vector3 segmentOffset)
{
return PushOutFromSphereCollider(sphere, segmentColliderRadius, ref segmentPos, CalculateTrueRadiusOfSphereCollider(sphere), segmentOffset);
}
public static bool PushOutFromSphereCollider(SphereCollider sphere, float segmentColliderRadius, ref Vector3 segmentPos, float collidingSphereRadius, Vector3 segmentOffset)
{
Vector3 vector = sphere.transform.position + sphere.transform.TransformVector(sphere.center);
float num = collidingSphereRadius + segmentColliderRadius;
Vector3 vector2 = segmentPos + segmentOffset - vector;
float sqrMagnitude = vector2.sqrMagnitude;
if (sqrMagnitude > 0f && sqrMagnitude < num * num)
{
segmentPos = vector - segmentOffset + vector2 * (num / Mathf.Sqrt(sqrMagnitude));
return true;
}
return false;
}
public static bool PushOutFromSphereCollider(CircleCollider2D sphere, float segmentColliderRadius, ref Vector3 segmentPos, float collidingSphereRadius, Vector3 segmentOffset)
{
Vector3 vector = sphere.transform.position + sphere.transform.TransformVector(sphere.offset);
vector.z = 0f;
float num = collidingSphereRadius + segmentColliderRadius;
Vector3 vector2 = segmentPos;
vector2.z = 0f;
Vector3 vector3 = vector2 + segmentOffset - vector;
float sqrMagnitude = vector3.sqrMagnitude;
if (sqrMagnitude > 0f && sqrMagnitude < num * num)
{
segmentPos = vector - segmentOffset + vector3 * (num / Mathf.Sqrt(sqrMagnitude));
return true;
}
return false;
}
public static float CalculateTrueRadiusOfSphereCollider(SphereCollider sphere)
{
return CalculateTrueRadiusOfSphereCollider(sphere.transform, sphere.radius);
}
public static float CalculateTrueRadiusOfSphereCollider(CircleCollider2D sphere)
{
return CalculateTrueRadiusOfSphereCollider(sphere.transform, sphere.radius);
}
public static float CalculateTrueRadiusOfSphereCollider(Transform transform, float componentRadius)
{
float num = componentRadius;
if (transform.lossyScale.x > transform.lossyScale.y)
{
if (transform.lossyScale.x > transform.lossyScale.z)
{
return num * transform.lossyScale.x;
}
return num * transform.lossyScale.z;
}
if (transform.lossyScale.y > transform.lossyScale.z)
{
return num * transform.lossyScale.y;
}
return num * transform.lossyScale.z;
}
}
}