2차 프로젝트 일지 - 4일차
4일차: behavior tree & Astar algorithm
적 AI
매 틱마다 두 개의 독립된 트리 실행
EnemyController::Tick() ├── movementTree (stateComp->CanMove() 일 때) └── actionTree (stateComp->CanAct() 일 때)movementTree 구조
BTSelector ← root│├─[1] BTSequence(dangerSequence)│ ├── IsDangerNearbyCondition│ └── FleeFromDangerAction│├─[2] IsMovingCondition│└─[3] BTCooldown (0.5s) └── BTSelector ├─[3-A] AStarMoveAction └─[3-B] BTSequence(attackSequence) ├── HasBubbleAmmoCondition └── PlaceBubbleNearBoxAction- dangerSequence: 최우선순위인 위험감지 시퀀스 순회
- IsDangerNearbyCondition: 현재 위치가 물풍선 폭발 범위이면 Success 반환
- FleeFromDangerAction: 1번이 Success면 물풍선이 없고 이동가능한 첫 번째 타일로 RequestMove
- IsMovingCondition: Character의 MovementComponent에서 IsMoving일 때 Success 반환해 동기성 보장
- BTCooldown: Decorator로, 입력값 동안 Failure 반환해 행동을 멈추게 함(사람같아보이려고)
- AStarMoveAction:
A*알고리듬 계산 후 RequestMove하기. 내부는AStarPathfinder::GetFullPath로 동작하며 휴리스틱은 맨해튼 거리 사용함 - innerSequence: 1번으로 움직인 박스 근처 타일에서 물풍선 놓기 액션
- HasBubbleAmmoCondition: 남은 물풍선 탄약이 있는지 확인
- PlaceBubbleNearBoxAction:
- AStarPathfinder::FindBoxPlacement로 물풍선 놓을 타일 계산. 이 때 박스 없다는 가정 하에
A*로 경로 찾음 actionTree
- AStarPathfinder::FindBoxPlacement로 물풍선 놓을 타일 계산. 이 때 박스 없다는 가정 하에
- AStarMoveAction:
BTSequence ← root│├─[1] IsPlayerAdjacentCondition└─[2] BTCooldown (1.5s) └── PlaceBubbleAction- IsPlayerAdjacentCondition: