From 99082eeb7cea85f75ec5637ba8fd40085deda8ff Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 09:26:09 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[feat]=20=EB=A7=88=EB=B2=95=EC=82=AC=20?= =?UTF-8?q?=EB=AA=AC=EC=8A=A4=ED=84=B0=EC=9D=98=20=EB=8F=84=EB=A7=9D=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 경로 탐색 주기를 설정해 성능 향상 - 상태 진입과 이탈시 초기화처리 - 버그 수정 : 플레이어와 거리를 체크하고 전투 시작 - 경로 탐색 성능 향상 - 배틀 시퀸스 프레임 작성 work in #DEG-100 --- .../Character/Enemy/CasterDemonController.cs | 15 ++++- .../Enemy/EnemyState/Caster/EnemyStateFlee.cs | 60 ++++++++++++------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index ad492597..af724400 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -4,11 +4,22 @@ using UnityEngine; public class CasterDemonController : EnemyController { + private bool _doneBattleSequence = true; public override void BattleSequence() { - // TODO : 배틀 중일 때 루프 - Debug.Log("## 몬스터의 교전 행동 루프"); + // 전투 행동이 이미 진행 중일 경우 실행 막기 + if (_doneBattleSequence) + { + // 전투 행동 시작 + _doneBattleSequence = false; + + // TODO : 배틀 중일 때 루프 + Debug.Log("## 몬스터의 교전 행동 루프"); + + // 전투 행동이 끝남 + _doneBattleSequence = true; + } } diff --git a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs index 9445ab69..95bf28e1 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs @@ -6,7 +6,11 @@ public class EnemyStateFlee :IEnemyState private EnemyController _enemyController; private Transform _playerTransform; private float _fleeDistance = 5f; // 도망치는 거리 - private float _attackRange = 7f; // 공격 범위 + private float _safeRange = 7f; // 공격 범위 + + // 경로 탐색 주기 조절용 + private float _fleeSearchTimer = 0; + private float _fleeThresholdTime = 0.2f; // 막다른길 검사용 private Vector3 _lastPosition; @@ -21,9 +25,11 @@ public class EnemyStateFlee :IEnemyState _playerTransform = _enemyController.TraceTargetTransform; _lastPosition = _enemyController.transform.position; + + _enemyController.Agent.ResetPath(); + _enemyController.Agent.isStopped = false; _stuckTimer = 0f; - - + _fleeSearchTimer = 0; } public void Update() @@ -34,8 +40,28 @@ public class EnemyStateFlee :IEnemyState return; } + float currentDist = Vector3.Distance( + _enemyController.transform.position, + _playerTransform.position + ); + if (currentDist >= _safeRange) + { + // 목적지 리셋 후 전투 시작 + _enemyController.Agent.isStopped = true; + _enemyController.Agent.ResetPath(); + _enemyController.BattleSequence(); + return; + } + FindPositionFlee(); + if (!_enemyController.Agent.pathPending && + _enemyController.Agent.pathStatus == NavMeshPathStatus.PathInvalid) + { + // 막다른 길임 : 대체 행동 실행 + HandleDeadEnd(); + } + // 막힘 감지 (실제 이동 체크) CheckPath(); @@ -44,45 +70,37 @@ public class EnemyStateFlee :IEnemyState private void CheckPath() { - float distance = Vector3.Distance(_enemyController.transform.position, _playerTransform.position); - if (distance < StuckMoveThreshold) + float moved = Vector3.Distance(_enemyController.transform.position, _lastPosition); + if (moved < StuckMoveThreshold) { _stuckTimer += Time.deltaTime; if (_stuckTimer >= StuckThresholdTime) { - // 막다른 길임 : 대체 행동 실행 HandleDeadEnd(); _stuckTimer = 0f; } } else { - // 정상적인 길: 배틀 루프 실행 - _enemyController.BattleSequence(); _stuckTimer = 0f; } } private void FindPositionFlee() { + _fleeSearchTimer += Time.deltaTime; + if (_fleeSearchTimer <= _fleeThresholdTime) return; + // 1) 목표 도망 위치 계산 Vector3 fleeDirection = (_enemyController.transform.position - _playerTransform.position).normalized; Vector3 fleeTarget = _enemyController.transform.position + fleeDirection * _fleeDistance; // 2) 경로 계산해 보기 - NavMeshPath path = new NavMeshPath(); - _enemyController.Agent.CalculatePath(fleeTarget, path); + _enemyController.Agent.SetDestination(fleeTarget); - if (path.status == NavMeshPathStatus.PathComplete) - { - // 제대로 도망갈 수 있으면 목적지 설정 - _enemyController.Agent.SetDestination(fleeTarget); - } - else - { - // 막다른 길임 : 대체 행동 실행 - HandleDeadEnd(); - } + // 3) 이동 + _enemyController.Agent.isStopped = false; + _fleeSearchTimer = 0; } private void HandleDeadEnd() @@ -103,6 +121,8 @@ public class EnemyStateFlee :IEnemyState public void Exit() { + _enemyController.Agent.isStopped = true; + _enemyController.Agent.ResetPath(); _playerTransform = null; _enemyController = null; } From bc88d47e6b93dfbdb09bab6761b246b3ef2563e4 Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 11:13:18 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[feat]=20=EB=A7=A4=EC=A7=81=EB=AF=B8?= =?UTF-8?q?=EC=82=AC=EC=9D=BC=20=EA=B5=AC=ED=98=84=20=EC=8B=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 몬스터가 사용할 총알 베이스 생성 work in DEG-100 --- Assets/Scripts/Character/Enemy/Bullet.meta | 8 ++++++ .../Character/Enemy/Bullet/BulletBase.cs | 25 +++++++++++++++++++ .../Character/Enemy/Bullet/BulletBase.cs.meta | 3 +++ .../Character/Enemy/Bullet/MagicMissaile.cs | 8 ++++++ .../Enemy/Bullet/MagicMissaile.cs.meta | 11 ++++++++ .../Character/Enemy/CasterDemonController.cs | 25 ++++++++++++++++++- 6 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/Character/Enemy/Bullet.meta create mode 100644 Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs create mode 100644 Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs.meta create mode 100644 Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs create mode 100644 Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta diff --git a/Assets/Scripts/Character/Enemy/Bullet.meta b/Assets/Scripts/Character/Enemy/Bullet.meta new file mode 100644 index 00000000..48dcbd7d --- /dev/null +++ b/Assets/Scripts/Character/Enemy/Bullet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a636af603b3af4d1baccb8296add7485 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs new file mode 100644 index 00000000..7631b85e --- /dev/null +++ b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +public struct BulletData +{ + public Vector3 TargetPos; + public float Damage; + public float LifeTime; + public float Speed; + + public BulletData(Vector3 targetPos, float damage, float lifeTime, float speed) + { + TargetPos = targetPos; + Damage = damage; + LifeTime = lifeTime; + Speed = speed; + } + +} + +public class BulletBase : MonoBehaviour +{ + private float _speed; + private Vector3 _targetPosition; + +} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs.meta b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs.meta new file mode 100644 index 00000000..a4872865 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c349f971ec844b19d94a06e8f93aca0 +timeCreated: 1745890918 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs b/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs new file mode 100644 index 00000000..541c9c41 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MagicMissaile : BulletBase +{ + +} diff --git a/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta b/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta new file mode 100644 index 00000000..51545c2a --- /dev/null +++ b/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc3f5b56a395f448c881888076d83cba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index af724400..fe436f8d 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -5,6 +5,10 @@ using UnityEngine; public class CasterDemonController : EnemyController { private bool _doneBattleSequence = true; + private bool _isFirstNoPath = true; + + [SerializeField] private Transform teleportTransform; + [SerializeField] private GameObject magicMissilePrefab; public override void BattleSequence() { @@ -25,6 +29,25 @@ public class CasterDemonController : EnemyController public override void OnCannotFleeBehaviour() { - Debug.Log("## 몬스터가 막다른 길에 몰려 뭔가 함"); + if (_isFirstNoPath) + { + Debug.Log("## 몬스터가 처음으로 막다른 길에 몰렸습니다."); + } + else + { + Debug.Log("## 몬스터가 다시 막다른 길에 몰렸습니다."); + } } + + private void ShotMagicMissile() + { + this.transform.LookAt(TraceTargetTransform.position); + } + + private void Teleport() + { + + } + + } From 393b538920eaf3c843faad2f84637646ca0217f5 Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 11:43:58 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat=20:=20bullet=20base=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이동속도, 데미지, 라이프타임을 받음 - bulletdata를 받아 초기화 진행 - 발사 위치를 기준으로 목표 방향 세팅 - 테스트를 위해 초기값 임의로 작성 work in DEG-100 JIRA --- .../Character/Enemy/Bullet/BulletBase.cs | 56 +++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs index 7631b85e..2396961b 100644 --- a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs +++ b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs @@ -14,12 +14,60 @@ public struct BulletData LifeTime = lifeTime; Speed = speed; } - } - +[RequireComponent(typeof(Collider))] public class BulletBase : MonoBehaviour { - private float _speed; - private Vector3 _targetPosition; + // 데이터 + private float _speed = 5f; + private float _damage = 1f; + private float _lifeTime = 10f; + // 내부용 + private Vector3 _direction = Vector3.forward; + private float _timer; + + public virtual void Initialize(BulletData bulletData) + { + _speed = bulletData.Speed; + _damage = bulletData.Damage; + _lifeTime = bulletData.LifeTime; + + // 발사 위치 기준 목표 방향만 계산 + _direction = (bulletData.TargetPos - transform.position).normalized; + + // 탄환이 바라보는 방향 세팅 + transform.rotation = Quaternion.LookRotation(_direction); + + _timer = 0f; + } + + private void Update() + { + // 1) 이동 + transform.position += _direction * (_speed * Time.deltaTime); + + // 2) 수명 카운트 + _timer += Time.deltaTime; + if (_timer >= _lifeTime) + { + DestroyBullet(); + } + } + + private void OnTriggerEnter(Collider other) + { + var character = other.GetComponent(); + if (character != null) + { + character.TakeDamage(_damage); + DestroyBullet(); + } + } + + protected virtual void DestroyBullet() + { + Debug.Log("## Bullet destroyed"); + Destroy(gameObject); + } } \ No newline at end of file From 50e5b8db98314ab4a357c0f9e1991de3a98f68fd Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 14:00:03 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat=20:=20=EB=A7=A4=EC=A7=81=EB=AF=B8?= =?UTF-8?q?=EC=82=AC=EC=9D=BC=20=EA=B8=B0=EB=B3=B8=20=EB=8F=99=EC=9E=91=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 플레이어가 움직이는 방향을 참고하여 예측샷 발사 --- Assets/JYY/Prefabs/Bullets.meta | 8 ++++ .../Bullets/Dummy Magic Missaile.prefab | 3 ++ .../Bullets/Dummy Magic Missaile.prefab.meta | 7 +++ Assets/JYY/Scenes/MonsterTest.unity | 4 +- .../Character/Enemy/Bullet/BulletBase.cs | 2 + .../{MagicMissaile.cs => MagicMissile.cs} | 2 +- ...cMissaile.cs.meta => MagicMissile.cs.meta} | 0 .../Character/Enemy/CasterDemonController.cs | 47 +++++++++++++++++-- 8 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 Assets/JYY/Prefabs/Bullets.meta create mode 100644 Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab create mode 100644 Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab.meta rename Assets/Scripts/Character/Enemy/Bullet/{MagicMissaile.cs => MagicMissile.cs} (63%) rename Assets/Scripts/Character/Enemy/Bullet/{MagicMissaile.cs.meta => MagicMissile.cs.meta} (100%) diff --git a/Assets/JYY/Prefabs/Bullets.meta b/Assets/JYY/Prefabs/Bullets.meta new file mode 100644 index 00000000..760b6a99 --- /dev/null +++ b/Assets/JYY/Prefabs/Bullets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37e30a87d9c904c898232118c82b5fbc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab b/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab new file mode 100644 index 00000000..7a7770e6 --- /dev/null +++ b/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b880c281eae23192aec88f2cdc857d261f1b7542d69ca291348ce67ce506ba0 +size 3412 diff --git a/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab.meta b/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab.meta new file mode 100644 index 00000000..5f83d1a3 --- /dev/null +++ b/Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9c16b44c8736e4007ad5f0733ce433e1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index d772a68e..78f82a45 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:efc792ecb073a66263abf936bd751584b41224bde07c7f02418d10223d0c07f4 -size 22331 +oid sha256:2084d36f9ac1250a6302039da5967f6de70b091c45d35a003fb94c10f8c24a2c +size 23771 diff --git a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs index 2396961b..d3c1a9e9 100644 --- a/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs +++ b/Assets/Scripts/Character/Enemy/Bullet/BulletBase.cs @@ -57,6 +57,8 @@ public class BulletBase : MonoBehaviour private void OnTriggerEnter(Collider other) { + // TODO: 주인공 캐릭터를 찾는 로직 추가 필요 + // 주인공 스크립트를 찾아 처리할 것. var character = other.GetComponent(); if (character != null) { diff --git a/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs b/Assets/Scripts/Character/Enemy/Bullet/MagicMissile.cs similarity index 63% rename from Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs rename to Assets/Scripts/Character/Enemy/Bullet/MagicMissile.cs index 541c9c41..0965588b 100644 --- a/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs +++ b/Assets/Scripts/Character/Enemy/Bullet/MagicMissile.cs @@ -2,7 +2,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -public class MagicMissaile : BulletBase +public class MagicMissile : BulletBase { } diff --git a/Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta b/Assets/Scripts/Character/Enemy/Bullet/MagicMissile.cs.meta similarity index 100% rename from Assets/Scripts/Character/Enemy/Bullet/MagicMissaile.cs.meta rename to Assets/Scripts/Character/Enemy/Bullet/MagicMissile.cs.meta diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index fe436f8d..07d6b87c 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -8,6 +8,7 @@ public class CasterDemonController : EnemyController private bool _isFirstNoPath = true; [SerializeField] private Transform teleportTransform; + [SerializeField] private Transform bulletShotPosition; [SerializeField] private GameObject magicMissilePrefab; public override void BattleSequence() @@ -20,9 +21,8 @@ public class CasterDemonController : EnemyController // TODO : 배틀 중일 때 루프 Debug.Log("## 몬스터의 교전 행동 루프"); + StartCoroutine(ShotMagicMissile()); - // 전투 행동이 끝남 - _doneBattleSequence = true; } } @@ -39,15 +39,54 @@ public class CasterDemonController : EnemyController } } - private void ShotMagicMissile() + private IEnumerator ShotMagicMissile() { - this.transform.LookAt(TraceTargetTransform.position); + for (int i = 0; i < 3; i++) + { + // 1. 기본 위치 + Vector3 basePos = TraceTargetTransform.position; + Vector3 aimPosition = basePos; + + // 2. 플레이어 Rigidbody로 속도 얻기 + if (TraceTargetTransform.TryGetComponent(out var rb)) + { + // 아주 짧은 시간만 예측 + float predictionTime = 0.3f; + aimPosition += rb.velocity * predictionTime; + } + + // 높이는 변경할 필요 없음 + float fixedY = bulletShotPosition.position.y; + aimPosition.y = fixedY; + + // 3. 그 위치를 바라보고 + transform.LookAt(aimPosition); + + // 4. 미사일 생성 및 초기화 + var missile = Instantiate( + magicMissilePrefab, + bulletShotPosition.position, + transform.rotation + ); + missile.GetComponent() + .Initialize(new BulletData(aimPosition, 5f, 10f, 5f)); + + yield return new WaitForSeconds(0.4f); + } + + // 짧은 텀 후 끝내기 + yield return new WaitForSeconds(1f); + _doneBattleSequence = true; } + + private void Teleport() { } + + } From 18211fff054acc35dc45aba918ab4b2c283b898e Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 15:00:50 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat=20:=20=EB=AA=AC=EC=8A=A4=ED=84=B0=20?= =?UTF-8?q?=EC=88=9C=EA=B0=84=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 몬스터가 구석에 몰려 더이상 움직일 수 없는 경우 중앙으로 워프 Work in JIRA ISSUE DEG-100 --- .../Character/Enemy/CasterDemonController.cs | 25 +++++++++++-------- .../Enemy/EnemyState/Caster/EnemyStateFlee.cs | 20 ++++++++++----- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index 07d6b87c..e16e978e 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -10,7 +10,7 @@ public class CasterDemonController : EnemyController [SerializeField] private Transform teleportTransform; [SerializeField] private Transform bulletShotPosition; [SerializeField] private GameObject magicMissilePrefab; - + [SerializeField] private GameObject teleportEffectPrefab; public override void BattleSequence() { // 전투 행동이 이미 진행 중일 경우 실행 막기 @@ -22,21 +22,15 @@ public class CasterDemonController : EnemyController // TODO : 배틀 중일 때 루프 Debug.Log("## 몬스터의 교전 행동 루프"); StartCoroutine(ShotMagicMissile()); - } } - public override void OnCannotFleeBehaviour() { - if (_isFirstNoPath) - { - Debug.Log("## 몬스터가 처음으로 막다른 길에 몰렸습니다."); - } - else - { - Debug.Log("## 몬스터가 다시 막다른 길에 몰렸습니다."); - } + // 구석에 끼인 경우 탈출 + + Debug.Log("## 텔레포트 시전"); + Teleport(); } private IEnumerator ShotMagicMissile() @@ -83,7 +77,16 @@ public class CasterDemonController : EnemyController private void Teleport() { + if (teleportEffectPrefab != null) + Instantiate(teleportEffectPrefab, transform.position, Quaternion.identity); + if (Agent != null && teleportTransform != null) + Agent.Warp(teleportTransform.position); + else if (teleportTransform != null) + transform.position = teleportTransform.position; + + if (teleportEffectPrefab != null && teleportTransform != null) + Instantiate(teleportEffectPrefab, teleportTransform.position, Quaternion.identity); } diff --git a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs index 95bf28e1..c962e62e 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs @@ -16,7 +16,7 @@ public class EnemyStateFlee :IEnemyState private Vector3 _lastPosition; private float _stuckTimer = 0f; private const float StuckThresholdTime = 1f; // 1초 동안 거의 못 움직이면 막힌 걸로 간주 - private const float StuckMoveThreshold = 0.1f; // 이내 이동은 “제자리”로 본다 + private const float StuckMoveThreshold = 0.01f; // 이내 이동은 “제자리”로 본다 public void Enter(EnemyController enemyController) { @@ -58,7 +58,7 @@ public class EnemyStateFlee :IEnemyState if (!_enemyController.Agent.pathPending && _enemyController.Agent.pathStatus == NavMeshPathStatus.PathInvalid) { - // 막다른 길임 : 대체 행동 실행 + Debug.Log("## 길을 못찾음"); HandleDeadEnd(); } @@ -76,6 +76,8 @@ public class EnemyStateFlee :IEnemyState _stuckTimer += Time.deltaTime; if (_stuckTimer >= StuckThresholdTime) { + + Debug.Log("## 끼임"); HandleDeadEnd(); _stuckTimer = 0f; } @@ -111,14 +113,20 @@ public class EnemyStateFlee :IEnemyState if (NavMesh.SamplePosition(randomDirection, out var hit, (_fleeDistance * 2), NavMesh.AllAreas)) { + // 샘플링에 성공했으면 일단 그 위치로 가 보도록 세팅 + Debug.Log("## 일단 가봄"); _enemyController.Agent.SetDestination(hit.position); - return; + _enemyController.OnCannotFleeBehaviour(); + } + else + { + // 대체 경로도 찾을 수 없는 경우 + Debug.Log("## 대체 경로도 못찾음"); + _enemyController.OnCannotFleeBehaviour(); } - - // 대체 경로도 찾을 수 없는 경우 - _enemyController.OnCannotFleeBehaviour(); } + public void Exit() { _enemyController.Agent.isStopped = true; From ea459361141552e8bd6f488efe4b904c151bf3ea Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 15:02:25 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=EB=AA=AC=EC=8A=A4=ED=84=B0=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=94=AC=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Work in JIRA ISSUE DEG-100 --- Assets/JYY/Scenes/MonsterTest.unity | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index 78f82a45..8409e26b 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:2084d36f9ac1250a6302039da5967f6de70b091c45d35a003fb94c10f8c24a2c -size 23771 +oid sha256:764d27979e400fb1973bc109fc8ac2f0664e1811b2a1ce4f738901c6fa9a3df2 +size 25344 From d0d42cf5518fd37fdd362977c965c16077f9b033 Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 15:18:55 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=EC=A0=9C=EC=9E=90=EB=A6=AC=EB=A1=9C=20?= =?UTF-8?q?=ED=8C=90=EB=8B=A8=ED=95=98=EB=8A=94=20=EA=B1=B0=EB=A6=AC=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Work in JIRA ISSUE DEG-100 --- Assets/Scripts/Character/Enemy/CasterDemonController.cs | 2 -- .../Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index e16e978e..039f53c2 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -73,8 +73,6 @@ public class CasterDemonController : EnemyController _doneBattleSequence = true; } - - private void Teleport() { if (teleportEffectPrefab != null) diff --git a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs index c962e62e..e6b8d161 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/Caster/EnemyStateFlee.cs @@ -16,7 +16,7 @@ public class EnemyStateFlee :IEnemyState private Vector3 _lastPosition; private float _stuckTimer = 0f; private const float StuckThresholdTime = 1f; // 1초 동안 거의 못 움직이면 막힌 걸로 간주 - private const float StuckMoveThreshold = 0.01f; // 이내 이동은 “제자리”로 본다 + private const float StuckMoveThreshold = 0.1f; // 이내 이동은 “제자리”로 본다 public void Enter(EnemyController enemyController) { From 882ef3b8dc43991ae6f000379ab8ebc4418c9c00 Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 15:25:01 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=EB=8D=94=EB=AF=B8=20=EB=AA=AC=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=20=ED=94=84=EB=A6=AC=ED=8C=B9=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Work in JIRA ISSUE DEG-100 --- Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab | 3 +++ Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab.meta | 7 +++++++ Assets/JYY/Scenes/MonsterTest.unity | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab create mode 100644 Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab.meta diff --git a/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab b/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab new file mode 100644 index 00000000..59bde51d --- /dev/null +++ b/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f3a5655d83502f88a2dfe4ff925a8705d756b4b6b7158060da8886e306dea8e +size 7232 diff --git a/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab.meta b/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab.meta new file mode 100644 index 00000000..ef3b4753 --- /dev/null +++ b/Assets/JYY/Prefabs/[Enemy] Dummy Monster.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 06eebdb9d2c03437fb632d9e15fd1078 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index 8409e26b..ba13a3ca 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:764d27979e400fb1973bc109fc8ac2f0664e1811b2a1ce4f738901c6fa9a3df2 -size 25344 +oid sha256:3402276a5eb04d5f3eab27539ff775edf472d2829fe28e02aed24953cf712aff +size 21005 From 2708df17df65fa28be53a9ab9a081c2a16334989 Mon Sep 17 00:00:00 2001 From: Fiore Date: Tue, 29 Apr 2025 16:06:07 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[feat]=20=EB=9E=9C=EB=8D=A4=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EC=88=98=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Work in JIRA ISSUE DEG-100 --- .../Character/Enemy/CasterDemonController.cs | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Character/Enemy/CasterDemonController.cs b/Assets/Scripts/Character/Enemy/CasterDemonController.cs index 039f53c2..147436cf 100644 --- a/Assets/Scripts/Character/Enemy/CasterDemonController.cs +++ b/Assets/Scripts/Character/Enemy/CasterDemonController.cs @@ -21,7 +21,38 @@ public class CasterDemonController : EnemyController // TODO : 배틀 중일 때 루프 Debug.Log("## 몬스터의 교전 행동 루프"); - StartCoroutine(ShotMagicMissile()); + Thinking(); + } + } + + + private void Thinking() + { + int selectedPattern = Random.Range(0, 10); + + switch (selectedPattern) + { + case 0: + + case 1: + + case 2: + + case 3: + + case 4: + + case 5: + + case 6: + + case 7: + + case 8: + + case 9: + StartCoroutine(ShotMagicMissile()); + break; } }