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

60 lines
1.5 KiB
C#

using Obi;
using UnityEngine;
[RequireComponent(typeof(ObiSolver))]
public class CollisionEventHandler : MonoBehaviour
{
private ObiSolver solver;
public int contactCount;
private ObiSolver.ObiCollisionEventArgs frame;
private void Awake()
{
solver = GetComponent<ObiSolver>();
}
private void OnEnable()
{
solver.OnParticleCollision += Solver_OnCollision;
}
private void OnDisable()
{
solver.OnParticleCollision -= Solver_OnCollision;
}
private void Solver_OnCollision(object sender, ObiSolver.ObiCollisionEventArgs e)
{
frame = e;
}
private void OnDrawGizmos()
{
if (solver == null || frame == null || frame.contacts == null)
{
return;
}
Gizmos.matrix = solver.transform.localToWorldMatrix;
contactCount = frame.contacts.Count;
for (int i = 0; i < frame.contacts.Count; i++)
{
Oni.Contact contact = frame.contacts.Data[i];
Gizmos.color = ((contact.distance <= 0f) ? Color.red : Color.green);
Vector3 zero = Vector3.zero;
int size;
int simplexStartAndSize = solver.simplexCounts.GetSimplexStartAndSize(contact.bodyB, out size);
float num = 0f;
for (int j = 0; j < size; j++)
{
zero += (Vector3)solver.positions[solver.simplices[simplexStartAndSize + j]] * contact.pointB[j];
num += solver.principalRadii[solver.simplices[simplexStartAndSize + j]].x * contact.pointB[j];
}
Vector3 vector = contact.normal;
Gizmos.DrawSphere(zero + vector * num, 0.01f);
Gizmos.DrawRay(zero + vector * num, vector.normalized * contact.distance);
}
}
}