Skip to main content

개요

  • CharacterModules 기반 캐릭터 생성 흐름을 그대로 활용하면서, 몹 전용 AI 를 서버 권한으로 구동한다.
  • MobAI 는 서버에서만 상태를 결정하고, 필요한 최소 정보만 CharacterInfo 를 통해 클라이언트에 스트리밍한다.
  • 인지(Perception) → 의사결정(Decision) → 실행(Action) 3단계를 모듈로 나누어 유지보수성과 테스트 용이성을 확보한다.

설명

시스템 범위

  • 적용 대상: CollectionServiceCharacter 태그가 붙은 비플레이어 Model.
  • 선행 조건: CharacterModel 또는 맵 배치 도중 생성된 몹에게 CharacterInfo 기반 데이터 구조가 할당되어 있어야 한다.
  • 목표: 몰입감 있는 추적/탐색/전투 행동을 제공하면서, 다양한 몹 타입을 컴포넌트 조합으로 확장할 수 있도록 한다.

구동 구조

  1. ServerScriptService.MobControllers 에서 MobAISupervisor 스크립트를 실행해 모든 몹을 감시한다.
  2. MobAISupervisorCollectionService:GetTagged("Character") 감시를 통해 몹 모델을 찾고, 플레이어가 아닌 모델만 필터링한다.
  3. 모델별로 CharacterModules.MobAI.Controller 를 생성하여, 인지/의사결정/행동 컴포넌트를 주입한다.
  4. ControllerRunService.Heartbeat 기반의 짧은 틱(예: 0.1초)과 RunService.Stepped 위임을 조합해 경량 업데이트 루프를 유지한다.
  5. 출력된 행동 명령은 MobActionRunner 가 실제 Humanoid 또는 애니메이션, 스킬 시스템에 전달한다.

모듈 구성

  • CharacterModules.MobAI.Controller
    • 한 몹의 AI 전체 생명주기를 관리한다.
    • 의존성: Perception, DecisionPlanner, ActionRunner, Blackboard.
    • MobAIController.new(params: MobAIControllerParams) 로 생성하며, params 는 캐릭터 모델, 컴포넌트 템플릿, 초기 상태를 포함한다.
  • CharacterModules.MobAI.Blackboard
    • 몹 개체별 상태 저장소.
    • CharacterInfoMobAIInfos 폴더와 연결되어 서버-클라이언트 동기화 범위를 제어한다.
    • 주요 키: Target(Player 혹은 Model), AlertLevel, LastSeenPosition, SkillCooldowns.
  • CharacterModules.MobAI.Perception
    • 시야, 청각, 피해 히트박스 등 센서 데이터를 수집한다.
    • RaycastParamsWorkspace:GetPartBoundsInRadius 등을 사용해 근접 오브젝트를 감지하고, 결과를 Blackboard 에 갱신한다.
  • CharacterModules.MobAI.DecisionPlanner
    • 상태 머신과 유사한 규칙 엔진을 구성한다.
    • 입력: Blackboard 정보, 몹 고유 설정(MobProfile).
    • 출력: ActionCommand(Chase, Search, Idle, Attack, Flee 등).
    • 우선순위 기반 규칙(예: 체력이 낮으면 Flee) 과 플러그형 전략(예: 원거리 몹은 MaintainDistance) 을 지원한다.
  • CharacterModules.MobAI.ActionRunner
    • 결정된 ActionCommand 를 실제 동작으로 변환한다.
    • PathfindingService 를 통해 이동 경로를 계산하고, Humanoid:MoveTo 또는 루트모션 애니메이션을 실행한다.
    • 전투 명령은 MobSkillServiceMobWeaponController 와 연동하도록 어댑터 레이어를 둔다.

데이터 플로우

  • 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 호출을 최소화하고, 격자 기반 혹은 단순 직선 추적-좌우 회피 알고리즘으로 대체한다.
  • ControllerPerformanceLevel 에 따라 내부 업데이트 주기, 센서 정밀도, 행동 큐 길이를 다르게 조정해 복잡한 맵에서도 전체 성능 목표(예: 60 FPS)를 유지한다.

확장 및 테스트

  • 단위 테스트: 각 컴포넌트를 lune test 나 예정된 테스트 러너로 검증할 수 있도록, 외부 의존성을 인터페이스화한다.
  • 시뮬레이션 도구: ServerScriptService/TestTools/MobAISimulator 를 마련해 개발 중 맵에서 N 개 몹을 스폰하고 행동 로그를 ServerStorage/Logs 폴더에 기록한다.
  • 장애 대응: MobAISupervisor 가 주기적으로 컨트롤러 건강 상태를 체크하고, Controller:IsDestroyedtrue 인 경우 자동 재생성한다.