🎮Unreal4/C++ 55

[UE4] EnemyAI -8 : 회피(Avoid) - EQS, Warp (UEnvQueryContext)

원거리 Enemy는 Target이 일정범위 이상 가깝게 다가오면 회피를 수행하도록 구현했다. 이때, 회피는 플레이어가 사용하던 Warp 무기를 사용하였다. 💻 DoAction_Warp 클래스 수정하기 플레이어만 사용하던 DoAction_Warp 클래스를 Enemy도 함께 사용하기 위해 조금 수정해주었다. 공격을 시작하는 Begin_DoAction 함수에서 PlayerController의 NULL 판단을 통해 해당 함수를 호출하는 Owner가 플레이어인지, Enemy인지 구분하였다. Enemy인 경우, Behavior 컴포넌트에 블랙보드 키 값으로 저장해둔 Avoid Location을 불러와 캐릭터의 위치를 변경해주었다. 위에서 말한 블랙보드의 회피 위치 키 값은 Vector 자료형으로 선언하였다. 여기서..

🎮Unreal4/C++ 2023.08.09

[UE4] EnemyAI -7 : 원거리 Enemy(Range), Bow

원거리 공격을 수행하는 Range EnemyAI를 구현해보았다. 무기는 활을 이용하여 공격하도록 만들었다. 💻 Range Service Range Enemy의 비헤이비어 트리를 구성하기 앞서 BTService 를 상속받는 CBTService_Range 클래스를 생성하였다. 근거리 Enemy(Melee)와 달리 원거리 몬스터는 공격 범위가 아닌 회피 범위(Avoid Range)를 변수로 갖는다. Service 클래스에서 주기적으로 호출되는 TickNode 함수에선 Avoid의 범위를 눈으로 파악할 수 있는 실린더 라인을 그리거나, Enemy AI의 상태(aiState)를 변경하는 소스코드를 작성하였다. Enemy가 Hitted 상태라면 SetHittedMode 상태로 설정하고, 블랙보드의 Target 객체..

🎮Unreal4/C++ 2023.08.09

[UE4] EnemyAI -6 : Action, AbortTask

Enemy AI의 공격 기능을 구현하기 위해 Action Task 클래스를 작성하였다. 💻 CBTTaskNode_Action ExecuteTask 함수에서는 Owner의 Weapon Component를 불러와서 현재 장착중인 무기의 공격을 수행하도록 DoAction 함수를 실행시켜주었다. Enemy가 공격하는 도중에 Task_Action이 성공 또는 실패되어 종료된다면, 다음 Task 노드로 흐름이 바뀌기 때문에 공격하고 나서는 EBTNodeResult를 대기 상태인 InProgress로 반환해준다. 실제로 Task_Action 노드를 끝내는 처리는 Tick 함수에서 진행한다. TickTask 함수에서는 Enemy가 공격을 끝내고 다시 Idle Mode가 되었는지, 현재 공격이 실행중인지를 나타내는 bI..

🎮Unreal4/C++ 2023.07.27

[UE4] EnemyAI -5 : Appoach, Equip (WeaponAsset 공유 문제, WeaponData)

Enemy AI의 공격(Action) 기능을 구현해보았다. 가장 먼저, 공격하기 위해선 무기를 장착해야 하기 때문에 Task_Equip 클래스를 작성하였다. 💻 CBTTaskNode_Equip Equip ExecuteTask 에서는 EnemyAI가 가지고 있는 Weapon Component를 참조하여, SetSwordMode를 적용시켜 주었다. Tick 함수에서는 Enemy_AI의 State Component가 Idle 모드인 경우 Equip Task를 성공으로 종료시키도록 하였다. Sword 모드의 장착이 끝나면 자연스럽게 Idle 모드로 전환되기 때문이다. ❌ Equip 발동 시 문제점 : Weapon Asset 공유 문제 Equip 발동 시 나타나는 문제점이 있는데, 바로 두명의 Enemy와 Pla..

🎮Unreal4/C++ 2023.07.17

[UE4] Enemy AI 추적 문제점 - 동일한 지점 순찰 (Patrol Path 공유문제)

이전 시간에 구현해두었던 Enemy AI의 추적(Patrol) 기능에 한 가지 문제점이 발생하였다. 한 명의 Enemy만 추적을 수행하면 아무런 문제가 없는 듯 보이지만, 두 명의 Enemy를 각각 배치하고, 서로 다른 Patrol Path 액터(Spline Component가 포함된 경로 액터)를 지정해주면 바로 문제점이 나타났다. 원하던 기능은 각각의 Enemy가 할당된 Spline Component를 따라 순찰하는것이었지만, 실제로는 두 Enemy가 똑같은 SplineComponent를 순찰하며 서로에게 할당된 Spline을 번갈아가며 랜덤하고 이상하게 순찰이 진행되었다. 문제점은, 작성한 Patrol Task 클래스에서 이동할 위치 변수인 FVector Location 값이 두 Enemy에게 공유..

🎮Unreal4/C++ 2023.07.17

[UE4] EnemyAI -4 : 서비스, 순찰 Task 만들기 (EBTNodeResult, USplineComponent, FNavigationSystem, EPathFollowingRequestResult, FinishLatentTask)

본격적인 근접 몬스터 Enemy_Melee의 Behavior Tree를 만들기 위해 BTService 클래스를 제작하였다. 🖥️ BTService_Melee 클래스 생성 BTService를 상속받는 CBTService_Melee 클래스를 제작하였다. TickNode를 오버라이드하여 사용했는데, 여기서 UBehaviorTreeComponent의 OwnerComp 매개변수는 AIController가 된다. UBehaviorTreeComponent가 컨트롤러에 존재하기 때문에 해당 컴포넌트의 Owner는 AIController가 출력될 것이다. AIController를 통해서는 GetPawn 함수를 통해 Enemy_AI 캐릭터를 가져올 수 있다. Enemy_AI 캐릭터를 통해서는 캐릭터가 가지고 있는 Stat..

🎮Unreal4/C++ 2023.07.08

[UE4] EnemyAI -3 : 시야 감지, TeamID (UAIPerceptionComponent, UAISenceConfig_Sight, IGenericTeamAgentInterface)

EnemyAI의 첫번째 기능으로 적 감지 기능을 구현해보았다. 🕶️ AI Perception Component AIController 클래스에 감지 역할을 수행하는 UAIPerceptionComponent를 선언하였다. OnPerceptionUpdated 함수는 UAIPerceptionComponent에 존재하는 Perception->OnPerceptionUpdated 델리게이트에 등록하기 위한 함수이다. 또한 감지의 종류 중 하나인 '시야 감지'를 구현하기 위해 UAISenceConfig_Sight 변수를 선언해주었다. 시야 감지 말고도 소리, 데미지 감지 등등은 모두 UAISenseConfig를 상속받아 구현되어져 있다. AIController의 생성자에서는 Perception Component를 초..

🎮Unreal4/C++ 2023.07.06

[UE4] EnemyAI -2 : WidgetComponent 붙이기 (Enemy Name, Controller Name, HealthBar)

이번 게시글에서는 EnemyAI의 정보를 출력하는 UI를 만들고, 띄우는 방법에 대해 정리하였다. 🎨 UI 만들기 : EnemyAI 정보, 체력바 Enemy AI 위에 Enemy의 정보와 HealthBar를 표시하기 위한 위젯을 생성하였다. (Text와 Border, ProgressBar 이용) 위젯 블루프린트의 부모로 CUserWidget_Label 클래스를 생성하였다. 위젯 블루프린트의 그래프 탭에서 코드를 작성할 수 있도록 BlueprintImplementableEvent 속성을 부여한 함수들을 선언하였다. 이후, 위젯 블루프린트에서 각 함수들의 내용을 구현해주었다. 🖼️ UI 붙이기 : WidgetComponent 이렇게 완성된 Label 위젯은 Enemy_AI 클래스의 WidgetComponen..

🎮Unreal4/C++ 2023.07.06

[UE4] EnemyAI -1 : BehaviorTree, BlackBoard, AIController

Enemy AI 전투를 구현하기 위해 EnemyAI 클래스를 생성하였다. 💻 CEnemyAI 클래스 생성 CEnemy_AI 클래스에는 비헤이비어 트리 객체와, 공격을 위한 Weapon 컴포넌트, AI의 전반적인 기능을 구현한 Behavior 컴포넌트가 있다. 📺 비헤이비어 트리, 블랙보드 가장 먼저, 근접 Enemy인 Melee Enemy를 구현하기 위해 비헤이비어 트리인 BT_Melee와, 블랙보드인 BB_Melee를 각각 생성하고 연결해주었다. BB_Melee 블랙보드에는 EnemyAI 가 공격 대상으로 삼을 Target(Character형)과, 이동 위치(Location)을 키 값으로 갖는다. (추후에 Behavior Tree Enum값이 추가될 예정이다.) 📦 Behavior Component B..

🎮Unreal4/C++ 2023.07.03

[UE4] Feet IK 구현하기 (InverseKinemetics)

계단을 오르거나 언덕을 오를 때 자연스러운 발의 위치와 회전을 위해 Foot IK를 구현해보았다. 📦 Feet Component 제작 Foot IK 기능을 구현할 Feet Component를 제작하였다. IK 속성 값으로는 보간속도(Interp Speed), IK 적용 거리(Trace Distance), 발을 띄워줄 간격(Offset Distance), 왼발 소켓, 오른발 소켓을 지정하였다. 📦 Feet Data 구조체 생성 Feet Component 클래스 안에는 IK 연산에 필요한 변수 값들을 저장할 구조체 FFeetData를 선언해두었다. 각 Distance와 Rotation은 발이 바닥까지 내려갈 거리와, 바닥에 발을 딛었을 때 자연스럽게 회전될 방향을 저장하는 것이다. 왼발과 오른발을 각각 구하..

🎮Unreal4/C++ 2023.06.29
728x90