diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index a20361d2..d1f98761 100644 --- a/Assets/JYY/Scenes/MonsterTest.unity +++ b/Assets/JYY/Scenes/MonsterTest.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02d552590e52618fe85e7e322810c4818ae3ce2769ca1cbc8b033b76502cbe68 -size 21370 +oid sha256:61f12068b6226afe0cda1ce4bcf16e88be342a6debc72f54e1ea5e28b943a4b0 +size 21372 diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index 364ff437..36aa772d 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -16,12 +16,12 @@ public class CasterDemonController : EnemyController [SerializeField] private Transform bulletShotPosition; [SerializeField] private GameObject magicMissilePrefab; [SerializeField] private GameObject teleportEffectPrefab; - [SerializeField] private float teleportDistance = 4f; // 플레이어 뒤로 떨어질 거리 + private float _teleportDistance = 4f; // 플레이어 뒤로 떨어질 거리 // 텔레포트 쿨타임 private float _teleportTimer = 0; - private const float TeleportThresholdTime = 3.5f; + private const float TeleportThresholdTime = 20f; private bool CanTeleport { get @@ -82,12 +82,16 @@ public class CasterDemonController : EnemyController SetSequence(ShotMagicMissile()); break; } + } - public override void OnCannotFleeBehaviour() + public override void OnCannotFleeBehaviour(Action action) { - if(CanTeleport) - SetSequence(Teleport()); + if (CanTeleport) + { + action(); + Teleport(); + } } private IEnumerator ShotMagicMissile() @@ -137,7 +141,7 @@ public class CasterDemonController : EnemyController return aimPosition; } - private IEnumerator Teleport() + private void Teleport() { Vector3 startPos = transform.position; if (teleportEffectPrefab != null) @@ -146,7 +150,7 @@ public class CasterDemonController : EnemyController // 플레이어 뒤쪽 위치 계산 Vector3 playerPos = TraceTargetTransform.position; Vector3 behindDir = -TraceTargetTransform.forward; - Vector3 targetPos = playerPos + behindDir.normalized * teleportDistance; + Vector3 targetPos = playerPos + behindDir.normalized * _teleportDistance; // NavMesh 유효 위치 확인 Vector3 finalPos = targetPos; @@ -155,15 +159,11 @@ public class CasterDemonController : EnemyController finalPos = hit.position; } - yield return new WaitForSeconds(0.3f); - // 텔레포트 실행 Agent.Warp(finalPos); if (teleportEffectPrefab != null) Instantiate(teleportEffectPrefab, finalPos, Quaternion.identity); - - yield return null; } private void SetSequence(IEnumerator newSequence) diff --git a/Assets/Scripts/Character/Enemy/EnemyController.cs b/Assets/Scripts/Character/Enemy/EnemyController.cs index 9883b5db..296a55e9 100644 --- a/Assets/Scripts/Character/Enemy/EnemyController.cs +++ b/Assets/Scripts/Character/Enemy/EnemyController.cs @@ -122,6 +122,10 @@ public abstract class EnemyController : CharacterBase { Debug.LogWarning("OnCannotFleeBehaviour가 구현되지 않음 : OnCannotFleeBehaviour() 오버라이드하여 구현하십시오."); } + public virtual void OnCannotFleeBehaviour(Action action) + { + Debug.LogWarning("OnCannotFleeBehaviour가 구현되지 않음 : OnCannotFleeBehaviour() 오버라이드하여 구현하십시오."); + } #endregion diff --git a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs index 4071dd81..bd43f134 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs @@ -1,5 +1,7 @@ -using UnityEngine; +using System; +using UnityEngine; using UnityEngine.AI; +using Random = UnityEngine.Random; public class EnemyStateFlee :IEnemyState { @@ -107,11 +109,9 @@ public class EnemyStateFlee :IEnemyState { if (_stuckCount >= 4) { - _enemyController.OnCannotFleeBehaviour(); - _stuckCount = 0; + _enemyController.OnCannotFleeBehaviour(() => { _stuckCount = 0;}); return; } - _stuckCount++; // 무작위 도망 지점 샘플링 시도 Vector3 randomDirection = Random.insideUnitSphere * (_fleeDistance * 2); randomDirection += _playerTransform.position; @@ -120,16 +120,10 @@ public class EnemyStateFlee :IEnemyState { // 샘플링에 성공했으면 일단 그 위치로 가 보도록 세팅 Debug.Log("## 일단 가봄"); + _stuckCount++; _enemyController.Agent.SetDestination(hit.position); // _enemyController.OnCannotFleeBehaviour(); } - - // else - // { - // // 대체 경로도 찾을 수 없는 경우 - // Debug.Log("## 대체 경로도 못찾음"); - // _enemyController.OnCannotFleeBehaviour(); - // } }