CharacterModules 기반 캐릭터 생성 흐름을 그대로 활용하면서, 몹 전용 AI 를 서버 권한으로 구동한다.
MobAI 는 서버에서만 상태를 결정하고, 필요한 최소 정보만 CharacterInfo 를 통해 클라이언트에 스트리밍한다.
- 인지(Perception) → 의사결정(Decision) → 실행(Action) 3단계를 모듈로 나누어 유지보수성과 테스트 용이성을 확보한다.
설명
시스템 범위
- 적용 대상:
CollectionService 의 Character 태그가 붙은 비플레이어 Model.
- 선행 조건:
CharacterModel 또는 맵 배치 도중 생성된 몹에게 CharacterInfo 기반 데이터 구조가 할당되어 있어야 한다.
- 목표: 몰입감 있는 추적/탐색/전투 행동을 제공하면서, 다양한 몹 타입을 컴포넌트 조합으로 확장할 수 있도록 한다.
구동 구조
ServerScriptService.MobControllers 에서 MobAISupervisor 스크립트를 실행해 모든 몹을 감시한다.
MobAISupervisor 는 CollectionService:GetTagged("Character") 감시를 통해 몹 모델을 찾고, 플레이어가 아닌 모델만 필터링한다.
- 모델별로
CharacterModules.MobAI.Controller 를 생성하여, 인지/의사결정/행동 컴포넌트를 주입한다.
Controller 는 RunService.Heartbeat 기반의 짧은 틱(예: 0.1초)과 RunService.Stepped 위임을 조합해 경량 업데이트 루프를 유지한다.
- 출력된 행동 명령은
MobActionRunner 가 실제 Humanoid 또는 애니메이션, 스킬 시스템에 전달한다.
모듈 구성
CharacterModules.MobAI.Controller
- 한 몹의 AI 전체 생명주기를 관리한다.
- 의존성:
Perception, DecisionPlanner, ActionRunner, Blackboard.
MobAIController.new(params: MobAIControllerParams) 로 생성하며, params 는 캐릭터 모델, 컴포넌트 템플릿, 초기 상태를 포함한다.
CharacterModules.MobAI.Blackboard
- 몹 개체별 상태 저장소.
CharacterInfo 의 MobAIInfos 폴더와 연결되어 서버-클라이언트 동기화 범위를 제어한다.
- 주요 키:
Target(Player 혹은 Model), AlertLevel, LastSeenPosition, SkillCooldowns.
CharacterModules.MobAI.Perception
- 시야, 청각, 피해 히트박스 등 센서 데이터를 수집한다.
RaycastParams 와 Workspace:GetPartBoundsInRadius 등을 사용해 근접 오브젝트를 감지하고, 결과를 Blackboard 에 갱신한다.
CharacterModules.MobAI.DecisionPlanner
- 상태 머신과 유사한 규칙 엔진을 구성한다.
- 입력:
Blackboard 정보, 몹 고유 설정(MobProfile).
- 출력:
ActionCommand(Chase, Search, Idle, Attack, Flee 등).
- 우선순위 기반 규칙(예: 체력이 낮으면
Flee) 과 플러그형 전략(예: 원거리 몹은 MaintainDistance) 을 지원한다.
CharacterModules.MobAI.ActionRunner
- 결정된
ActionCommand 를 실제 동작으로 변환한다.
PathfindingService 를 통해 이동 경로를 계산하고, Humanoid:MoveTo 또는 루트모션 애니메이션을 실행한다.
- 전투 명령은
MobSkillService 나 MobWeaponController 와 연동하도록 어댑터 레이어를 둔다.
데이터 플로우
MobProfile:
- 위치:
ReplicatedStorage.GameModules.CharacterModules.MobAI.Profiles.
- 내용: 체력, 이동 속도, 시야 범위, 선호 행동 트라이브 등 몹 종류별 기본값.
- 서버에서만 수정하며,
Controller 생성 시 Blackboard 초기화에 사용한다.
CharacterInfo 연계:
CharacterInfo/MobAIInfos 폴더에 State(StringValue), AlertLevel(NumberValue), TargetId(StringValue) 등을 배치한다.
- 스트리밍 시 해당 값만 전송되어 클라이언트 UI 와 VFX 동기화를 돕는다.
Blackboard 는 인메모리 캐시이며, 변경 발생 시 필요에 따라 CharacterInfo 값도 갱신한다.
서버 성능 전략
- 틱 스케줄링:
MobAISupervisor 가 몹을 HumanoidRootPart:GetAttribute("MobTickBucket") 값으로 분할해 프레임마다 일정 수만 업데이트한다.
- 원거리 휴면: 플레이어와의 거리가
StreamingMinDistance 를 초과하면 Controller:Pause() 로 인지/의사결정 업데이트를 중단하고, Controller:Resume() 으로 재활성화한다.
- 경량 판정: 공격 판정은 전용
HitboxService 와 통합해, AI 모듈 자체에서는 명령만 발행한다.
- 성능 레벨: 각 몹은
CharacterInfo/MobAIInfos/PerformanceLevel(StringValue) 을 통해 High, Medium, Low 등 단계별 모드를 선언한다.
High: PathfindingService 를 기본으로 사용하며 이동 경로 재계산 주기를 짧게 설정한다.
Medium: 오차 허용치를 늘린 경량 PathfindingService 호출과 간단한 회피 로직을 결합한다.
Low: PathfindingService 호출을 최소화하고, 격자 기반 혹은 단순 직선 추적-좌우 회피 알고리즘으로 대체한다.
Controller 는 PerformanceLevel 에 따라 내부 업데이트 주기, 센서 정밀도, 행동 큐 길이를 다르게 조정해 복잡한 맵에서도 전체 성능 목표(예: 60 FPS)를 유지한다.
확장 및 테스트
- 단위 테스트: 각 컴포넌트를
lune test 나 예정된 테스트 러너로 검증할 수 있도록, 외부 의존성을 인터페이스화한다.
- 시 뮬레이션 도구:
ServerScriptService/TestTools/MobAISimulator 를 마련해 개발 중 맵에서 N 개 몹을 스폰하고 행동 로그를 ServerStorage/Logs 폴더에 기록한다.
- 장애 대응:
MobAISupervisor 가 주기적으로 컨트롤러 건강 상태를 체크하고, Controller:IsDestroyed 가 true 인 경우 자동 재생성한다.