移除ECM2
This commit is contained in:
@@ -1,171 +0,0 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ECM2
|
||||
{
|
||||
/// <summary>
|
||||
/// General purpose collision detection functions.
|
||||
/// Lets you filter results implementing the IColliderFilter interface.
|
||||
/// </summary>
|
||||
|
||||
public static class CollisionDetection
|
||||
{
|
||||
#region CONSTANTS
|
||||
|
||||
private const int kMaxHits = 8;
|
||||
|
||||
#endregion
|
||||
|
||||
#region FIELDS
|
||||
|
||||
private static readonly RaycastHit[] HitsBuffer = new RaycastHit[kMaxHits];
|
||||
|
||||
#endregion
|
||||
|
||||
#region METHODS
|
||||
|
||||
public static int Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask,
|
||||
QueryTriggerInteraction queryTriggerInteraction, out RaycastHit closestHit, RaycastHit[] hits,
|
||||
IColliderFilter colliderFilter)
|
||||
{
|
||||
closestHit = default;
|
||||
|
||||
int rawHitCount = Physics.RaycastNonAlloc(origin, direction, HitsBuffer, distance, layerMask,
|
||||
queryTriggerInteraction);
|
||||
|
||||
if (rawHitCount == 0)
|
||||
return 0;
|
||||
|
||||
int filteredHitCount = 0;
|
||||
float closestDistance = Mathf.Infinity;
|
||||
|
||||
Array.Clear(hits, 0, hits.Length);
|
||||
|
||||
for (int i = 0; i < rawHitCount; i++)
|
||||
{
|
||||
if (HitsBuffer[i].distance <= 0.0f ||
|
||||
colliderFilter != null && colliderFilter.Filter(HitsBuffer[i].collider))
|
||||
continue;
|
||||
|
||||
if (HitsBuffer[i].distance < closestDistance)
|
||||
{
|
||||
closestHit = HitsBuffer[i];
|
||||
closestDistance = closestHit.distance;
|
||||
}
|
||||
|
||||
hits[filteredHitCount++] = HitsBuffer[i];
|
||||
}
|
||||
|
||||
return filteredHitCount;
|
||||
}
|
||||
|
||||
public static int SphereCast(Vector3 origin, float radius, Vector3 direction, float distance, int layerMask,
|
||||
QueryTriggerInteraction queryTriggerInteraction, out RaycastHit closestHit, RaycastHit[] hits,
|
||||
IColliderFilter colliderFilter, float backStepDistance)
|
||||
{
|
||||
closestHit = default;
|
||||
|
||||
Vector3 optOrigin = origin - direction * backStepDistance;
|
||||
float optDistance = distance + backStepDistance;
|
||||
|
||||
int rawHitCount = Physics.SphereCastNonAlloc(optOrigin, radius, direction, HitsBuffer, optDistance,
|
||||
layerMask, queryTriggerInteraction);
|
||||
|
||||
if (rawHitCount == 0)
|
||||
return 0;
|
||||
|
||||
int filteredHitCount = 0;
|
||||
float closestDistance = Mathf.Infinity;
|
||||
|
||||
Array.Clear(hits, 0, hits.Length);
|
||||
|
||||
for (int i = 0; i < rawHitCount; i++)
|
||||
{
|
||||
if (HitsBuffer[i].distance <= 0.0f ||
|
||||
colliderFilter != null && colliderFilter.Filter(HitsBuffer[i].collider))
|
||||
continue;
|
||||
|
||||
HitsBuffer[i].distance -= backStepDistance;
|
||||
|
||||
if (HitsBuffer[i].distance < closestDistance)
|
||||
{
|
||||
closestHit = HitsBuffer[i];
|
||||
closestDistance = closestHit.distance;
|
||||
}
|
||||
|
||||
hits[filteredHitCount++] = HitsBuffer[i];
|
||||
}
|
||||
|
||||
return filteredHitCount;
|
||||
}
|
||||
|
||||
public static int CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, float distance,
|
||||
int layerMask, QueryTriggerInteraction queryTriggerInteraction, out RaycastHit closestHit,
|
||||
RaycastHit[] hits, IColliderFilter colliderFilter, float backStepDistance)
|
||||
{
|
||||
closestHit = default;
|
||||
|
||||
Vector3 optPoint1 = point1 - direction * backStepDistance;
|
||||
Vector3 optPoint2 = point2 - direction * backStepDistance;
|
||||
|
||||
float optDistance = distance + backStepDistance;
|
||||
|
||||
int rawHitCount = Physics.CapsuleCastNonAlloc(optPoint1, optPoint2, radius, direction, HitsBuffer,
|
||||
optDistance, layerMask, queryTriggerInteraction);
|
||||
|
||||
if (rawHitCount == 0)
|
||||
return 0;
|
||||
|
||||
int filteredHitCount = 0;
|
||||
float closestDistance = Mathf.Infinity;
|
||||
|
||||
Array.Clear(hits, 0, hits.Length);
|
||||
|
||||
for (int i = 0; i < rawHitCount; i++)
|
||||
{
|
||||
if (HitsBuffer[i].distance <= 0.0f ||
|
||||
colliderFilter != null && colliderFilter.Filter(HitsBuffer[i].collider))
|
||||
continue;
|
||||
|
||||
HitsBuffer[i].distance -= backStepDistance;
|
||||
|
||||
if (HitsBuffer[i].distance < closestDistance)
|
||||
{
|
||||
closestHit = HitsBuffer[i];
|
||||
closestDistance = closestHit.distance;
|
||||
}
|
||||
|
||||
hits[filteredHitCount++] = HitsBuffer[i];
|
||||
}
|
||||
|
||||
return filteredHitCount;
|
||||
}
|
||||
|
||||
public static int OverlapCapsule(Vector3 point1, Vector3 point2, float radius, int layerMask,
|
||||
QueryTriggerInteraction queryTriggerInteraction, Collider[] results, IColliderFilter colliderFilter)
|
||||
{
|
||||
int rawOverlapCount =
|
||||
Physics.OverlapCapsuleNonAlloc(point1, point2, radius, results, layerMask, queryTriggerInteraction);
|
||||
|
||||
if (rawOverlapCount == 0)
|
||||
return 0;
|
||||
|
||||
int filteredOverlapCount = rawOverlapCount;
|
||||
|
||||
for (int i = 0; i < rawOverlapCount; i++)
|
||||
{
|
||||
Collider overlappedCollider = results[i];
|
||||
|
||||
if (colliderFilter != null && !colliderFilter.Filter(overlappedCollider))
|
||||
continue;
|
||||
|
||||
if (i < --filteredOverlapCount)
|
||||
results[i] = results[filteredOverlapCount];
|
||||
}
|
||||
|
||||
return filteredOverlapCount;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3ea13ecaa42445519734922e43f938f2
|
||||
timeCreated: 1700619165
|
||||
@@ -1,99 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
namespace ECM2
|
||||
{
|
||||
public static class MeshUtility
|
||||
{
|
||||
private const int kMaxVertices = 1024;
|
||||
private const int kMaxTriangles = kMaxVertices * 3;
|
||||
|
||||
private static readonly List<Vector3> _vertices = new List<Vector3>(kMaxVertices);
|
||||
|
||||
private static readonly List<ushort> _triangles16 = new List<ushort>(kMaxTriangles);
|
||||
private static readonly List<int> _triangles32 = new List<int>();
|
||||
|
||||
private static readonly List<ushort> _scratchBuffer16 = new List<ushort>(kMaxTriangles);
|
||||
private static readonly List<int> _scratchBuffer32 = new List<int>();
|
||||
|
||||
public static Vector3 FindMeshOpposingNormal(Mesh sharedMesh, ref RaycastHit inHit)
|
||||
{
|
||||
Vector3 v0, v1, v2;
|
||||
|
||||
if (sharedMesh.indexFormat == IndexFormat.UInt16)
|
||||
{
|
||||
_triangles16.Clear();
|
||||
|
||||
int subMeshCount = sharedMesh.subMeshCount;
|
||||
if (subMeshCount == 1)
|
||||
sharedMesh.GetTriangles(_triangles16, 0);
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < subMeshCount; i++)
|
||||
{
|
||||
sharedMesh.GetTriangles(_scratchBuffer16, i);
|
||||
|
||||
_triangles16.AddRange(_scratchBuffer16);
|
||||
}
|
||||
}
|
||||
|
||||
sharedMesh.GetVertices(_vertices);
|
||||
|
||||
v0 = _vertices[_triangles16[inHit.triangleIndex * 3 + 0]];
|
||||
v1 = _vertices[_triangles16[inHit.triangleIndex * 3 + 1]];
|
||||
v2 = _vertices[_triangles16[inHit.triangleIndex * 3 + 2]];
|
||||
}
|
||||
else
|
||||
{
|
||||
_triangles32.Clear();
|
||||
|
||||
int subMeshCount = sharedMesh.subMeshCount;
|
||||
if (subMeshCount == 1)
|
||||
sharedMesh.GetTriangles(_triangles32, 0);
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < subMeshCount; i++)
|
||||
{
|
||||
sharedMesh.GetTriangles(_scratchBuffer32, i);
|
||||
|
||||
_triangles32.AddRange(_scratchBuffer32);
|
||||
}
|
||||
}
|
||||
|
||||
sharedMesh.GetVertices(_vertices);
|
||||
|
||||
v0 = _vertices[_triangles32[inHit.triangleIndex * 3 + 0]];
|
||||
v1 = _vertices[_triangles32[inHit.triangleIndex * 3 + 1]];
|
||||
v2 = _vertices[_triangles32[inHit.triangleIndex * 3 + 2]];
|
||||
}
|
||||
|
||||
Matrix4x4 mtx = inHit.transform.localToWorldMatrix;
|
||||
|
||||
Vector3 p0 = mtx.MultiplyPoint3x4(v0);
|
||||
Vector3 p1 = mtx.MultiplyPoint3x4(v1);
|
||||
Vector3 p2 = mtx.MultiplyPoint3x4(v2);
|
||||
|
||||
Vector3 u = p1 - p0;
|
||||
Vector3 v = p2 - p0;
|
||||
|
||||
Vector3 worldNormal = Vector3.Cross(u, v).normalized;
|
||||
|
||||
if (Vector3.Dot(worldNormal, inHit.normal) < 0.0f)
|
||||
worldNormal = Vector3.Cross(v, u).normalized;
|
||||
|
||||
return worldNormal;
|
||||
}
|
||||
|
||||
public static void FlushBuffers()
|
||||
{
|
||||
_vertices.Clear();
|
||||
|
||||
_scratchBuffer16.Clear();
|
||||
_scratchBuffer32.Clear();
|
||||
|
||||
_triangles16.Clear();
|
||||
_triangles32.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 740062629b0d7924ca2d9b9f8ff3318c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user