using System.Collections; using BlueWater.Maps; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Enemies.Bosses.GhostBarrel { public enum SwordBarrelSkill { None = 0, } public enum SwordBarrelSkin { } public enum SwordBarrelAnimation { None = 0, Empty, Idle, In, Out } public class SwordBarrel : SpineBoss { // Variables #region Variables public SwordBarrelData SwordBarrelData { get; private set; } public GhostBarrelMapController GhostBarrelMapController { get; private set; } [Title("효과")] [SerializeField] private float _spawnDissolveTime = 2f; [SerializeField] private float _dieDissolveTime = 1f; // Hashes private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue"); #endregion // Unity events #region Unity events protected override void OnDestroy() { base.OnDestroy(); //BossHealthPoint.OnHealthChanged -= SummonMiniSandMole; } #endregion // Initialize methods #region Initialize methods protected override void InitializeComponents() { base.InitializeComponents(); SwordBarrelData = BossData as SwordBarrelData; GhostBarrelMapController = MapManager.Instance.GhostBarrelMapController; } public override void Initialize() { StartCoroutine(InitializeCoroutine()); } private IEnumerator InitializeCoroutine() { HitBoxCollider.enabled = false; BossHealthPoint.Initialize(true, BossData.MaxHealthPoint, BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation); BossSkillController.Initialize(BossData.SkillDataList); yield return null; SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false); MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); var elapsedTime = 0f; while (elapsedTime <= _spawnDissolveTime) { if (CurrentHealthPoint == 0) yield break; var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime); MaterialPropertyBlock.SetFloat(_dissolveValueHash, value); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); elapsedTime += Time.deltaTime; yield return null; } MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); BehaviorTree.EnableBehavior(); HitBoxCollider.enabled = true; } #endregion // Methods #region Methods protected override void Die() { StartCoroutine(DieCoroutine()); } private IEnumerator DieCoroutine() { BossSkillController.StopAllCoroutine(); BehaviorTree.DisableBehavior(); HitBoxCollider.enabled = false; if (Rigidbody) { Rigidbody.linearVelocity = Vector3.zero; Rigidbody.isKinematic = true; } // TODO : 죽는 애니메이션 추가 //SpineController.SetSkin(SandMoleSkin.Idle.ToString()); //var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false); //await SpineController.WaitForAnimationCompletion(dieTrack); MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); var elapsedTime = 0f; while (elapsedTime <= _dieDissolveTime) { var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime); MaterialPropertyBlock.SetFloat(_dissolveValueHash, value); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); elapsedTime += Time.deltaTime; yield return null; } MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); Destroy(gameObject); } #endregion } }