107 lines
3.5 KiB
C#
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;
|
|
}
|
|
} |