mirror of
https://github.com/FriendshipIsEpic/FiE-Game.git
synced 2024-11-30 08:57:59 +01:00
123 lines
3 KiB
C#
123 lines
3 KiB
C#
|
using UnityEngine;
|
||
|
|
||
|
namespace Fie.Utility
|
||
|
{
|
||
|
public class Wiggler
|
||
|
{
|
||
|
public enum WiggleTemplate
|
||
|
{
|
||
|
WIGGLE_TYPE_MINIMUM,
|
||
|
WIGGLE_TYPE_SMALL,
|
||
|
WIGGLE_TYPE_MIDDLE,
|
||
|
WIGGLE_TYPE_BIG
|
||
|
}
|
||
|
|
||
|
private const float MIN_RANDOM_SHAKE_ANGLE_RANGE = 120f;
|
||
|
|
||
|
private const float MAX_RANDOM_SHAKE_ANGLE_RANGE = 240f;
|
||
|
|
||
|
private float nowAngle;
|
||
|
|
||
|
private float nowTime;
|
||
|
|
||
|
private float totalTime;
|
||
|
|
||
|
private float wiggleSegmentTime;
|
||
|
|
||
|
private int totalWiggleCount = 1;
|
||
|
|
||
|
private int nowWiggleCount;
|
||
|
|
||
|
private Vector3 wiggleScale = Vector3.zero;
|
||
|
|
||
|
private Vector3 wiggleNormal = Vector3.zero;
|
||
|
|
||
|
private Vector3 nowWigglePoint = Vector3.zero;
|
||
|
|
||
|
private Vector3 nextWigglePoint = Vector3.zero;
|
||
|
|
||
|
public bool isEnd => nowWiggleCount >= totalWiggleCount;
|
||
|
|
||
|
public Wiggler(Vector3 normal, float initTotalTime, int initWiggleCount, Vector3 initWiggleScale)
|
||
|
{
|
||
|
totalTime = Mathf.Max(initTotalTime, 0f);
|
||
|
totalWiggleCount = Mathf.Max(initWiggleCount, 1);
|
||
|
wiggleScale = initWiggleScale;
|
||
|
wiggleNormal = normal.normalized;
|
||
|
InitializeGeneralParams();
|
||
|
}
|
||
|
|
||
|
public Wiggler(Vector3 normal, WiggleTemplate template)
|
||
|
{
|
||
|
float num = 0f;
|
||
|
int num2 = 1;
|
||
|
Vector3 zero = Vector3.zero;
|
||
|
switch (template)
|
||
|
{
|
||
|
default:
|
||
|
num = 0.15f;
|
||
|
num2 = 4;
|
||
|
zero = new Vector3(0.015f, 0.015f);
|
||
|
break;
|
||
|
case WiggleTemplate.WIGGLE_TYPE_SMALL:
|
||
|
num = 0.2f;
|
||
|
num2 = 5;
|
||
|
zero = new Vector3(0.03f, 0.03f);
|
||
|
break;
|
||
|
case WiggleTemplate.WIGGLE_TYPE_MIDDLE:
|
||
|
num = 0.3f;
|
||
|
num2 = 7;
|
||
|
zero = new Vector3(0.1f, 0.1f);
|
||
|
break;
|
||
|
case WiggleTemplate.WIGGLE_TYPE_BIG:
|
||
|
num = 0.5f;
|
||
|
num2 = 10;
|
||
|
zero = new Vector3(0.1f, 0.1f);
|
||
|
break;
|
||
|
}
|
||
|
totalTime = Mathf.Max(num, 0f);
|
||
|
totalWiggleCount = Mathf.Max(num2, 1);
|
||
|
wiggleScale = zero;
|
||
|
wiggleNormal = normal.normalized;
|
||
|
InitializeGeneralParams();
|
||
|
}
|
||
|
|
||
|
public Vector3 UpdateWiggler(float updateTime)
|
||
|
{
|
||
|
if (nowTime >= totalTime)
|
||
|
{
|
||
|
return Vector3.zero;
|
||
|
}
|
||
|
Vector3 result = (!(wiggleSegmentTime > 0f)) ? Vector3.zero : Vector3.Lerp(nowWigglePoint, nextWigglePoint, Mathf.Min(nowTime / wiggleSegmentTime, 1f));
|
||
|
nowTime += updateTime;
|
||
|
if (nowTime > wiggleSegmentTime && nowWiggleCount < totalWiggleCount)
|
||
|
{
|
||
|
nowWiggleCount++;
|
||
|
SetNextWigglePoint(nowWiggleCount);
|
||
|
nowTime = 0f;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
private void InitializeGeneralParams()
|
||
|
{
|
||
|
nowTime = 0f;
|
||
|
wiggleSegmentTime = totalTime / (float)totalWiggleCount;
|
||
|
nowWiggleCount = 0;
|
||
|
SetNextWigglePoint(nowWiggleCount);
|
||
|
}
|
||
|
|
||
|
private void SetNextWigglePoint(int count)
|
||
|
{
|
||
|
nowWigglePoint = new Vector3(nextWigglePoint.x, nextWigglePoint.y);
|
||
|
float num = ((float)totalWiggleCount - (float)count) / (float)totalWiggleCount;
|
||
|
float angle = nowAngle + Random.Range(120f, 240f);
|
||
|
Quaternion rotation = Quaternion.AngleAxis(angle, wiggleNormal);
|
||
|
Vector3 vector = rotation * Vector3.up;
|
||
|
vector.Normalize();
|
||
|
nextWigglePoint = new Vector3(wiggleScale.x * (vector.x * num), wiggleScale.y * (vector.y * num));
|
||
|
nowAngle = angle;
|
||
|
}
|
||
|
}
|
||
|
}
|