96 lines
3.0 KiB
C#
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);
|
|
} |