OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatStatus.cs

75 lines
2.4 KiB
C#

using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class CombatStatus : MonoBehaviour
{
[field: SerializeField] public bool IsStunned { get; private set; }
[field: SerializeField] public bool IsSlowedMoveSpeed { get; private set; }
[field: SerializeField] public float MoveSpeedCoefficient { get; private set; }
[SerializeField] private Color slowColor;
[Title("효과")]
[SerializeField] private ParticleSystem stunParticle;
private SpriteRenderer flashWhiteSpriteRenderer;
private Coroutine stunCoolDownCoroutine;
private Coroutine slowMoveSpeedCoolDownCoroutine;
private bool enableTakeDamage = true;
// Events methods
public void HandleEnableTakeDamage() => enableTakeDamage = true;
public void HandleDisableTakeDamage() => enableTakeDamage = false;
public void InitComponent(SpriteRenderer spriteRenderer)
{
flashWhiteSpriteRenderer = spriteRenderer;
}
public void Stun(float duration)
{
if (!enableTakeDamage) return;
IsStunned = true;
stunParticle.Play();
if (stunCoolDownCoroutine != null)
{
StopCoroutine(stunCoolDownCoroutine);
}
stunCoolDownCoroutine = StartCoroutine(Utils.CoolDown(duration, EndStun));
}
public void EndStun()
{
IsStunned = false;
stunParticle.Stop();
stunCoolDownCoroutine = null;
}
public void SlowMoveSpeed(float duration, float moveSpeedCoefficient)
{
if (!enableTakeDamage) return;
IsSlowedMoveSpeed = true;
MoveSpeedCoefficient = moveSpeedCoefficient;
flashWhiteSpriteRenderer.color = slowColor;
if (slowMoveSpeedCoolDownCoroutine != null)
{
StopCoroutine(slowMoveSpeedCoolDownCoroutine);
}
slowMoveSpeedCoolDownCoroutine = StartCoroutine(Utils.CoolDown(duration, EndSlowMoveSpeed));
}
public void EndSlowMoveSpeed()
{
flashWhiteSpriteRenderer.color = Color.white;
IsSlowedMoveSpeed = false;
slowMoveSpeedCoolDownCoroutine = null;
}
}
}