2025-04-22 17:16:40 +08:00

107 lines
3.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Unity.HLODSystem.Utils
{
public static class ColliderExtension
{
public static WorkingCollider ToWorkingCollider(this Collider collider, HLOD hlod)
{
var hlodWorldToLocal = hlod.transform.worldToLocalMatrix;
var colliderLocalToWorld = collider.transform.localToWorldMatrix;
var matrix = hlodWorldToLocal * colliderLocalToWorld;
WorkingCollider wc = new WorkingCollider();
dynamic parameters = wc.Parameters;
wc.Type = collider.GetType().Name;
wc.Position = matrix.GetPosition();
wc.Rotation = matrix.rotation;
wc.Scale = matrix.lossyScale;
parameters.Enabled = collider.enabled;
parameters.IsTrigger = collider.isTrigger;
parameters.ContactOffset = collider.contactOffset;
if (collider is BoxCollider boxCollider)
{
parameters.SizeX = boxCollider.size.x;
parameters.SizeY = boxCollider.size.y;
parameters.SizeZ = boxCollider.size.z;
parameters.CenterX = boxCollider.center.x;
parameters.CenterY = boxCollider.center.y;
parameters.CenterZ = boxCollider.center.z;
}
else if (collider is MeshCollider meshCollider)
{
parameters.SharedMeshPath = ObjectUtils.ObjectToPath(meshCollider.sharedMesh);
parameters.Convex = meshCollider.convex;
}
else if (collider is SphereCollider sphereCollider)
{
parameters.CenterX = sphereCollider.center.x;
parameters.CenterY = sphereCollider.center.y;
parameters.CenterZ = sphereCollider.center.z;
parameters.Radius = sphereCollider.radius;
}
else if (collider is CapsuleCollider capsuleCollider)
{
parameters.CenterX = capsuleCollider.center.x;
parameters.CenterY = capsuleCollider.center.y;
parameters.CenterZ = capsuleCollider.center.z;
parameters.Radius = capsuleCollider.radius;
parameters.Height = capsuleCollider.height;
parameters.Direction = capsuleCollider.direction;
}
else if (collider is TerrainCollider terrainCollider)
{
parameters.TerrainData = GUIDUtils.ObjectToGUID(terrainCollider.terrainData);
}
else
{
Debug.LogError($"{collider.name} collider is not support.");
}
return wc;
}
}
public class WorkingCollider
{
string m_type;
Vector3 m_position;
Quaternion m_rotation;
Vector3 m_scale;
SerializableDynamicObject m_parameters = new SerializableDynamicObject();
public string Type
{
get => m_type;
set => m_type = value;
}
public Vector3 Position
{
get => m_position;
set => m_position = value;
}
public Quaternion Rotation
{
get => m_rotation;
set => m_rotation = value;
}
public Vector3 Scale
{
get => m_scale;
set => m_scale = value;
}
public SerializableDynamicObject Parameters => m_parameters;
}
}