batteryDiagnosis/Assets/3rdParty/Sci-Fi VFX/Scripts/Utils/Dumper.cs

75 lines
2.0 KiB
C#

using System.Collections;
using UnityEngine;
namespace Assets.Scripts.Dumper
{
internal sealed class Dumper : MonoBehaviour
{
public bool ChangeStartPosition;
public AnimationCurve DumpingOverTime = AnimationCurve.Linear(0, 1, 1, 1);
public float Fps = 30;
public float LifeTime = 4f;
private Vector3 _originalStartPosition;
private float _animationStartTime;
private bool _isCoCanceled;
private bool _isCoStarted;
private void Start()
{
StartEffect();
}
private void StartEffect()
{
if (_isCoStarted)
return;
Invoke("StopEffect", LifeTime);
_isCoCanceled = false;
_originalStartPosition = transform.position;
StartCoroutine(UpdateCorutine());
}
private IEnumerator UpdateCorutine()
{
_isCoStarted = true;
_animationStartTime = Time.time;
while (!_isCoCanceled)
{
var frameTime = Time.time - _animationStartTime;
if (frameTime >= LifeTime)
break;
var currentDump = DumpingOverTime.Evaluate(frameTime);
var newX = Random.Range(_originalStartPosition.x - currentDump, _originalStartPosition.x + currentDump);
var newY = Random.Range(_originalStartPosition.y - currentDump, _originalStartPosition.y + currentDump);
var newZ = Random.Range(_originalStartPosition.z - currentDump, _originalStartPosition.z + currentDump);
transform.position = new Vector3(newX, newY, newZ);
yield return new WaitForSeconds(1f / Fps);
}
}
private void StopEffect()
{
_isCoCanceled = true;
StopAllCoroutines();
_isCoStarted = false;
}
private void OnDestroy()
{
StopEffect();
}
}
}