📚 AI가 어떻게 움직이고 행동을 결정하는지
🧠 AI의 상태 흐름 예시
➡ 각 상황에 맞게 행동이 전환되는 기준(조건) 을 설정하고, 그에 따라 적절한 행동을 수행
🌀 Behavior Tree 구성 요소

1️⃣ Root (루트)
- 트리의 시작점
- 아래 노드들을 실행하게 만드는 진입 지점
2️⃣ Selector (셀렉터)
- 선택 노드
- 조건을 검사하여 상황에 맞는 / 맞지 않는 태스크를 구분해 실행
- 왼쪽부터 순서대로 자식 노드를 실행
- 성공하는 노드를 찾을 때까지 시도함
- 하나라도 성공하면 나머지는 실행하지 않고 중단
3️⃣ Sequence (시퀀스)
- 순차 실행 노드
- 자식 노드를 왼쪽부터 순서대로 연달아 실행
- 모든 자식이 성공해야 전체가 성공
- 하나라도 실패하면 중단
4️⃣ Parallel (페럴럴)
- 동시 실행 노드 (여러 태스크를 묶어 한 번에 실행)
- 자식 노드를 같이 실행
- 어떤 조건에서 멈출지는 설정에 따라 다름
(예) 하나만 성공해도 전체 성공 or 모두 성공해야 전체 성공
5️⃣ Task (테스크)
- 실제 행동이 일어나는 곳
(예) 이동하기, 공격하기, 대기하기 등
6️⃣ Decorator (데코레이터)
- 조건을 추가하거나 특정 기능을 추가하는 노드
- 실행 가능 / 실행 불가능
- 해당 노드 또는 서브트리의 실행 여부를 결정
(예) 플레이어가 보일 때만 실행, 체력이 50% 이상일 때만 실행
7️⃣ Service (서비스)
- 백그라운드에서 지속적으로 실행되는 기능
(예) 일정 주기마다 플레이어 위치 갱신, 타겟 확인 등
- 특정 노드가 활성화된 동안 계속 돌아감
| 구성 요소 | 설명 |
|---|---|
| Root | 트리의 시작점 |
| Selector | 자식 중 하나라도 성공하면 OK |
| Sequence | 자식 전부 성공해야 OK |
| Parallel | 자식들을 동시에 실행 |
| Task | 실제 행동 수행 |
| Decorator | 실행 조건 부여 |
| Service | 주기적 정보 업데이트 등 지속 실행 |

Simple Parallel📍BT_AICharacter


📍BB_AICharacter




📍BTD_IsNearPlayer

▶ BTD_IsNearPlayer 일 때는 2번 태스크 실행
▶ 아닌 경우에는 3번 태스크 실행됨 ➡ TargetPosition을 어떻게 설정하냐에 따라 다름
✔ TargetPosition 다르게 설정 ➡ 데코레이터(BTD_IsNearPlayer) 에서 설정하기


Sphere Overlap ActorsSphere Radius (반경)Object Types 
어떤 항목을 받을지?

✔ 반환된 인덱스가 -1인지 먼저 확인해야 하며 이를 위해 Branch 노드를 사용

Return Value : false (실행 실패)Return Value : true (실행 성공)| Find 결과 | 의미 | 행동 실행 여부 |
|---|---|---|
-1 | 액터 없음 | ❌ 실행 안 함 (false) |
0 이상 | 액터 있음 (인덱스) | ✅ 실행함 (true) |


Get Blackboard (데이터를 저장하고 내보냄)Set Value as Vector Key Name Vector Value : 플레이어 폰의 위치 넣기
▶ BTD(Behavior Tree Decorator)는 자체적으로 블랙보드에 대한 직접적인 정보가 없음
➡ 어떤 액터가 해당 블랙보드를 사용하는지 먼저 알아야 함
➡ Get Blackboard 노드의 Target을 자기 자신(Self) 이 아니라, BTD의 Owner Actor로 연결

📍BTS_FindingRandom

▶ 서비스가 처음 활성화될 때 호출활성화 됐을 때 Target Position을 랜덤하게 생성해야함 ➡ 내비게이션 활용
내비게이션 시스템
| 용어 | 의미 | 설명 |
|---|---|---|
| 내비게이션 (Navigation) | AI가 경로를 찾는 전체 시스템 | 경로 탐색, 장애물 회피 등 전체 로직 |
| 내비메시 (NavMesh) | 내비게이션에 사용되는 길 정보 데이터 | AI가 걸을 수 있는 영역을 격자처럼 표시한 맵 |
| 내비메시 바운드 볼륨 (Nav Mesh Bounds Volume) | 내비메시가 생성될 영역을 지정하는 3D 박스 | 이걸 배치하지 않으면 AI가 경로를 모름 |



Get Random Location in Navigable Radius 노드를 이용해 이 녹색 영역 내에서 랜덤 좌표를 가져오기 
Get Random Location in Navigable RadiusOrigin 기준 Owner Actor의 현재 위치(AI 자신을 기준으로 탐색)Radius (반경) 2000(20m)으로 확장하면 탐색 범위를 넓힐 수 있음Return Value (Boolean)| Return Value | 의미 | 처리 방식 |
|---|---|---|
false | AI가 이동할 수 없는 위치 (장애물, 내비메시 없음) | ❌ 블랙보드에 저장하지 않음 ❌ Move To 등 행동 실행 X |
true | AI가 실제로 이동 가능한 유효한 위치 | ✅ 블랙보드에 위치값 저장 (Set Blackboard Value)✅ Move To 등 행동 실행 O |

Get Blackboard 블랙보드 컴포넌트를 가져옴 (Get)
Set Value as Vector 해당 블랙보드에 값(Vector)을 저장 (Set)

서비스 추가
: 랜덤한 위치를 탐색하고 움직이기

1번 노드 BTD_IsNearPlayer + Move To (TargetPosition)
2번 노드 Move To (TargetPosition) + BTS_FindingRandom
| 구분 | 설명 |
|---|---|
| 왼쪽 (2번) | 데코레이터(BTD_IsNearPlayer)가 조건 만족할 때만 Move To 실행 |
| 오른쪽 (3번) | Move To 실행 시, 동시에 BTS_FindingRandom 서비스도 함께 작동 |

가까우면 움직여라아니면 움직여라: 처음 실행했을 때만 랜덤 포지션을 확인
➡ 랜덤 포지션은 target position에 도달하게 되면 새로 Target Position을 설정해야함


