creep의 원점 회귀 로직 개선

되돌아가지 않는 문제 수정
되돌아 가는 도중에 플레이어를 다시 인식하는 문제 수정
This commit is contained in:
2026-02-19 01:13:04 +09:00
parent 4ffbbb0aff
commit 702c0b4f9e

View File

@@ -69,7 +69,6 @@ namespace Northbound
private Vector3 _chaseStartPosition; private Vector3 _chaseStartPosition;
private float _lastAttackTime; private float _lastAttackTime;
private bool _hasSetCoreDestination; private bool _hasSetCoreDestination;
private float _lastDetectionLogTime;
private bool _isRecalculatingPath = false; // NavMesh 갱신 대기 플래그 private bool _isRecalculatingPath = false; // NavMesh 갱신 대기 플래그
private NetworkVariable<EnemyAIState> _currentState = new NetworkVariable<EnemyAIState>( private NetworkVariable<EnemyAIState> _currentState = new NetworkVariable<EnemyAIState>(
@@ -105,10 +104,6 @@ namespace Northbound
_agent.updateRotation = true; _agent.updateRotation = true;
_agent.updateUpAxis = false; _agent.updateUpAxis = false;
if (!_agent.isOnNavMesh)
{
}
if (aiType == TeamType.Monster) if (aiType == TeamType.Monster)
{ {
FindCore(); FindCore();
@@ -218,7 +213,11 @@ namespace Northbound
private void UpdateChasePlayer() private void UpdateChasePlayer()
{ {
GameObject targetPlayer = GetTargetPlayer(); GameObject targetPlayer = GetTargetPlayer();
if (targetPlayer == null) { OnLostTarget(); return; } if (targetPlayer == null)
{
OnLostTarget();
return;
}
float distanceToPlayer = Vector3.Distance(transform.position, targetPlayer.transform.position); float distanceToPlayer = Vector3.Distance(transform.position, targetPlayer.transform.position);
Vector3 chaseReferencePoint = (aiType == TeamType.Monster) ? _chaseStartPosition : _originPosition; Vector3 chaseReferencePoint = (aiType == TeamType.Monster) ? _chaseStartPosition : _originPosition;
@@ -282,13 +281,8 @@ namespace Northbound
private void UpdateReturnToOrigin() private void UpdateReturnToOrigin()
{ {
GameObject target = DetectTarget(); // 복귀 중에는 플레이어 감지하지 않음 (무한 루프 방지)
if (target != null) // Idle 상태에 도달하면 다시 감지 시작
{
SetTargetPlayer(target);
TransitionToState(EnemyAIState.ChasePlayer);
return;
}
if (!_agent.pathPending && _agent.remainingDistance <= _agent.stoppingDistance) if (!_agent.pathPending && _agent.remainingDistance <= _agent.stoppingDistance)
{ {
@@ -471,12 +465,23 @@ namespace Northbound
_agent.ResetPath(); _agent.ResetPath();
break; break;
case EnemyAIState.MoveToCore: case EnemyAIState.MoveToCore:
_agent.isStopped = false;
_agent.speed = moveSpeed;
if (_coreTransform != null)
{
_agent.SetDestination(_coreTransform.position);
_hasSetCoreDestination = true;
}
break;
case EnemyAIState.ChasePlayer: case EnemyAIState.ChasePlayer:
_agent.isStopped = false;
_agent.speed = moveSpeed * chaseSpeedMultiplier;
_chaseStartPosition = transform.position;
break;
case EnemyAIState.ReturnToOrigin: case EnemyAIState.ReturnToOrigin:
_agent.isStopped = false; _agent.isStopped = false;
_agent.speed = (state == EnemyAIState.ChasePlayer) ? moveSpeed * chaseSpeedMultiplier : moveSpeed; _agent.speed = moveSpeed;
if (state == EnemyAIState.ChasePlayer) _chaseStartPosition = transform.position; _agent.SetDestination(_originPosition);
if (state == EnemyAIState.ReturnToOrigin) _agent.SetDestination(_originPosition);
break; break;
case EnemyAIState.Dead: case EnemyAIState.Dead:
_agent.isStopped = true; _agent.isStopped = true;
@@ -524,8 +529,16 @@ namespace Northbound
_isRecalculatingPath = false; _isRecalculatingPath = false;
// 코어로 다시 이동 상태 전환 // 타입에 따라 적절한 상태 전환
TransitionToState(aiType == TeamType.Monster ? EnemyAIState.MoveToCore : EnemyAIState.Idle); // Monster: 코어로 이동, Hostile: 원래 위치로 복귀
if (aiType == TeamType.Monster)
{
TransitionToState(EnemyAIState.MoveToCore);
}
else
{
TransitionToState(EnemyAIState.ReturnToOrigin);
}
} }
private void FindCore() private void FindCore()