Files
back_cantanBuilding/Assets/Scripts/EventBreak/EventBreakDrill.cs
2026-05-26 16:15:54 +08:00

96 lines
3.0 KiB
C#

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