EQS(Environment Query System)는 개발자들이 게임 세계의 환경에 대한 복잡한 쿼리를 수행할 수 있게 해주는 언리얼 엔진의 강력한 도구이다. EQS는 AI 행동 트리와 연계해 사용하도록 설계돼 게임 내 AI 에이전트의 빠르고 효율적인 의사결정이 가능하다.

 

목차

     

     


     

     

    EQS (Environment Query System)

     

    EQS(Environment Query System)는 개발자들이 게임 세계의 환경에 대한 복잡한 쿼리를 수행할 수 있게 해주는 언리얼 엔진의 강력한 도구이다. EQS는 AI 행동 트리와 연계해 사용하도록 설계돼 게임 내 AI 에이전트의 빠르고 효율적인 의사결정이 가능하다.

    EQS를 사용하여 개발자는 "가장 가까운 적은 어디인가?" 또는 "근처에서 가장 안전한 커버는 무엇인가?"와 같은 게임 세계에 대한 질문을 작성할 수 있다 이러한 쿼리는 게임 및 AI 에이전트의 특정 요구에 맞게 사용자 지정할 수 있다.

    EQS 쿼리는 비주얼 에디터를 사용하여 생성할 수 있으므로 개발자가 코드를 작성할 필요 없이 복잡한 쿼리를 쉽게 설계할 수 있다. 이 편집기를 사용하면 개발자는 미리 구축된 쿼리 유형의 범위에서 선택하거나 규칙과 점수 시스템의 조합을 사용하여 자신만의 사용자 지정 쿼리를 만들 수 있다.

    쿼리가 생성되면 AI 행동 트리에서 사용하여 AI 에이전트에게 의사 결정 기능을 제공할 수 있다. 예를 들어 AI 에이전트는 쿼리를 사용하여 화재 진압에 사용할 최적의 커버를 식별하거나 가장 가까운 헬스 팩을 찾을 수 있다.

    전반적으로 EQS는 개발자가 게임에서 정교한 AI 동작을 만들 수 있도록 하는 강력한 도구로, 보다 몰입적이고 도전적인 게임 플레이 경험을 제공한다.

     

     

    0. BP_Enemy
    - StateComponent
    0. BP_AIController_EQ 0. BB_AI
    0. BT_EQ
    1. BP_Enemy_AI
    - WeaponComponent
    - MovingComponent
    - BehaviorTree (Behavior Tree)
    ---------------------
    0. BP_
    ---------------------
    1. BTService_
    2. BP_Enemy_AI_EQ -------------------------
    0. EQExam
    -------------------------
    2. BTTask_
    2. BTTask_
    2. BTTask_

     

    BP_Enemy_AI_EQ

    BP_AIController_EQ

    BT_EQ

    생성


     

    BP_Enemy_AI_EQ 생성

     

    BP_Enemy_AI을 상속받는 BP_Enemy_AI_EQ 생성

    • Behavior Tree: BT_EQ 지정
    • Pawn - AI Controller Class - BP_AIController_EQ 지정

     

    BB_AI - 새 키 추가(EQ_Location)

     

    • 새 키 추가: EQ_Location (Vector)
      • 위치를 다루는 키값을 추가해서 EQS에 활용한다.

     

     

    EnvQueryContext_Player 생성

     

    Blueprint Class - EnvQueryContext_BlueprintBase - EnvQueryContext_Player 생성

    • EnvQueryContext_BlueprintBase는 EnvQueryContext를 상속받는다.

     

     

    Provide Single Actor (const)

    • 함수 오버라이드로 Provide Single Actor를 생성한다.
    • 참고)
      • Provide Actors: 여러개의 Actor를 주어 판단하겠다.
      • Provide Locations: 여러개의 Location을 주어 판단하겠다.
      • Provide Single Actor: 하나의 Actor를 주어 판단하겠다. 

     

    EQ_Exam 생성

     

    Quarrier = 질의하는 주체. 주로 Enemy_AI로 설정한다.

     

    • Generator: 질의하는 공간을 설정해준다.
      • Grid Half Size: Grid 반 사이즈. 1000.0이면 2000.0 크기의 그리드가 생성된다.
        • Data Binding: 외부에서 EQS에 변수로 줄 때 식별자로 사용.
          • Query Params: 외부에서 EQS에 변수로 줄 때 식별자로 사용.
          • Random number: Min~Max 사이의 랜덤값으로 그리드가 그려진다. 그리드가 실시간으로 변경된다.
      • Space Between: 100 단위로 아이템(그리드 구형 모양)이 깔린다.

     

     

    • Test
      • Test Purpose
        • Filter Only: 필터링만 사용. 사용할 일 거의없음.
        • Score Only: EQS 점수를 도출하여 점수값을 사용한다. 예를들어, 가장 높은값을 목적지로 설정하게 만들어 Enemy를 이동시키게 할 수 있다.
        • Filter and Score: Filter와 Score 방식 모두 사용. 점수를 매긴 후 필터링하여 값을 사용한다.
    • Distance
      • Test Mode: Distance 2D, Distance 3D, Distance Z가 있다. 
      • Distance To: Querier의 거리를 판단한다. 
    • 필터
      • Filter Type: Range(범위 설정), Minimum(최소값 설정), Maximum (최대값 설정)
        • ex. Minumum 300.0이면 거리 300.0 이하인 EQ를 잘라내겠다는 의미.
        • 필터링 된 곳은 뷰포트에 파란색으로 표시되며 거리를 연산하지만 점수는 매기지 않는다.
    • Score
      • Clamping
        • Score Equation
          • Inverse Linear: 가까운 곳부터 찾겠다. 점수: 가까운곳 1. 가장 먼곳 0.
        • Score Factor: 점수 범위
          • ex. Score Factor가 5.0이면 0~5.0 사이의 점수값을 갖는다.

     

     

    Line A와 Line B를 내적한다. 내적의 범위는 -1~1이다. 하지만 여기서의 결과값은 0~1이다. 

    • Line A
      • Line From: 중심이 되는 주체. 
      • Line To: 라인을 쏘는 방향. ex. Item, Player
    • LIne B
      • Line From: 중심이 되는 주체. 
      • Line To: 라인을 쏘는 방향. ex. Item, Player
    • Absolute Vale
      • 체크 Off: 앞뒤 0, 좌우 1.
      • 체크 On: 앞뒤 1. 좌우 0.
      • 주의 ※ Scorioing Factor 값이 변하면 값의 범위는 0 ~ (1 * Scoring Factor)값이다.

    Score

    • Linear: 정면 1, 후면 0
    • Inverse Linear : 정면 0, 후면 1

     

     

    • Trace Data
      • Trace Channel: Visibility
      • Trace Shape: Line, Box, Sphere, Capsule
        • Trace가 닿는지 검사할 때 사용하는 모양이다.
        • LIne이 간단하여 많이 사용하나 정밀한 계산이 필요할 때는 다른 모양도 사용한다.
    • Bool 일치: 값이 뒤집어진다. 0이 1이 되고 1이 0이 된다.

    Line Trace를 사용하여 벽과 같은 장애물로 보이지 않는 공간을 체크할 수 있다.

     

     

     

     


     

     

    BT_EQ

     

    Run EQS Query

    • Node: 수정할일 없다. UE5에서는 항목에서 빠졌다.
    • 블랙보드
      • Blackboard Key: 공간 질의해서 리턴된 Key값
      • Query Template: 만들어준 Query Template을 넣어준다.

     


     

    실행화면

     

     

    키보드 조작법

    • ' :  정보 뷰포트에 출력
    • 3 :  EQS 뷰포트에 출력. 작은 구형모양으로 나온다. EQS 범위 내에 없으면 보이지 않는다.

     


     

     

     

     

    EQS - Range

     

     


     

    EQ_Avoid 생성

     

    인공지능 - 인바이러먼트 쿼리 - EQ_Avoid 생성

     

    On Circle: EnvQueryContext_Player 중심으로 항목을 원형으로 생성

    • Data Binding: Random number 설정
      • Min: 800.0
      • Max: 1200.0
    • Space Between: 200.0
    • Points on Circle Spacing Method: By Space Between 설정
    • 원 중앙: EnvQueryContext_Player 설

     


     

    BT_Range - EQS Query 추가

     

    EQS

    • EQS Request
      • Query Template: EQ_Avoid 설정.
    • Query Config
      • Run Mode: Single Random Item from Best 25%로 설정 (=점수 상위 25% 내에서 선택하겠다)

     


     

    실행화면

    •  

     

    • BP_Enemy_Range가 BP_Player 뒤쪽의 공간으로 Warp 이동.

     


     

     

     

     

    ABP: Animation Blueprint
    AN: Blueprint Class AnimNotify
    ANS: Blueprint Class - AnimNotifyState

    AO: Aim Offset

    BP: Blueprint Class
    BS: Blend Space

    BF: Blueprint Function Library
    CS: Matinee Camera Shake
    E: Enum 열거형
    DT: Data Table
    F: 구조체

    I: Blueprint Interface

    WB: Widget Bluepprint

     

    UE2212_02

      Level - LEVEL
    ABP_Player
    BP_GameMode
    BF_Helper
    IDamage
     
    AdvancedMagicFX12
    Materials  
    Meshes  
    Particles  
    Textures  
    Character Animation Bow
    Common
    Fist
    Hammer
    Parkour
    Sword
    Unarmed
    Wizard
    BlendSpaces BS_Bow
    BS_Fist
    BS_Hammer
    BS_Sword

    BS_Unarmed
    BS_Wizard
    Materials

    MaterialLayers
    M_UE4Man_Body
    M_UE4Man_ChestLogo
    Mesh SK_Mannequin
    SK_MAnnequin_PhysicsAsset
    Skel_Mannequin

    Montages
    Around Around_Montage
    Bow AR_DrawBow_Montage
    AR_ShootAndDraw_Montage
    Common HitReaction_Move_Montage
    HitReaction_Stop_Montage
    Fist Fist_Attack_1_Montage
    Fist_Attack_2_Montage
    Fist_Attack_3_Montage
    Fist_Hitted_Montage
    Hammer Frank_RPG_2Hand_Combo01_1_Montage
    Frank_RPG_2Hand_Combo01_2_Montage
    Frank_RPG_2Hand_Combo01_3_Montage
    Frank_RPG_2Hand_Combo01_4_Montage
    Parkour Run_Climb_Montage
    Sword Draw_Sword_Montage
    Sword_Attack_1_Montage
    Sword_Attack_2_Montage
    Sword_Attack_3_Montage
    Warp Warp_Montage
    Enemy_DeadFall_Montage
    HitReaction_Montage
     
    Textures UE4_LOGO_CARD
    UE4_Mannequin__normals
    UE4_Mannequin_MAT_MASKA
    UE4Man_Logo_N
    Weapons Elven Bow
    Greate Hammer
    Sword
    Component EStateType
    MovingComponent
    StateComponent
    WeaponComponent
    FeetComponent
    TargetComponent
       
    Effects P_Cube_Mesh_Test
    P_Genno_Weapon_Lightning_01
       
    Enemies Basic BP_AIController_Basic
    BP_Enemy_AI_Basic
    BT_Basic
    BT_Move
     
    EQ BP_AIController_EQ
    BP_Enemy_AI_EQ
    BT_EQ
    EQ_Exam
     
    Melee BP_AIController_Melee
    BP_Enemy_AI_Melee
    BP_PatrolPath

    BT_Melee
    BTService_Melee
    BTTask_Patrol
    PatrolComponent
     
    Tasks BTTask_Speed
    BTTask_Equip
     
    BB_AI
    BP_Enemy
    BP_Enemy_AI
       
    Environment
    Materials Textures  
    Meshes    
    Obstacle    
    InfinityBladeEffects
    Effects
    FX_Combat_Base  
    FX_Materials  
    FX_Meshes  
    FX_Monsters  
    FX_Textures  
    FX_Textures_IB  
    Masters  
    Materials M_Mesh
    M_White_Inst
    M_Red_Inst
    M_Green_Inst
    M_Blue_Inst
    M_UE4Man_Body_Inst
    M_UE4Man_ChesLogo_Inst
       
    Meshes Cone_2
    Cube_2
    Cylinder_2
    Sphere_2
       
    Notifies ANS_Equip
    ANS_Combo
    ANS_Collision
    AN_BeginAction
    AN_EndAction
    AN_CameraShake
    AN_End_BowString
    AN_EndParkour
       
    Parkour EParkourArrowType
    EParkourType
    FParkourData
    ParkourComponent
    ParkourData
       
    Player BP_Player
    FZoomData
       
    Sounds S_BGM
    S_HitPunch
    S_OneHand_Hit
       
    Textures Crosshair
    T_Around
    T_Black
    T_Bow
    T_Fireball
    T_Fist
    T_Hammer
    T_Sword
    T_Warp
       

     
    Weapons
    Around Around_FireBall
    Around_FireBall1
    Around_IceBall
    Around_IceBall1
    DT_DoAction_Around
    DT_Equip_Around
    DT_HitData_Around
    Skill_Around
    Weapon_Around
     
    Bow AO_Aim
    Curve_Aim
    DT_DoAction_Bow

    DT_Equip_Bow
    DT_HitData_Bow
    FAimData
    Skill_Aim
    Skill_Arrow
    Weapon_Bow

     
    FireBall DT_DoAction_FireBall
    DT_Equip_FireBall
    DT_HitData_FireBall

    Skill_FireBall
    Weapon_FireBall
     
    Fist Combo_Fist - Blueprint Class Actor Weapon_Combo 상속
    CS_Fist
    DT_DoAction_Fist

    DT_Equip_Fist
    DT_HitData_Fist
     
    Hammer Combo_Fist - Blueprint Class Actor Weapon_Combo 상속
    CS_Hammer
    DT_DoAction_Hammer
    DT_Equip_Hammer
    DT_HitData_Hammer

     
    Sword Combo_Sword - Blueprint Class Actor Weapon_Combo 상속
    CS_Sword
    DT_DoAction_Sword
    DT_Equip_Sword
    DT_HitData_Sword
     
    Warp Weapon_Warp -  Blueprint Class Actor Weapon 상속
    DT_DoAction_Warp

    DT_Equip_Warp
     
    EWeaponType
    FDoActionData
    FEquipData
    FHitData
    Weapon - Blueprint Class Actor
    Weapon_Combo - Blueprint Class Actor Weapon 상속
    M_Weapon
    Skill
       
    Widget WB_CrossHair
    WB_Menu
    WB_MenuButton
    WB_Name