using UnityEngine; using Spine.Unity; using System.Threading.Tasks; using System; using DG.Tweening; using asap.core; using Game; public class EventBreakDrill : EventBreakDrillDisplay { [SerializeField] private SkeletonGraphic aniDrill; private const string _drillAnimationStart = "drill_start", _drillAnimationSpin = "drill_spin", _drillAnimationIdle = "drill_idle"; [SerializeField] private float _jiandaDrillResetDuration = 0.3f; [SerializeField] private GameObject fxDrill; private Vector3 _originalPos; public override void Init(int tunnelIndex) { _originalPos = transform.position; gameObject.SetActive(false); // Debug.Log($"[EventBreak] Wakeup! Drill {tunnelIndex} init!", this); } public override async void PlayDrill(float readyDuration = 0) { // Debug.Log($"[EventBreak] Wakeup! Drill played!", this); fxDrill.SetActive(true); GContext.Publish(new EventUISound("audio_ui_drill_drill_launch", 0)); await PlayDrillAnimationReady(_drillAnimationStart, readyDuration); PlayDrillAnimationLoop(_drillAnimationSpin); } private void PlayIdle() { fxDrill.SetActive(false); PlayDrillAnimationLoop(_drillAnimationIdle); } private async Task PlayDrillAnimationReady(string animationName, double duration = 0) { if (aniDrill == null) return; var animationEntry = aniDrill.AnimationState.SetAnimation(0, animationName, false); if (duration == 0) duration = animationEntry.Animation.Duration; await Task.Delay(TimeSpan.FromSeconds(duration)); } private void PlayDrillAnimationLoop(string animationName) { try { var animationEntry = aniDrill.AnimationState.SetAnimation(0,animationName, true); } catch(Exception e) { Debug.Log($"[EventBreak] Play Spine Animation Error: {e.Message}\n{e.StackTrace}"); } } override public async void PlayEnter(Vector3 startPos) { try { var endPos = _originalPos; PlayIdle(); transform.position = startPos; await Awaiters.NextFrame; gameObject.SetActive(true); transform.DOMove(endPos, _jiandaDrillResetDuration); } catch(Exception e) { Debug.Log($"[EventBreak]{e.Message}\n{e.StackTrace}"); } } override public Tween GetDrillTween(Vector3 endPos, float duration = 0.5f) { transform.position = _originalPos; return transform.DOMove(endPos, duration).SetEase(Ease.InSine); } override public float Y => transform.position.y; } public abstract class EventBreakDrillDisplay : MonoBehaviour { abstract public void PlayEnter(Vector3 startPos); abstract public void PlayDrill(float readyDuration = 0); abstract public Tween GetDrillTween(Vector3 endPos, float duration); abstract public float Y {get;} abstract public void Init(int tunnelIndex); }