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); } } }