2018-11-20 20:10:49 +01:00
|
|
|
using UnityEngine;
|
|
|
|
|
2018-11-21 21:16:20 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2018-11-20 20:10:49 +01:00
|
|
|
}
|