전체 글 403

[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

[백준/C++] 1992번 : 쿼드트리 (분할정복 연습)

쿼드트리 문제 흑백 영상을 압축하여 표현하는 데이터 구조로 쿼드 트리(Quad Tree)라는 방법이 있다. 흰 점을 나타내는 0과 검은 점을 나타내는 1로만 이루어진 영상(2차원 배열)에서 같은 숫자의 점들이 한 곳에 많이 몰려있으면, 쿼드 트리에서는 이를 압축하여 간단히 표현할 수 있다. 주어진 영상이 모두 0으로만 되어 있으면 압축 결과는 "0"이 되고, 모두 1로만 되어 있으면 압축 결과는 "1"이 된다. 만약 0과 1이 섞여 있으면 전체를 한 번에 나타내지를 못하고, 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래, 이렇게 4개의 영상으로 나누어 압축하게 되며, 이 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표현한다 위 그림에서 왼쪽의 영상은 오른쪽의 배열과 같이 숫자로 주어지며, 이..

[백준/C++] 18870번 : 좌표 압축 (vector - unique, erase, lower_bound)

좌표 압축 문제 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자. 입력 첫째 줄에 N이 주어진다. 둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다. 출력 첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다. 제한 1 ≤ N ≤ 1,000,000 -109 ≤ Xi ≤ 109 예제 입력 1 5 2 4 -10 4 -9 예제 출력 1 2 3 0 3 1 예제 입력 2 6 1000 999 1000 ..

[참고자료] 라이브러리 함수들의 시간복잡도

#include sort(begin, end) / sort (begin, end, compFunction) -> 퀵정렬과 힙정렬을 이용 시간 복잡도 : O(N logN) stable_sort(begin, end) 시간 복잡도 : 충분한 메모리가 있다면 O(N logN), 충분한 메모리가 없다면 O(N logN^2) partial_sort(begin, begin+index, end) : 전체 배열에서 1~index 원소 까지만 정렬 시간 복잡도 : O(N logM) (전체 원소 개수 N, index의 크기 M) binary_search(begin, end, findValue) 시간 복잡도 : O(log N) lower_bound(begin, end, findValue) -> binary_search를 이용..

[백준/C++] 10815번 : 숫자 카드 (binary_search)

숫자 카드 문제 숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져..

[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

[백준/C++] 10814번 : 나이순 정렬 (stable_sort)

나이순 정렬 문제 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다. 출력 첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출..

[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

[백준/C++] 1012번 : 유기농 배추 (DFS/BFS 연습)

유기농 배추 문제 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다. 한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배..

[백준/C++] 2606번 : 바이러스 (DFS/BFS 연습)

바이러스 문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다. 어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴..

728x90