71 lines
1.9 KiB
C#
71 lines
1.9 KiB
C#
using Cysharp.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace DanieleMarotta.RiversongCodeShowcase
|
|
{
|
|
public class TreeFallAnimation : MonoBehaviour, IDestroyRawResourceAnimation
|
|
{
|
|
[SerializeField]
|
|
private float _fallDelay;
|
|
|
|
[SerializeField]
|
|
private float _fallDuration = 1;
|
|
|
|
[SerializeField]
|
|
private AnimationCurve _fallRotationCurve = AnimationCurve.Linear(0, 0, 1, 1);
|
|
|
|
[SerializeField]
|
|
private float _sinkDelay = 0.5f;
|
|
|
|
[SerializeField]
|
|
private float _sinkDepth = 1;
|
|
|
|
[SerializeField]
|
|
private float _sinkSpeed = 1;
|
|
|
|
public async UniTask PlayAsync()
|
|
{
|
|
await FallAsync();
|
|
await SinkAsync();
|
|
}
|
|
|
|
private async UniTask FallAsync()
|
|
{
|
|
await UniTask.WaitForSeconds(_fallDelay);
|
|
|
|
var axis = Quaternion.Euler(0, Random.value * 360, 0) * Vector3.forward;
|
|
|
|
var initialRotation = transform.rotation;
|
|
var finalRotation = initialRotation * Quaternion.AngleAxis(90, axis);
|
|
|
|
var t = 0f;
|
|
while (t < 1)
|
|
{
|
|
t += Time.deltaTime / _fallDuration;
|
|
|
|
transform.rotation = Quaternion.Lerp(initialRotation, finalRotation, _fallRotationCurve.Evaluate(t));
|
|
|
|
await UniTask.NextFrame();
|
|
}
|
|
|
|
transform.rotation = finalRotation;
|
|
}
|
|
|
|
private async UniTask SinkAsync()
|
|
{
|
|
await UniTask.WaitForSeconds(_sinkDelay);
|
|
|
|
var initialY = transform.position.y;
|
|
var finalY = initialY - _sinkDepth;
|
|
|
|
while (transform.position.y > finalY)
|
|
{
|
|
transform.position += Vector3.down * _sinkSpeed * Time.deltaTime;
|
|
|
|
await UniTask.NextFrame();
|
|
}
|
|
|
|
transform.position = new Vector3(transform.position.x, finalY, transform.position.z);
|
|
}
|
|
}
|
|
} |