Files
2026-02-21 16:45:37 +08:00

117 lines
2.4 KiB
C#

using UnityEngine;
public class TyreRipple : MonoBehaviour
{
public MegaDynamicRipple surface;
public float force = 1f;
private bool lastdown;
private float lastrow;
private float lastcol;
private Collider col;
private Vector3 lastpos = Vector3.zero;
private void Update()
{
if (!surface)
{
return;
}
col = surface.GetComponent<Collider>();
if ((bool)col)
{
Vector3 position = base.transform.position;
if (position != lastpos)
{
lastpos = position;
Ray ray = new Ray(position, Vector3.down);
RaycastHit hitInfo;
if (col.Raycast(ray, out hitInfo, 20f))
{
if (col is BoxCollider)
{
Vector3 vector = surface.transform.worldToLocalMatrix.MultiplyPoint(hitInfo.point);
BoxCollider boxCollider = (BoxCollider)col;
if (boxCollider.size.x != 0f)
{
vector.x /= boxCollider.size.x;
}
if (boxCollider.size.y != 0f)
{
vector.y /= boxCollider.size.y;
}
if (boxCollider.size.z != 0f)
{
vector.z /= boxCollider.size.z;
}
vector.x += 0.5f;
vector.y += 0.5f;
vector.z += 0.5f;
float num = 0f;
float num2 = 0f;
switch (surface.axis)
{
case MegaAxis.X:
num = vector.y * (float)(surface.cols - 1);
num2 = vector.z * (float)(surface.rows - 1);
break;
case MegaAxis.Y:
num = vector.x * (float)(surface.cols - 1);
num2 = vector.z * (float)(surface.rows - 1);
break;
case MegaAxis.Z:
num = vector.x * (float)(surface.cols - 1);
num2 = vector.y * (float)(surface.rows - 1);
break;
}
if (lastdown)
{
surface.Line(lastcol, lastrow, num, num2, 0f - force);
}
else
{
surface.wakeAtPointAdd1((int)num, (int)num2, 0f - force);
}
lastdown = true;
lastrow = num2;
lastcol = num;
}
else
{
float num3 = (1f - hitInfo.textureCoord.x) * (float)(surface.cols - 1);
float num4 = hitInfo.textureCoord.y * (float)(surface.rows - 1);
if (lastdown)
{
surface.Line(lastcol, lastrow, num3, num4, 0f - force);
}
else
{
surface.wakeAtPointAdd1((int)num3, (int)num4, 0f - force);
}
lastdown = true;
lastrow = num4;
lastcol = num3;
}
}
else
{
lastdown = false;
}
}
else
{
lastdown = false;
}
}
else
{
lastdown = false;
}
}
}