6-13. 15조 FleeMonsterController

keubung·2024년 12월 12일

FleeMonsterController.cs

1. 문제 상황

FleeMonsterController
: 공격을 받으면 플레이어를 등지고 일정 각도 범위 내의 가장 먼 곳으로 도망을 친 후 제자리로 돌아가 투명화되는 몬스터

  • 도망칠 공간이 충분하지 않으면 바로 제자리로 순간이동을 함.
    -> 도망칠 공간이 없을 경우 첫 스폰 위치로 도망간 후 투명화되도록 수정

+ TryGetValidNavMeshPosition : 유효한 NavMesh 위치인지 확인
+ IsValidFleeAngle : 플레이어를 등지는 특정 각도 범위 확인
+ IsValidPathLength : 최대로 움직일 수 있는 이동 경로의 길이 내에 있는지 확인

const int angleStep = 10;
Vector3 bestDestination = transform.position;
float maxDistanceFromPlayer = 0f;

for (float angle = -100; angle <= 100; angle += angleStep)
{
    Vector3 fleeDirection = Quaternion.Euler(0, angle, 0) * -transform.forward;
    Vector3 potentialDestination = transform.position + fleeDirection * maxDistance;

    if (!TryGetValidNavMeshPosition(potentialDestination, out Vector3 navMeshPosition))
        continue;

    if (!IsValidFleeAngle(navMeshPosition))
        continue;

    if (!IsValidPathLength(navMeshPosition, out float pathLength))
        continue;

    // 플레이어로부터 가장 먼 위치 계산
    float distanceFromPlayer = Vector3.Distance(navMeshPosition, targetTransform.position);

    if (distanceFromPlayer > maxDistanceFromPlayer)
    {
        maxDistanceFromPlayer = distanceFromPlayer;
        bestDestination = navMeshPosition;
    }
}

if (bestDestination == transform.position)
{
    bestDestination = monsterSpawnPoint;
}

return bestDestination;
profile
김나영(Unity_6기)

0개의 댓글