카테고리 없음

2025.05.23 7주차 금요일

mochoa 2025. 5. 23. 17:37

오늘의 학습 키워드

1. 레이저 트랩 구현
2. NavMesh 가중치 설정

 

1. 회전형 레이저 트랩 구현 (RotatingLaserTrap)

목적

게임 내 특정 구역을 방어하거나 긴장감을 유도할 수 있는 능동형 함정이 필요했다. 단순히 Collider를 이용한 트리거 방식보다, 시각적으로도 강한 인상을 주는 트랩을 만들고자 함.


구현 개요

  • RotatingLaserTrap.cs 스크립트에서 4방향 회전 레이저를 구현
  • LineRenderer 4개를 이용해 시각적 레이저 효과를 구성
  • transform.Rotate()를 이용해 매 프레임마다 트랩을 회전
  • Raycast로 충돌 감지 및 IDamagable 대상에게 피해 전송

 

 

핵심 포인트

Ray ray = new Ray(origin, direction);
if (Physics.Raycast(ray, out hit, rayLength, detectionLayer))
{
    lasers[i].SetPosition(1, hit.point); // 충돌 지점까지
    var damagable = hit.collider.GetComponent<IDamagable>();
    if (damagable != null && !player.IsInvincible()) // 무적 체크
    {
        damagable.TakePhysicalDamage(10);
        player.SetInvincible(1f); // 1초 무적
    }
}

 왜 isInvincible을 넣었는가?

처음엔 Raycast에 닿을 때마다 데미지를 주도록 구현했는데,
문제가 발생했다:

  • 레이저가 매 프레임마다 데미지를 줘서 체력이 순식간에 0이 됨
  • 플레이어가 피드백 없이 즉사함 → 불쾌한 게임 경험

해결책:
PlayerCondition에서 isInvincible 상태를 두어 레이저에 닿은 직후 일정 시간 동안 무적 처리를 적용

 

즉, 피해 → 1초 무적 → 무적 해제 → 다시 피해 가능→ 트랩의 리듬감이 생김

느낀 점

  • LineRenderer + Raycast 조합은 생각보다 매우 강력하고 직관적이다.
    특히 LineRenderer는 피해 범위를 시각화하는 용도로도 탁월했다.
  • isInvincible 로직은 단순한 버그 패치가 아니라, 게임의 템포를 조절하는 핵심 메커니즘이었다.
  • 트랩은 단순히 “강한” 것보다 “회피할 수 있게 만드는 긴장감”이 중요한 요소라는 걸 느꼈다.
  •  

2. NavMesh Area 가중치 설정

배경

일반적으로 AI는 NavMesh 위에서 가장 가까운 경로를 따라 이동하지만, 모든 경로가 같은 '품질'은 아니다. 어떤 구역은 지형이 불안정하거나 장애물이 많을 수 있다. 따라서 단순 거리 기반 경로 탐색이 아닌, 비용(cost)을 고려한 경로 탐색이 필요하다.

Unity의 Navigation 시스템에서는 NavMesh Area와 Cost 값을 설정함으로써, AI가 경로를 "이동하기 편한 구역 → 이동을 꺼리는 구역 → 절대 가지 말아야 할 구역"으로 구분해 우선순위를 두고 판단할 수 있게 된다.


적용 방법

  1. Navigation → Areas 탭에서 커스텀 Area를 정의한다
    • User3 → DontWanna, Cost = 3
    • User4 → Nevergo, Cost = 4
      (※ Walkable의 기본 Cost는 1)
  2. 씬에 존재하는 Plane, 벽, 울타리 등 특정 오브젝트에 NavMeshModifier 컴포넌트를 추가한다
    • Override Area를 체크하고, 위에서 만든 DontWanna, Nevergo 중 하나를 선택
  3. 전체 NavMesh는 NavMeshSurface에서 베이크
    • 모든 Modifier를 인식해서 베이크 시 적용됨
  4. NavMeshAgent는 자동으로 가장 비용이 낮은 경로를 계산
    → 거리 + Cost를 고려한 최적 경로 선택

 예시로 정리

구역이름 Area Cost 경로 선택시 의미
Walkable 1 기본값, 선호 경로
DontWanna 3 거리 짧아도 가급적 피함
Nevergo 4 거의 가지 않음, 최후의 수단으로만
 

예: Player가 구석에 있고, 그 앞에 Nevergo 영역이 있을 경우,
AI는 우회해서라도 Walkable이나 DontWanna를 경유하는 경로를 택함


느낀 점

  • 단순한 거리 기반 경로 설정은 현실적인 이동 패턴을 보장하지 않는다.
    가중치를 다르게 설정함으로써, 마치 "AI가 위험을 회피하는 것처럼" 동작하게 만들 수 있었다.
  • 구조물/지형마다 가중치를 전략적으로 조절하면 게임 플레이 흐름에 영향을 줄 수 있다.
    예: FastZone = 유리한 루트, Nevergo = 독성지대 느낌
  • 추가로 NavMeshObstacle이나 Carve 기능을 활용하면 실시간으로 경로를 차단하거나 열 수 있는 구조도 구현 가능할 것 같았다.