using System.Collections; using BehaviorDesigner.Runtime; using BlueWater.Interfaces; using BlueWater.Maps; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Serialization; namespace BlueWater.Enemies.Bosses.SandMole { public class MiniSandMole : MonoBehaviour, ITarget, ICurrentDirection { // Variables #region Variables // Components [field: SerializeField] public Rigidbody Rigidbody { get; private set; } [field: SerializeField] public CapsuleCollider CharacterCollider { get; private set; } [field: SerializeField] public BehaviorTree BehaviorTree { get; private set; } [field: SerializeField] public Transform VisualLook { get; private set; } [field: SerializeField] public SpriteRenderer SpriteRenderer { get; private set; } [field: SerializeField] public Animator Animator { get; private set; } [field: SerializeField] public BoxCollider HitBoxCollider { get; private set; } // Classes [field: SerializeField, Required] public BossData BossData { get; private set; } [field: SerializeField, Required] public AnimationController AnimationController { get; private set; } [field: SerializeField, Required] public BossHealthPoint BossHealthPoint { get; private set; } [field: SerializeField, Required] public BossSkillController BossSkillController { get; private set; } [field: SerializeField, Required] public SandMoleStatus SandMoleStatus { get; private set; } [field: SerializeField] public Collider Target { get; private set; } [Title("효과")] [SerializeField] private float _spawnDissolveTime = 2f; [SerializeField] private float _dieDissolveTime = 1f; public BossMapController BossMapController { 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); } } // Hashes private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue"); #endregion // Unity events #region Unity events private void Awake() { InitializeComponents(); } private void Update() { FlipVisualLook(); } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] private void InitializeComponents() { Rigidbody = GetComponent(); CharacterCollider = GetComponent(); BehaviorTree = GetComponent(); VisualLook = transform.Find("VisualLook"); SpriteRenderer = VisualLook.GetComponent(); Animator = VisualLook.GetComponent(); HitBoxCollider = transform.Find("HitBox").GetComponent(); AnimationController = GetComponent(); BossHealthPoint = GetComponent(); BossSkillController = GetComponent(); SandMoleStatus = GetComponent(); BossMapController = MapManager.Instance.SandMoleMapController; } public void Initialize() { StartCoroutine(InitializeEffectCoroutine()); } private IEnumerator InitializeEffectCoroutine() { Target = GameManager.Instance.CurrentCombatPlayer.GetComponent(); BossHealthPoint.Initialize(false, BossData.MaxHealthPoint, BossData.DisplayName, BossMapController.ParticleInstanceLocation); BossHealthPoint.OnDead += HandleDie; BossSkillController.Initialize(BossData.SkillDataList); SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f); var elapsedTime = 0f; while (elapsedTime <= _spawnDissolveTime) { var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime); SpriteRenderer.material.SetFloat(_dissolveValueHash, value); elapsedTime += Time.deltaTime; yield return null; } SpriteRenderer.material.SetFloat(_dissolveValueHash, 1f); BehaviorTree.EnableBehavior(); } #endregion // Methods #region Methods private void HandleDie() { StartCoroutine(DieCoroutine()); } private IEnumerator DieCoroutine() { if (Rigidbody) { Rigidbody.isKinematic = true; } AnimationController.SetAnimationTrigger("isDead"); SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f); var elapsedTime = 0f; while (elapsedTime <= _dieDissolveTime) { var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime); SpriteRenderer.material.SetFloat(_dissolveValueHash, value); elapsedTime += Time.deltaTime; yield return null; } SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f); Destroy(gameObject); } 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; } #endregion } }