NPC가 Behavior Tree로 이동하다가 도주 행동으로 바뀝니다. Running 상태의 이전 이동 작업과 늦은 완료는 어떻게 처리하나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
Behavior Tree의 노드는 한 틱 안에 끝나는 성공·실패만 아니라 여러 틱에 걸친 Running도 반환할 수 있습니다. 이동 중 위험 조건이 생겨 도주로 전환한다면 새 노드를 선택하는 것만으로 이전 이동이 끝났다고 가정해서는 안 됩니다. 경로 요청, 애니메이션, 타이머, 예약, 비동기 콜백을 중단하거나 결과를 무효화하고, 새 행동만 현재 NPC 상태를 갱신하게 해야 합니다. 이 진행 중 행동의 시작·중단·완료를 관리하는 것을 행동 수명 관리(action lifetime management)로 볼 수 있습니다.
Running과 abort의 관계
상위 우선순위의 조건이 참이 되면 트리를 재평가해 이동 노드에서 도주 노드로 전환할 수 있습니다. 이때 이동 노드의 abort에서 경로 탐색 취소, 이동 예약 반환, 관련 타이머 해제, 애니메이션 전환을 수행합니다. 취소가 실제로 즉시 끝나지 않는 탐색 시스템이라면 행동 인스턴스에 세대 번호를 부여합니다. 이동 세대가 8일 때 도주로 전환하며 9를 발급하고, 늦게 도착한 세대 8의 경로 결과는 성공 콜백이더라도 무시합니다. 콜백이 ‘현재 NPC’만 보고 blackboard를 덮게 하면 이전 요청이 새 목표를 망가뜨립니다. Running은 단순한 플래그가 아니라 완료를 기다리는 책임을 뜻합니다. 노드가 Running을 반환한 뒤 다음 틱에 같은 인스턴스를 재개할지, 조건이 바뀌면 하위 트리를 중단하고 다시 시작할지 트리 종류와 실행기 계약을 정해야 합니다. reactive sequence는 조건을 자주 다시 평가해 높은 반응성을 얻는 대신 작업을 반복 중단할 수 있고, memory sequence는 이미 성공한 자식을 기억해 불필요한 재실행을 줄이는 대신 조건 변화에 늦게 반응할 수 있습니다. 어느 쪽을 택해도 중단된 자식의 정리 계약은 필요합니다.
blackboard와 비동기 결과
blackboard는 여러 노드가 읽는 공유 상태이므로 값의 소유자와 갱신 세대를 명시하겠습니다. 경로 결과는 requestId, 목표 버전, 맵 버전과 함께 기록하고, 현재 행동이 기대하는 요청과 일치할 때만 적용합니다. 행동이 실패하면 단순히 아무 값도 남기지 않는 대신 실패 원인과 재시도 시점을 정해 무한 재탐색을 막습니다. 사망·기절·목표 변경·이동 실패처럼 즉시 중단해야 하는 조건은 매 틱 전체 재평가와 이벤트 기반 abort 중 비용과 반응성을 비교합니다. 테스트는 이동 중 도주, abort 직후 경로 완료, 취소 중 서버 종료, 목표 변경, blackboard 동시 갱신을 포함합니다. 새 행동의 위치·애니메이션·자원 상태가 이전 행동의 늦은 결과로 다시 바뀌지 않는지 확인하고, 중단 뒤 남은 타이머와 예약을 계측하겠습니다.
Behavior Tree의 장점은 트리 모양 자체보다 Running 노드의 명시적 취소 계약(cancellation contract)에 있습니다. 행동의 중단은 상태를 즉시 실패로 바꾸는 것과 외부 작업이 실제로 멈춘 것을 구분해야 합니다. 이동 시스템이 취소 확인을 늦게 주면 노드는 Cancelling 같은 내부 상태를 잠시 유지하고, 새 도주 행동이 같은 이동 자원이나 예약을 사용하지 않게 합니다. 취소가 불가능한 애니메이션이라면 논리 상태만 새 행동으로 바꾸되 이전 완료 이벤트는 효과 없는 이벤트로 처리합니다. 중요한 것은 이를 정상 완료로 기록하지 않는 것입니다. 우선순위 조건이 틱마다 켜졌다 꺼지면 추적과 도주가 번갈아 실행되는 진동이 생깁니다. 조건 유지 시간, 최소 행동 실행 시간, 재진입 쿨다운을 두되 실제 위험이 커졌을 때의 즉시 abort보다 우선하지 않도록 계층을 나눕니다.
blackboard 변경도 트리 전체를 깨우기보다 해당 키를 읽는 조건만 재평가하면 비용을 줄일 수 있고, 변경 이벤트의 틱 번호를 남기면 결정을 재현할 수 있습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- Running을 여러 틱에 걸친 작업으로 설명하고 abort 정리를 연결한다.
- 행동 세대·요청 ID로 늦은 비동기 결과의 적용을 차단한다.
- reactive와 memory 재평가의 반응성·반복 비용 차이를 말한다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 다른 노드를 선택하면 이전 Running 작업이 자동 종료된다고 말한다.
- blackboard를 세대나 소유자 없이 모든 콜백이 덮게 한다.
- 모든 노드가 한 틱 안에 끝난다고 가정한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 여러 NPC가 하나의 경로 서비스에 요청합니다. 행동별 취소와 전체 공정한 탐색 예산을 어떻게 조합하나요?
- 위험 조건이 틱마다 바뀌어 NPC가 추적과 도주를 반복합니다. 반응성을 유지하면서 행동 진동을 어떻게 줄이나요?
- 취소를 지원하지 않는 외부 이동 작업의 결과와 자원을 누가 회수하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.