오늘의 학습 키워드
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가 경로를 "이동하기 편한 구역 → 이동을 꺼리는 구역 → 절대 가지 말아야 할 구역"으로 구분해 우선순위를 두고 판단할 수 있게 된다.
적용 방법
- Navigation → Areas 탭에서 커스텀 Area를 정의한다
- User3 → DontWanna, Cost = 3
- User4 → Nevergo, Cost = 4
(※ Walkable의 기본 Cost는 1)
- 씬에 존재하는 Plane, 벽, 울타리 등 특정 오브젝트에 NavMeshModifier 컴포넌트를 추가한다
- Override Area를 체크하고, 위에서 만든 DontWanna, Nevergo 중 하나를 선택
- 전체 NavMesh는 NavMeshSurface에서 베이크
- 모든 Modifier를 인식해서 베이크 시 적용됨
- NavMeshAgent는 자동으로 가장 비용이 낮은 경로를 계산
→ 거리 + Cost를 고려한 최적 경로 선택
예시로 정리
| 구역이름 | Area Cost | 경로 선택시 의미 |
| Walkable | 1 | 기본값, 선호 경로 |
| DontWanna | 3 | 거리 짧아도 가급적 피함 |
| Nevergo | 4 | 거의 가지 않음, 최후의 수단으로만 |
예: Player가 구석에 있고, 그 앞에 Nevergo 영역이 있을 경우,
AI는 우회해서라도 Walkable이나 DontWanna를 경유하는 경로를 택함
느낀 점
- 단순한 거리 기반 경로 설정은 현실적인 이동 패턴을 보장하지 않는다.
가중치를 다르게 설정함으로써, 마치 "AI가 위험을 회피하는 것처럼" 동작하게 만들 수 있었다. - 구조물/지형마다 가중치를 전략적으로 조절하면 게임 플레이 흐름에 영향을 줄 수 있다.
예: FastZone = 유리한 루트, Nevergo = 독성지대 느낌 - 추가로 NavMeshObstacle이나 Carve 기능을 활용하면 실시간으로 경로를 차단하거나 열 수 있는 구조도 구현 가능할 것 같았다.