RoguelikeKit/Assets/Common/Scripts/Enemies/Boss Mega Slime/EnemyMegaSlimeProjectileBehavior.cs

104 lines
3.1 KiB
C#

using OctoberStudio.Easing;
using OctoberStudio.Extensions;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
namespace OctoberStudio.Enemy
{
public class EnemyMegaSlimeProjectileBehavior : SimpleEnemyProjectileBehavior
{
private static readonly int IS_FLYING_DOWN_BOOL = Animator.StringToHash("Is Flying Down");
[SerializeField] Collider2D projectileCollider;
[SerializeField] GameObject visuals;
[SerializeField] Animator animator;
[SerializeField] ParticleSystem hitParticle;
private Coroutine attackCoroutine;
public new UnityAction<EnemyMegaSlimeProjectileBehavior> onFinished;
private WarningCircleBehavior warningCircle;
private IEasingCoroutine easingCoroutine;
public override void Init(Vector2 position, Vector2 direction)
{
base.Init(position, direction);
projectileCollider.enabled = false;
Vector3 upPosition = transform.position.SetY(CameraManager.TopBound + 2f);
easingCoroutine = transform.DoPosition(upPosition, 0.3f).SetEasing(EasingType.SineIn).SetOnFinish(SwordHiddlen);
}
private void SwordHiddlen()
{
visuals.gameObject.SetActive(false);
attackCoroutine = StartCoroutine(AttackCoroutine());
}
private IEnumerator AttackCoroutine()
{
warningCircle = StageController.PoolsManager.GetEntity<WarningCircleBehavior>("Warning Circle");
warningCircle.transform.position = PlayerBehavior.Player.transform.position;
warningCircle.Play(1f, 0.3f, 100, null);
warningCircle.Follow(PlayerBehavior.Player.transform, Vector3.zero, Time.deltaTime * 3);
yield return new WaitForSeconds(2f);
warningCircle.StopFollowing();
Vector2 targetPosition = warningCircle.transform.position;
transform.position = targetPosition.SetY(CameraManager.TopBound + 2f);
visuals.gameObject.SetActive(true);
animator.SetBool(IS_FLYING_DOWN_BOOL, true);
easingCoroutine = transform.DoPosition(targetPosition, 0.5f).SetOnFinish(() =>
{
animator.SetBool(IS_FLYING_DOWN_BOOL, false);
projectileCollider.enabled = true;
hitParticle.Play();
warningCircle.gameObject.SetActive(false);
warningCircle = null;
easingCoroutine = EasingManager.DoAfter(0.3f, () => projectileCollider.enabled = false);
});
yield return new WaitForSeconds(2);
gameObject.SetActive(false);
onFinished?.Invoke(this);
attackCoroutine = null;
}
protected override void Update()
{
}
public void Clear()
{
if (attackCoroutine != null) StopCoroutine(attackCoroutine);
if(warningCircle != null)
{
warningCircle.gameObject.SetActive(false);
}
easingCoroutine.StopIfExists();
gameObject.SetActive(false);
}
}
}