디졸브 로직 변경, 보스별로 디졸브 효과 추가

This commit is contained in:
Nam Tae Gun 2024-06-29 18:37:45 +09:00
parent 9600505116
commit da427f4ca3
12 changed files with 164 additions and 225 deletions

View File

@ -4137,11 +4137,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: -200
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: -50
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -6595,11 +6595,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: 170
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: 30
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -10755,11 +10755,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: 100
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: 30
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -11816,11 +11816,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: -200
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: -120
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -15485,11 +15485,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: 30
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: 30
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3} - target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -18564,11 +18564,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 0 value: -200
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 0 value: 20
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3} - target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z

View File

@ -1,4 +1,5 @@
using BlueWater.Interfaces; using System.Collections;
using BlueWater.Interfaces;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
@ -78,6 +79,32 @@ namespace BlueWater.Enemies.Bosses
// Methods // Methods
#region 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() private void FlipVisualLook()
{ {

View File

@ -1,8 +1,10 @@
using BehaviorDesigner.Runtime; using System.Collections;
using BehaviorDesigner.Runtime;
using BlueWater.Interfaces; using BlueWater.Interfaces;
using Pathfinding; using Pathfinding;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
namespace BlueWater.Enemies.Bosses namespace BlueWater.Enemies.Bosses
{ {
@ -76,6 +78,19 @@ namespace BlueWater.Enemies.Bosses
public IAstarAI AstarAi; public IAstarAI AstarAi;
protected MaterialPropertyBlock MaterialPropertyBlock; 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 #endregion
@ -150,6 +165,7 @@ namespace BlueWater.Enemies.Bosses
// Abstract methods // Abstract methods
public virtual void Initialize() { } public virtual void Initialize() { }
protected abstract IEnumerator DissolveCoroutine(float start, float end, float dissolveTime);
protected abstract void Die(); protected abstract void Die();

View File

@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
public BoomBarrelData BoomBarrelData { get; private set; } public BoomBarrelData BoomBarrelData { get; private set; }
public GhostBarrelMapController GhostBarrelMapController { 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 #endregion
@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint, BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation); BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
BossSkillController.Initialize(BossData.SkillDataList); BossSkillController.Initialize(BossData.SkillDataList);
yield return null;
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false); SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
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(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
//await SpineController.WaitForAnimationCompletion(dieTrack); //await SpineController.WaitForAnimationCompletion(dieTrack);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
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); Destroy(gameObject);
} }

View File

@ -32,16 +32,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
public GhostBarrelData GhostBarrelData { get; private set; } public GhostBarrelData GhostBarrelData { get; private set; }
public GhostBarrelMapController GhostBarrelMapController { 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 #endregion
@ -85,21 +75,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
SpineController.PlayAnimation(BoomBarrelAnimation.In.ToString(), false); SpineController.PlayAnimation(BoomBarrelAnimation.In.ToString(), false);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
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(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
@ -135,19 +111,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
//await SpineController.WaitForAnimationCompletion(dieTrack); //await SpineController.WaitForAnimationCompletion(dieTrack);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
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); Destroy(gameObject);
} }

View File

@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
public LavaBarrelData LavaBarrelData { get; private set; } public LavaBarrelData LavaBarrelData { get; private set; }
public GhostBarrelMapController GhostBarrelMapController { 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 #endregion
@ -79,25 +69,9 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation); BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
BossSkillController.Initialize(BossData.SkillDataList); BossSkillController.Initialize(BossData.SkillDataList);
yield return null;
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false); SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
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(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
//await SpineController.WaitForAnimationCompletion(dieTrack); //await SpineController.WaitForAnimationCompletion(dieTrack);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
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); Destroy(gameObject);
} }

View File

@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
public SwordBarrelData SwordBarrelData { get; private set; } public SwordBarrelData SwordBarrelData { get; private set; }
public GhostBarrelMapController GhostBarrelMapController { 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 #endregion
@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint, BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation); BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
BossSkillController.Initialize(BossData.SkillDataList); BossSkillController.Initialize(BossData.SkillDataList);
yield return null;
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false); SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
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(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
//await SpineController.WaitForAnimationCompletion(dieTrack); //await SpineController.WaitForAnimationCompletion(dieTrack);
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f); yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
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); Destroy(gameObject);
} }

View File

@ -1,4 +1,5 @@
using BlueWater.Items; using System.Collections;
using BlueWater.Items;
using BlueWater.Maps; using BlueWater.Maps;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
@ -36,23 +37,37 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros
RhinocerosData = BossData as RhinocerosData; RhinocerosData = BossData as RhinocerosData;
BossMapController = MapManager.Instance.RhinocerosMapController; BossMapController = MapManager.Instance.RhinocerosMapController;
} }
public override void Initialize() public override void Initialize()
{
StartCoroutine(InitializeCoroutine());
}
private IEnumerator InitializeCoroutine()
{ {
BossHealthPoint.Initialize(true, RhinocerosData.MaxHealthPoint, BossHealthPoint.Initialize(true, RhinocerosData.MaxHealthPoint,
RhinocerosData.DisplayName, BossMapController.ParticleInstanceLocation); RhinocerosData.DisplayName, BossMapController.ParticleInstanceLocation);
BossSkillController.Initialize(BossData.SkillDataList); BossSkillController.Initialize(BossData.SkillDataList);
SetMoveSpeed(RhinocerosData.MoveSpeed); SetMoveSpeed(RhinocerosData.MoveSpeed);
StopMove(); StopMove();
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
BehaviorTree.EnableBehavior(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true;
} }
#endregion #endregion
// Methods // Methods
#region Methods #region Methods
protected override void Die()
{
StartCoroutine(DieCoroutine());
}
protected override async void Die() private IEnumerator DieCoroutine()
{ {
BossSkillController.StopAllCoroutine(); BossSkillController.StopAllCoroutine();
BehaviorTree.DisableBehavior(); BehaviorTree.DisableBehavior();
@ -67,10 +82,10 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros
AnimationController.SetAnimationTrigger("isDead"); AnimationController.SetAnimationTrigger("isDead");
BossMapController.ClearMap(gameObject); BossMapController.ClearMap(gameObject);
while (AnimationController.GetCurrentAnimationNormalizedTime() <= 1f)
{ yield return new WaitUntil(() => AnimationController.GetCurrentAnimationNormalizedTime() >= 1f);
await Awaitable.NextFrameAsync();
} yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position); ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
Destroy(gameObject); Destroy(gameObject);

View File

@ -7,20 +7,6 @@ namespace BlueWater.Enemies.Bosses.SandMole
{ {
public class MiniSandMole : 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 // Initialize methods
#region Initialize methods #region Initialize methods
@ -28,11 +14,6 @@ namespace BlueWater.Enemies.Bosses.SandMole
{ {
StartCoroutine(InitializeCoroutine()); StartCoroutine(InitializeCoroutine());
} }
#endregion
// Methods
#region Methods
private IEnumerator InitializeCoroutine() private IEnumerator InitializeCoroutine()
{ {
@ -43,21 +24,7 @@ namespace BlueWater.Enemies.Bosses.SandMole
SetMoveSpeed(SandMoleData.MoveSpeed); SetMoveSpeed(SandMoleData.MoveSpeed);
StopMove(); StopMove();
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f); yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
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);
SpineController.SetSkin(SandMoleSkin.Normal.ToString()); SpineController.SetSkin(SandMoleSkin.Normal.ToString());
var isRoar = false; var isRoar = false;
@ -79,7 +46,17 @@ namespace BlueWater.Enemies.Bosses.SandMole
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
} }
protected override async void Die() #endregion
// Methods
#region Methods
protected override void Die()
{
StartCoroutine(DieCoroutine());
}
private IEnumerator DieCoroutine()
{ {
BossSkillController.StopAllCoroutine(); BossSkillController.StopAllCoroutine();
SandMoleStatus.StopAllCoroutine(); SandMoleStatus.StopAllCoroutine();
@ -95,8 +72,11 @@ namespace BlueWater.Enemies.Bosses.SandMole
SpineController.SetSkin(SandMoleSkin.Idle.ToString()); SpineController.SetSkin(SandMoleSkin.Idle.ToString());
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false); 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); Destroy(gameObject);
} }

View File

@ -98,12 +98,7 @@ namespace BlueWater.Enemies.Bosses.SandMole
{ {
StartCoroutine(InitializeCoroutine()); StartCoroutine(InitializeCoroutine());
} }
#endregion
// Methods
#region Methods
private IEnumerator InitializeCoroutine() private IEnumerator InitializeCoroutine()
{ {
HitBoxCollider.enabled = false; HitBoxCollider.enabled = false;
@ -114,6 +109,8 @@ namespace BlueWater.Enemies.Bosses.SandMole
SetMoveSpeed(SandMoleData.MoveSpeed); SetMoveSpeed(SandMoleData.MoveSpeed);
StopMove(); StopMove();
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
SpineController.SetSkin(SandMoleSkin.Normal.ToString()); SpineController.SetSkin(SandMoleSkin.Normal.ToString());
var isCameraShakeActive = false; var isCameraShakeActive = false;
var roarTrack = SpineController.PlayAnimation(SandMoleAnimation.Roar.ToString(), false); var roarTrack = SpineController.PlayAnimation(SandMoleAnimation.Roar.ToString(), false);
@ -135,7 +132,17 @@ namespace BlueWater.Enemies.Bosses.SandMole
HitBoxCollider.enabled = true; HitBoxCollider.enabled = true;
} }
protected override async void Die() #endregion
// Methods
#region Methods
protected override void Die()
{
StartCoroutine(DieCoroutine());
}
private IEnumerator DieCoroutine()
{ {
BossSkillController.StopAllCoroutine(); BossSkillController.StopAllCoroutine();
SandMoleStatus.StopAllCoroutine(); SandMoleStatus.StopAllCoroutine();
@ -152,8 +159,11 @@ namespace BlueWater.Enemies.Bosses.SandMole
SpineController.SetSkin(SandMoleSkin.Idle.ToString()); SpineController.SetSkin(SandMoleSkin.Idle.ToString());
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false); var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false);
SandMoleMapController.ClearMap(gameObject); 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); ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
Destroy(gameObject); Destroy(gameObject);
} }

View File

@ -1,4 +1,5 @@
using BlueWater.Interfaces; using System.Collections;
using BlueWater.Interfaces;
using BlueWater.Players; using BlueWater.Players;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
@ -64,6 +65,32 @@ namespace BlueWater.Enemies.Bosses
// Methods // Methods
#region 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() protected virtual void FlipVisualLook()
{ {

View File

@ -1,3 +1,4 @@
using System.Collections;
using BlueWater.Items; using BlueWater.Items;
using BlueWater.Maps; using BlueWater.Maps;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
@ -40,18 +41,31 @@ namespace BlueWater.Enemies.Bosses.TitanSlime
public void Initialize(int level, bool hasRabbit) 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); var titanSlimeState = TitanSlimeData.TitanSlimeState.Find(list => list.Level == level);
TitanSlimeState = new TitanSlimeState(titanSlimeState, hasRabbit); TitanSlimeState = new TitanSlimeState(titanSlimeState, hasRabbit);
transform.localScale = Vector3.one * TitanSlimeState.Size; transform.localScale = Vector3.one * TitanSlimeState.Size;
_rabbit.enabled = TitanSlimeState.HasRabbit;
MinCoolDown = TitanSlimeState.RandomCooldown.x; MinCoolDown = TitanSlimeState.RandomCooldown.x;
MaxCoolDown = TitanSlimeState.RandomCooldown.y; MaxCoolDown = TitanSlimeState.RandomCooldown.y;
BossHealthPoint.Initialize(TitanSlimeState.HasRabbit, TitanSlimeState.MaxHp, BossHealthPoint.Initialize(TitanSlimeState.HasRabbit, TitanSlimeState.MaxHp,
TitanSlimeData.DisplayName, _titanSlimeMapController.ParticleInstanceLocation); TitanSlimeData.DisplayName, _titanSlimeMapController.ParticleInstanceLocation);
BossSkillController.Initialize(BossData.SkillDataList); BossSkillController.Initialize(BossData.SkillDataList);
if (TitanSlimeState.HasRabbit && titanSlimeState.Level == 1)
{
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
}
_rabbit.enabled = TitanSlimeState.HasRabbit;
BehaviorTree.EnableBehavior(); BehaviorTree.EnableBehavior();
HitBoxCollider.enabled = true;
} }
#endregion #endregion