Files
2026-03-04 10:03:45 +08:00

56 lines
1.5 KiB
C#

using System;
using UnityEngine;
namespace Artngame.TEM
{
public static class TornadoMath
{
public static float GetAngle(float x, float y)
{
float num = Mathf.Atan2(y, x) / MathF.PI * 180f;
if (num < 0f)
{
num += 360f;
}
return num;
}
public static Vector3 GetParticlePos(Vector3 centerPos, float angle, float radius, float rotationSpeed)
{
angle += rotationSpeed * Time.deltaTime;
float f = angle * (MathF.PI / 180f);
float x = centerPos.x + radius * Mathf.Cos(f);
float z = centerPos.z + radius * Mathf.Sin(f);
return new Vector3(x, 0f, z);
}
public static Vector3 GetParticleVel(float angle, float radius, float rotationSpeed)
{
angle += rotationSpeed * Time.deltaTime;
float f = angle * (MathF.PI / 180f);
float x = Mathf.Cos(f) - radius * Mathf.Sin(f);
float z = Mathf.Sin(f) + radius * Mathf.Cos(f);
return new Vector3(x, 0f, z);
}
public static float CalculateProgress(Vector3 from, Vector3 to, Vector3 current)
{
Vector3 rhs = to - from;
return Vector3.Dot(current - from, rhs) / rhs.sqrMagnitude;
}
public static Vector3 CheckRadius(Vector3 particlePos, Vector3 centerPos, float wantedRadius)
{
particlePos.y = 0f;
centerPos.y = 0f;
float magnitude = (particlePos - centerPos).magnitude;
Vector3 normalized = (particlePos - centerPos).normalized;
if (magnitude < wantedRadius)
{
particlePos += normalized * (wantedRadius - magnitude);
}
return particlePos;
}
}
}