using System.Collections; using BlueWater.Interfaces; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Enemies.Bosses { public abstract class AnimatorBoss : Boss, ICurrentDirection { // Variables #region Variables // Components [field: Title("애니메이터 보스 컴포넌트")] [field: SerializeField] public SpriteRenderer SpriteRenderer { get; private set; } [field: SerializeField] public Animator Animator { get; private set; } // Classes [field: SerializeField] public AnimationController AnimationController { get; private set; } private bool _isMoving; public bool IsMoving { get => _isMoving; set { _isMoving = value; AnimationController.SetAnimationParameter("isMoving", _isMoving); } } private Vector3 _currentDirection = Vector3.right; public Vector3 CurrentDirection { get => _currentDirection; set { if (value == Vector3.zero) return; _currentDirection = value; AnimationController.SetAnimationParameter("xDirection", _currentDirection.x); AnimationController.SetAnimationParameter("zDirection", _currentDirection.z); } } // Unity events #region Unity events protected override void Update() { base.Update(); HandleMovement(); FlipVisualLook(); } #endregion #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] protected override void InitializeComponents() { base.InitializeComponents(); SpriteRenderer = VisualLook.GetComponent(); Animator = VisualLook.GetComponent(); AnimationController = GetComponent(); } #endregion // Methods #region Methods protected override IEnumerator DissolveCoroutine(float start, float end, float dissolveTime) { if (!IsDissolveActive) { MaterialPropertyBlock.SetFloat(_dissolveValueHash, end); SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock); yield break; } MaterialPropertyBlock.SetFloat(_dissolveValueHash, start); SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock); var elapsedTime = 0f; while (elapsedTime <= dissolveTime) { var value = Mathf.Lerp(start, end, elapsedTime / dissolveTime); MaterialPropertyBlock.SetFloat(_dissolveValueHash, value); SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock); elapsedTime += Time.deltaTime; yield return null; } MaterialPropertyBlock.SetFloat(_dissolveValueHash, end); SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock); } private void FlipVisualLook() { var localScale = VisualLook.localScale; localScale.x = CurrentDirection.x switch { > 0.01f => Mathf.Abs(localScale.x), < -0.01f => -Mathf.Abs(localScale.x), _ => localScale.x }; VisualLook.localScale = localScale; } private void HandleMovement() { if (!AstarAi.canMove || AstarAi.isStopped) { IsMoving = false; return; } CurrentDirection = AstarAi.velocity.normalized; IsMoving = AstarAi.velocity != Vector3.zero || AstarAi.velocity != Vector3.positiveInfinity; } #endregion } }