From 9699c0534a17386a8a6d09efeeca08571123e57c Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Wed, 8 May 2024 11:59:17 +0900 Subject: [PATCH] =?UTF-8?q?#255=20=EA=B1=B0=EB=8C=80=20=EC=8A=AC=EB=9D=BC?= =?UTF-8?q?=EC=9E=84=20=EC=9E=91=EC=97=852?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BlueWater/Assets/01.Scenes/02.Combat_2D.unity | 30 ++++----- .../Character/CombatPlayer2D/CombatHealth.cs | 13 ++-- .../Enemy/Type/FieldBoss/SlimeState.cs | 20 ++++-- .../Enemy/Type/FieldBoss/Type/TitanSlime.cs | 61 +++++++++++++------ 4 files changed, 79 insertions(+), 45 deletions(-) diff --git a/BlueWater/Assets/01.Scenes/02.Combat_2D.unity b/BlueWater/Assets/01.Scenes/02.Combat_2D.unity index ea8884631..75bd4e49f 100644 --- a/BlueWater/Assets/01.Scenes/02.Combat_2D.unity +++ b/BlueWater/Assets/01.Scenes/02.Combat_2D.unity @@ -9555,37 +9555,37 @@ MonoBehaviour: - k__BackingField: 1 k__BackingField: 10 k__BackingField: 100 - k__BackingField: 1 - k__BackingField: 4 - k__BackingField: {x: 1.5, y: 2} + k__BackingField: 1 + k__BackingField: 4 + k__BackingField: {x: 1.5, y: 2.5} k__BackingField: 1 - k__BackingField: 2 k__BackingField: 8 k__BackingField: 70 - k__BackingField: 1.25 - k__BackingField: 5 - k__BackingField: {x: 1.25, y: 1.75} + k__BackingField: 0.9 + k__BackingField: 5 + k__BackingField: {x: 1.25, y: 2.25} k__BackingField: 0 - k__BackingField: 3 k__BackingField: 6 k__BackingField: 50 - k__BackingField: 1.5 - k__BackingField: 6 - k__BackingField: {x: 1, y: 1.5} + k__BackingField: 0.8 + k__BackingField: 6 + k__BackingField: {x: 1, y: 2} k__BackingField: 0 - k__BackingField: 4 k__BackingField: 4 k__BackingField: 30 - k__BackingField: 1.75 - k__BackingField: 7 - k__BackingField: {x: 0.75, y: 1.25} + k__BackingField: 0.7 + k__BackingField: 7 + k__BackingField: {x: 0.75, y: 1.75} k__BackingField: 0 - k__BackingField: 5 k__BackingField: 2 k__BackingField: 10 - k__BackingField: 2 - k__BackingField: 8 - k__BackingField: {x: 0.5, y: 1} + k__BackingField: 0.6 + k__BackingField: 8 + k__BackingField: {x: 0.5, y: 1.5} k__BackingField: 0 --- !u!1 &1969962453 GameObject: diff --git a/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs b/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs index 55530ca6d..19a9e2d64 100644 --- a/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs +++ b/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatHealth.cs @@ -9,7 +9,6 @@ namespace BlueWaterProject // Components private SpriteRenderer spriteRenderer; private HeartHpUi heartHpUi; - private MaterialPropertyBlock propBlock; // Health [SerializeField] private int maxHp; @@ -35,8 +34,7 @@ namespace BlueWaterProject iDashable = GetComponent(); OnChangedCurrentHp += heartHpUi.SetCurrentHp; - - propBlock = new MaterialPropertyBlock(); + flashWhiteWaitTime = new WaitForSeconds(0.05f); SetCurrentHp(maxHp); } @@ -67,7 +65,7 @@ namespace BlueWaterProject return; } - if (changeHp <= 30f) + if (changeHp <= 2) { CameraManager.Inst.CombatCamera.LowHpVignette(); } @@ -99,12 +97,9 @@ namespace BlueWaterProject { for (var i = 0; i < 5; i++) { - spriteRenderer.GetPropertyBlock(propBlock); - propBlock.SetInt(IsHitHash, 1); - spriteRenderer.SetPropertyBlock(propBlock); + spriteRenderer.material.SetInt(IsHitHash, 1); yield return flashWhiteWaitTime; - propBlock.SetInt(IsHitHash, 0); - spriteRenderer.SetPropertyBlock(propBlock); + spriteRenderer.material.SetInt(IsHitHash, 0); yield return flashWhiteWaitTime; } } diff --git a/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/SlimeState.cs b/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/SlimeState.cs index 843d7c4e2..a331f0eef 100644 --- a/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/SlimeState.cs +++ b/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/SlimeState.cs @@ -10,19 +10,31 @@ namespace BlueWaterProject [field: SerializeField] public int Level { get; set; } [field: SerializeField] public float Size { get; set; } [field: SerializeField] public float MaxHp { get; set; } - [field: SerializeField] public float Speed { get; set; } - [field: SerializeField] public float Range { get; set; } + [field: SerializeField] public float AnimationLength { get; set; } + [field: SerializeField] public float ViewRange { get; set; } [field: SerializeField] public Vector2 RandomCooldown { get; set; } [field: SerializeField] public bool HasRabbit { get; set; } - public SlimeState(int level, float size, float maxHp, float speed, Vector2 randomCooldown, bool hasRabbit) + public SlimeState(int level, float size, float maxHp, float animationLength, float viewRange, Vector2 randomCooldown, bool hasRabbit) { Level = level; Size = size; MaxHp = maxHp; - Speed = speed; + AnimationLength = animationLength; RandomCooldown = randomCooldown; + ViewRange = viewRange; HasRabbit = hasRabbit; } + + public SlimeState(SlimeState slimeState, bool hasRabbit = default) + { + Level = slimeState.Level; + Size = slimeState.Size; + MaxHp = slimeState.MaxHp; + AnimationLength = slimeState.AnimationLength; + ViewRange = slimeState.ViewRange; + RandomCooldown = slimeState.RandomCooldown; + HasRabbit = hasRabbit == default ? slimeState.HasRabbit : hasRabbit; + } } } \ No newline at end of file diff --git a/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/Type/TitanSlime.cs b/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/Type/TitanSlime.cs index 5881f4aef..cf861c902 100644 --- a/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/Type/TitanSlime.cs +++ b/BlueWater/Assets/02.Scripts/Character/Enemy/Type/FieldBoss/Type/TitanSlime.cs @@ -46,6 +46,7 @@ namespace BlueWaterProject [field: Title("스탯")] [field: SerializeField] public string BossName { get; private set; } = "거대 슬라임"; [SerializeField] private SlimeState slimeState; + [SerializeField] private int attackDamage = 1; [SerializeField] private float currentHp; [SerializeField] private LayerMask targetLayer; [SerializeField] private LayerMask groundLayer; @@ -60,11 +61,12 @@ namespace BlueWaterProject private Dictionary animationParameterHashDictionary = new(); private Dictionary animationNameHashDictionary = new(); - private MaterialPropertyBlock propBlock; private WaitForSeconds flashWhiteWaitTime; private Coroutine flashWhiteCoroutine; private Coroutine jumpSlamCoroutine; - private Collider[] hitColliders; + [SerializeField] private Collider[] targetedColliders; + [SerializeField] private Collider[] hitColliders; + private float ColliderRadius => ((CapsuleCollider)col).radius * slimeState.Size; // Shader Hashes private static readonly int IsHitHash = Shader.PropertyToID("_IsHit"); @@ -77,8 +79,11 @@ namespace BlueWaterProject private static readonly int JumpSlamHash = Animator.StringToHash("JumpSlam"); // events - public delegate void ChangedCurrentHp(float currentHp); - public event ChangedCurrentHp OnChangedCurrentHp; + public delegate void ChangedCurrentHpEvent(float currentHp); + public event ChangedCurrentHpEvent OnChangedCurrentHp; + + public delegate void DieRabbitEvent(); + public event DieRabbitEvent OnDieRabbitEvent; #endregion @@ -96,8 +101,8 @@ namespace BlueWaterProject private void Start() { mapController = FindAnyObjectByType(); - propBlock = new MaterialPropertyBlock(); flashWhiteWaitTime = new WaitForSeconds(0.1f); + targetedColliders = new Collider[1]; hitColliders = new Collider[1]; StartMove(); @@ -106,6 +111,7 @@ namespace BlueWaterProject private void OnDestroy() { OnChangedCurrentHp -= UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider; + OnDieRabbitEvent -= mapController.AllDestroyInstantiateObject; } #endregion @@ -143,14 +149,18 @@ namespace BlueWaterProject public void Init(SlimeState state, bool hasRabbit) { - slimeState = state; - slimeState.HasRabbit = hasRabbit; + slimeState = new SlimeState(state, hasRabbit); SetCurrentHp(slimeState.MaxHp); transform.localScale = Vector3.one * slimeState.Size; if (slimeState.HasRabbit) { Anim.runtimeAnimatorController = slimeRabbitController; OnChangedCurrentHp += UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider; + + if (slimeState.Level != 5) return; + + mapController ??= FindAnyObjectByType(); + OnDieRabbitEvent += mapController.AllDestroyInstantiateObject; } else { @@ -189,6 +199,10 @@ namespace BlueWaterProject public void Die() { + if (slimeState.Level == 5) + { + OnDieRabbitEvent?.Invoke(); + } if (slimeState.Level <= 4) { mapController.SpawnSplitSlimes(transform.position, slimeState.Level + 1, slimeState.HasRabbit); @@ -308,13 +322,9 @@ namespace BlueWaterProject private IEnumerator FlashWhiteCoroutine() { - spriteRenderer.GetPropertyBlock(propBlock); - propBlock.SetInt(IsHitHash, 1); - spriteRenderer.SetPropertyBlock(propBlock); - yield return flashWhiteWaitTime; - propBlock.SetInt(IsHitHash, 0); - spriteRenderer.SetPropertyBlock(propBlock); + spriteRenderer.material.SetInt(IsHitHash, 1); yield return flashWhiteWaitTime; + spriteRenderer.material.SetInt(IsHitHash, 0); } private void StartMove() @@ -328,7 +338,7 @@ namespace BlueWaterProject var endPosition = CalculateRandomPosition(startPosition, 2f); var elapsedTime = 0f; - while (elapsedTime <= slimeState.Speed) + while (elapsedTime <= slimeState.AnimationLength) { elapsedTime += Time.deltaTime; transform.position = Vector3.Lerp(startPosition, endPosition, @@ -360,13 +370,13 @@ namespace BlueWaterProject yield break; } - iAnimationStateController.SetCurrentAnimationSpeed(slimeState.Speed); + iAnimationStateController.SetCurrentAnimationSpeed(slimeState.AnimationLength); var startPosition = transform.position; Vector3 endPosition; - var hitCount = Physics.OverlapSphereNonAlloc(startPosition, slimeState.Range, hitColliders, targetLayer); + var hitCount = Physics.OverlapSphereNonAlloc(startPosition, slimeState.ViewRange, targetedColliders, targetLayer); if (hitCount >= 1) { - endPosition = CalculateRandomPosition(hitColliders[0].transform.position, 1f); + endPosition = CalculateRandomPosition(targetedColliders[0].transform.position, 1f); } else { @@ -381,6 +391,8 @@ namespace BlueWaterProject yield return null; } + DoAttack(); + var randomCooldown = Random.Range(slimeState.RandomCooldown.x, slimeState.RandomCooldown.y); EndJumpSlam(randomCooldown); } @@ -418,6 +430,21 @@ namespace BlueWaterProject return false; } + private void DoAttack() + { + var attackPosition = transform.position; + var hitCount = Physics.OverlapSphereNonAlloc(attackPosition, ColliderRadius, hitColliders, targetLayer); + if (hitCount < 1) return; + + var targetToVector = hitColliders[0].transform.position - attackPosition; + targetToVector.y = 0f; + var targetDirection = targetToVector.normalized; + + var iDamageable = hitColliders[0].transform.GetComponent(); + iDamageable?.TakeDamage(attackDamage); + hitColliders[0].GetComponent().AddForce(targetDirection * 3f, ForceMode.Impulse); + } + #endregion } } \ No newline at end of file