diff --git a/Assets/01.Scenes/02.Combat.unity b/Assets/01.Scenes/02.Combat.unity index 0ea2aad17..ccc4d0d8d 100644 --- a/Assets/01.Scenes/02.Combat.unity +++ b/Assets/01.Scenes/02.Combat.unity @@ -4137,11 +4137,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -50 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.z @@ -6595,11 +6595,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 170 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 30 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.z @@ -10755,11 +10755,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 100 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 30 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.z @@ -11816,11 +11816,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -120 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.z @@ -15485,11 +15485,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 30 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 30 objectReference: {fileID: 0} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} propertyPath: m_LocalPosition.z @@ -18564,11 +18564,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 20 objectReference: {fileID: 0} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} propertyPath: m_LocalPosition.z diff --git a/Assets/02.Scripts/Character/Enemy/Boss/AnimatorBoss.cs b/Assets/02.Scripts/Character/Enemy/Boss/AnimatorBoss.cs index c50d6662f..ff62a65d0 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/AnimatorBoss.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/AnimatorBoss.cs @@ -1,4 +1,5 @@ -using BlueWater.Interfaces; +using System.Collections; +using BlueWater.Interfaces; using Sirenix.OdinInspector; using UnityEngine; @@ -78,6 +79,32 @@ namespace BlueWater.Enemies.Bosses // 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() { diff --git a/Assets/02.Scripts/Character/Enemy/Boss/Boss.cs b/Assets/02.Scripts/Character/Enemy/Boss/Boss.cs index 846e9beab..401e65b2c 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/Boss.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/Boss.cs @@ -1,8 +1,10 @@ -using BehaviorDesigner.Runtime; +using System.Collections; +using BehaviorDesigner.Runtime; using BlueWater.Interfaces; using Pathfinding; using Sirenix.OdinInspector; using UnityEngine; +using UnityEngine.Serialization; namespace BlueWater.Enemies.Bosses { @@ -76,6 +78,19 @@ namespace BlueWater.Enemies.Bosses public IAstarAI AstarAi; protected MaterialPropertyBlock MaterialPropertyBlock; + + [Title("디졸브 스폰 효과")] + [SerializeField] + protected bool IsDissolveActive = true; + + [SerializeField] + protected float SpawnDissolveTime = 2f; + + [SerializeField] + protected float DieDissolveTime = 1f; + + // Hashes + protected static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue"); #endregion @@ -150,6 +165,7 @@ namespace BlueWater.Enemies.Bosses // Abstract methods public virtual void Initialize() { } + protected abstract IEnumerator DissolveCoroutine(float start, float end, float dissolveTime); protected abstract void Die(); diff --git a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/BoomBarrel.cs b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/BoomBarrel.cs index ca5aa63d4..db1d7bc32 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/BoomBarrel.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/BoomBarrel.cs @@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel public BoomBarrelData BoomBarrelData { 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 @@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel 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); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); BehaviorTree.EnableBehavior(); HitBoxCollider.enabled = true; @@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel //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); + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/GhostBarrel.cs b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/GhostBarrel.cs index 666005afe..708b0351a 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/GhostBarrel.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/GhostBarrel.cs @@ -32,16 +32,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel public GhostBarrelData GhostBarrelData { 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 @@ -85,21 +75,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel SpineController.PlayAnimation(BoomBarrelAnimation.In.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); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); BehaviorTree.EnableBehavior(); HitBoxCollider.enabled = true; @@ -135,19 +111,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel //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); + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/LavaBarrel.cs b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/LavaBarrel.cs index a4235d3c5..9a8ee2f42 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/LavaBarrel.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/LavaBarrel.cs @@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel public LavaBarrelData LavaBarrelData { 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 @@ -79,25 +69,9 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel 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); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); BehaviorTree.EnableBehavior(); HitBoxCollider.enabled = true; @@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel //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); + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/SwordBarrel.cs b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/SwordBarrel.cs index 687e54a0e..5f8569dfb 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/SwordBarrel.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/GhostBarrel/SwordBarrel.cs @@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel 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 @@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel 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); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); BehaviorTree.EnableBehavior(); HitBoxCollider.enabled = true; @@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel //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); + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/Rhinoceros/Rhinoceros.cs b/Assets/02.Scripts/Character/Enemy/Boss/Rhinoceros/Rhinoceros.cs index ab8ca8a7f..599c06f20 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/Rhinoceros/Rhinoceros.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/Rhinoceros/Rhinoceros.cs @@ -1,4 +1,5 @@ -using BlueWater.Items; +using System.Collections; +using BlueWater.Items; using BlueWater.Maps; using Sirenix.OdinInspector; using UnityEngine; @@ -36,23 +37,37 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros RhinocerosData = BossData as RhinocerosData; BossMapController = MapManager.Instance.RhinocerosMapController; } - + public override void Initialize() + { + StartCoroutine(InitializeCoroutine()); + } + + private IEnumerator InitializeCoroutine() { BossHealthPoint.Initialize(true, RhinocerosData.MaxHealthPoint, RhinocerosData.DisplayName, BossMapController.ParticleInstanceLocation); BossSkillController.Initialize(BossData.SkillDataList); SetMoveSpeed(RhinocerosData.MoveSpeed); StopMove(); + + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); + BehaviorTree.EnableBehavior(); + HitBoxCollider.enabled = true; } #endregion // Methods #region Methods + + protected override void Die() + { + StartCoroutine(DieCoroutine()); + } - protected override async void Die() + private IEnumerator DieCoroutine() { BossSkillController.StopAllCoroutine(); BehaviorTree.DisableBehavior(); @@ -67,10 +82,10 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros AnimationController.SetAnimationTrigger("isDead"); BossMapController.ClearMap(gameObject); - while (AnimationController.GetCurrentAnimationNormalizedTime() <= 1f) - { - await Awaitable.NextFrameAsync(); - } + + yield return new WaitUntil(() => AnimationController.GetCurrentAnimationNormalizedTime() >= 1f); + + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position); Destroy(gameObject); diff --git a/Assets/02.Scripts/Character/Enemy/Boss/SandMole/MiniSandMole.cs b/Assets/02.Scripts/Character/Enemy/Boss/SandMole/MiniSandMole.cs index a538a50fe..f896a39d0 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/SandMole/MiniSandMole.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/SandMole/MiniSandMole.cs @@ -7,20 +7,6 @@ namespace BlueWater.Enemies.Bosses.SandMole { public class MiniSandMole : SandMole { - // Variables - #region Variables - [Title("효과")] - [SerializeField] - private float _spawnDissolveTime = 2f; - - //[SerializeField] - //private float _dieDissolveTime = 1f; - - // Hashes - private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue"); - - #endregion - // Initialize methods #region Initialize methods @@ -28,11 +14,6 @@ namespace BlueWater.Enemies.Bosses.SandMole { StartCoroutine(InitializeCoroutine()); } - - #endregion - - // Methods - #region Methods private IEnumerator InitializeCoroutine() { @@ -43,21 +24,7 @@ namespace BlueWater.Enemies.Bosses.SandMole SetMoveSpeed(SandMoleData.MoveSpeed); StopMove(); - 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); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); SpineController.SetSkin(SandMoleSkin.Normal.ToString()); var isRoar = false; @@ -79,7 +46,17 @@ namespace BlueWater.Enemies.Bosses.SandMole HitBoxCollider.enabled = true; } - protected override async void Die() + #endregion + + // Methods + #region Methods + + protected override void Die() + { + StartCoroutine(DieCoroutine()); + } + + private IEnumerator DieCoroutine() { BossSkillController.StopAllCoroutine(); SandMoleStatus.StopAllCoroutine(); @@ -95,8 +72,11 @@ namespace BlueWater.Enemies.Bosses.SandMole SpineController.SetSkin(SandMoleSkin.Idle.ToString()); var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false); + + yield return new WaitUntil(() => dieTrack.IsComplete); + + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); - await SpineController.WaitForAnimationCompletion(dieTrack); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/SandMole/SandMole.cs b/Assets/02.Scripts/Character/Enemy/Boss/SandMole/SandMole.cs index 67be455fc..640a52f6f 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/SandMole/SandMole.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/SandMole/SandMole.cs @@ -98,12 +98,7 @@ namespace BlueWater.Enemies.Bosses.SandMole { StartCoroutine(InitializeCoroutine()); } - - #endregion - - // Methods - #region Methods - + private IEnumerator InitializeCoroutine() { HitBoxCollider.enabled = false; @@ -114,6 +109,8 @@ namespace BlueWater.Enemies.Bosses.SandMole SetMoveSpeed(SandMoleData.MoveSpeed); StopMove(); + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); + SpineController.SetSkin(SandMoleSkin.Normal.ToString()); var isCameraShakeActive = false; var roarTrack = SpineController.PlayAnimation(SandMoleAnimation.Roar.ToString(), false); @@ -135,7 +132,17 @@ namespace BlueWater.Enemies.Bosses.SandMole HitBoxCollider.enabled = true; } - protected override async void Die() + #endregion + + // Methods + #region Methods + + protected override void Die() + { + StartCoroutine(DieCoroutine()); + } + + private IEnumerator DieCoroutine() { BossSkillController.StopAllCoroutine(); SandMoleStatus.StopAllCoroutine(); @@ -152,8 +159,11 @@ namespace BlueWater.Enemies.Bosses.SandMole SpineController.SetSkin(SandMoleSkin.Idle.ToString()); var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false); SandMoleMapController.ClearMap(gameObject); + + yield return new WaitUntil(() => dieTrack.IsComplete); + + yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime)); - await SpineController.WaitForAnimationCompletion(dieTrack); ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position); Destroy(gameObject); } diff --git a/Assets/02.Scripts/Character/Enemy/Boss/SpineBoss.cs b/Assets/02.Scripts/Character/Enemy/Boss/SpineBoss.cs index 276943e5a..a96767052 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/SpineBoss.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/SpineBoss.cs @@ -1,4 +1,5 @@ -using BlueWater.Interfaces; +using System.Collections; +using BlueWater.Interfaces; using BlueWater.Players; using Sirenix.OdinInspector; using UnityEngine; @@ -64,6 +65,32 @@ namespace BlueWater.Enemies.Bosses // Methods #region Methods + + protected override IEnumerator DissolveCoroutine(float start, float end, float dissolveTime) + { + if (!IsDissolveActive) + { + MaterialPropertyBlock.SetFloat(_dissolveValueHash, end); + MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); + yield break; + } + + MaterialPropertyBlock.SetFloat(_dissolveValueHash, start); + MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); + + var elapsedTime = 0f; + while (elapsedTime <= dissolveTime) + { + var value = Mathf.Lerp(start, end, elapsedTime / dissolveTime); + MaterialPropertyBlock.SetFloat(_dissolveValueHash, value); + MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); + elapsedTime += Time.deltaTime; + yield return null; + } + + MaterialPropertyBlock.SetFloat(_dissolveValueHash, end); + MeshRenderer.SetPropertyBlock(MaterialPropertyBlock); + } protected virtual void FlipVisualLook() { diff --git a/Assets/02.Scripts/Character/Enemy/Boss/TitanSlime/TitanSlime.cs b/Assets/02.Scripts/Character/Enemy/Boss/TitanSlime/TitanSlime.cs index 544363542..459575e62 100644 --- a/Assets/02.Scripts/Character/Enemy/Boss/TitanSlime/TitanSlime.cs +++ b/Assets/02.Scripts/Character/Enemy/Boss/TitanSlime/TitanSlime.cs @@ -1,3 +1,4 @@ +using System.Collections; using BlueWater.Items; using BlueWater.Maps; using Sirenix.OdinInspector; @@ -40,18 +41,31 @@ namespace BlueWater.Enemies.Bosses.TitanSlime public void Initialize(int level, bool hasRabbit) { + StartCoroutine(InitializeCoroutine(level, hasRabbit)); + } + + private IEnumerator InitializeCoroutine(int level, bool hasRabbit) + { + HitBoxCollider.enabled = false; + _rabbit.enabled = false; var titanSlimeState = TitanSlimeData.TitanSlimeState.Find(list => list.Level == level); TitanSlimeState = new TitanSlimeState(titanSlimeState, hasRabbit); transform.localScale = Vector3.one * TitanSlimeState.Size; - _rabbit.enabled = TitanSlimeState.HasRabbit; MinCoolDown = TitanSlimeState.RandomCooldown.x; MaxCoolDown = TitanSlimeState.RandomCooldown.y; BossHealthPoint.Initialize(TitanSlimeState.HasRabbit, TitanSlimeState.MaxHp, TitanSlimeData.DisplayName, _titanSlimeMapController.ParticleInstanceLocation); BossSkillController.Initialize(BossData.SkillDataList); + + if (TitanSlimeState.HasRabbit && titanSlimeState.Level == 1) + { + yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime)); + } + _rabbit.enabled = TitanSlimeState.HasRabbit; BehaviorTree.EnableBehavior(); + HitBoxCollider.enabled = true; } #endregion