전체 글 63

[UE5 개발일지] 친구 합류와 구조 완료를 분리하기 — 이벤트와 Actor 생명주기 정리

친구를 발견하면 편대에 합류해 플레이어를 따라오고, 함께 있는 동안 공동 최대 HP 보너스를 제공한다. 하지만 합류만으로 구조가 끝나는 것은 아니다. 안전지대까지 데려가 파견해야 구조가 완료된다.앞선 작업에서는 최대 세 마리 편대, 안전지대 안에서 E로 편대 전원을 파견하는 기능, 합류·파견에 따른 공동 HP 보너스 추가와 제거를 구현했다.그런데 구조 집계는 여전히 친구의 Following 전환을 기준으로 동작하고 있었다. 편대에 합류하기만 해도 구조 목표가 올라가면서, 실제 파견 행동과 미션 판정이 맞지 않았다.이번 작업에서는 구조 성공을 집계하는 시점을 파견 성공으로 옮겼다. 기존 편대·공동 HP 정리 흐름에 구조 이벤트와 친구 Actor 제거를 연결하고, 안전지대 중첩 처리도 보완했다.새로운 기능을..

std::list — 양방향 연결 리스트 컨테이너

std::vector는 연속된 메모리를 사용하기 때문에 Random Access와 순차 탐색 성능이 뛰어나다.하지만 중간에 원소를 삽입하거나 삭제하면 뒤쪽 원소를 이동해야 한다. std::list는 이러한 문제를 다른 방식으로 해결한다.원소를 연속적으로 저장하는 대신 각각의 원소를 독립적인 Node로 만들고, Node끼리 연결한다.이번 글에서는 std::list의 구조와 특징, Iterator 안정성, splice()와 sort() 같은 고유 기능을 살펴보고 마지막으로 vector와 비교한다. 1. std::list가 필요한 이유1-1. vector의 중간 삽입·삭제 비용vector는 원소를 연속해서 저장한다.[10][20][30][40] // 20과 30 사이에 25를 넣으려면 ↓[10][..

std::vector — 동적 배열 컨테이너

좋아. 이번 글은 범위가 꽤 넓어서, vector를 중심으로 설명하고 std::array는 비교용으로 붙이는 구조가 가장 좋다.다만 지금 초안에는 몇 군데 사실관계와 표현을 다듬는 게 좋다.vector 성장 배율을 1.5~2.5배라고 고정적으로 쓰면 안 됨. 표준은 성장 배율을 규정하지 않는다.push_back()의 시간복잡도는 “평균 O(1)”보다는 "amortized O(1)" (애머타이즈드)이라고 쓰는 게 정확하다.resize()는 size를 변경하지만 필요하면 capacity도 증가할 수 있다.shrink_to_fit()은 capacity를 줄이는 non-binding request다.insert()/erase()의 invalidation은 단순히 “이후 iterator 무효화”가 아니라 real..

STL(Standard Template Library)이란?

C++에서 vector, list, map, sort 등을 사용하다 보면 자연스럽게 STL(Standard Template Library)이라는 용어를 접하게 된다.STL은 단순히 여러 자료구조를 모아놓은 라이브러리가 아니다.컨테이너에 데이터를 저장하고, Iterator를 통해 접근하며, Algorithm이 Iterator를 기준으로 동작하도록 구성한 범용 라이브러리 설계라는 점이 핵심이다. 이번 글에서는 STL이 등장한 배경과 주요 구성 요소를 먼저 정리한다. 1. STL의 등장 배경C에서는 연결 리스트, 스택, 큐와 같은 자료구조가 표준 라이브러리의 범용 컨테이너 형태로 제공되지 않기 때문에 필요한 자료구조를 직접 구현하거나 별도의 라이브러리를 사용해야 했다.정렬이나 탐색의 경우 qsort, bsea..

Spline 기반 3요소 조향 알고리즘

자동차가 Spline 위의 한 점만 바라보게 하면 경로를 따라 움직일 수는 있다. 하지만 속도가 높아지거나 커브가 급해지면 차량이 도로 중심을 크게 벗어나거나 조향이 늦게 시작되는 문제가 나타난다.이 문제를 줄이기 위해 전방 목표 위치, Spline의 진행 방향, 도로 중심선 이탈 거리를 함께 사용하는 조향 로직을 구현했다. 이 글에서는 USplineFollowerComponent에서 사용한 Position Delta, Heading Delta, Crosstrack Error의 계산 과정과 각 요소를 결합한 이유를 정리한다. 위 GIF는 이 글에서 설명할 세 가지 조향 요소를 모두 적용한 최종 상태다. 차량은 전방 목표점을 따라가면서 Spline의 진행 방향을 미리 반영하고, 중심선에서 이탈하면 Cro..

C++ static 정리 — 정적 지역 변수부터 정적 멤버 변수와 함수까지

C++에서 static을 처음 배우면 조금 혼란스럽다.함수 안에서도 사용할 수 있고, 전역 변수에도 붙일 수 있으며, 클래스의 멤버 변수와 멤버 함수에도 붙일 수 있기 때문이다.static int Value;class Cat{ static int Count; static void PrintCount();};모두 같은 static이라는 키워드를 사용하지만 의미가 완전히 동일한 것은 아니다. 특히 static = 프로그램이 끝날 때까지 살아 있는 변수라고만 기억하면 파일 범위 static이나 정적 멤버 함수를 설명하기 어려워진다.그래서 이번에는 static을 어디에 사용했는가를 기준으로 나누어 정리해봤다. 변수의 수명과 범위변수를 이해할 때는 수명(storage duration)과 범위(scope..

C++ extern과 파일 범위 static — 다른 cpp 파일의 변수는 어떻게 연결될까?

C++ 프로젝트가 커지면 하나의 소스 파일에 모든 코드를 작성하지 않고 여러 .h, .cpp 파일로 나누게 된다.이때 한 가지 궁금증이 생긴다.// A.cppint GValue = 10;A.cpp에 만들어 둔 GValue를 B.cpp에서도 사용하려면 어떻게 해야 할까?반대로 어떤 전역 변수는 해당 cpp 파일 안에서만 사용하고 외부에서는 접근하지 못하게 만들고 싶을 수도 있다. 이때 등장하는 것이 extern과 파일 범위에서 사용하는 static이다.두 키워드를 이해하려면 단순히 "전역 변수를 공유한다", "접근을 막는다"라고 외우기보다 선언과 정의, 그리고 링키지(linkage)를 함께 이해하는 것이 좋다. 선언과 정의먼저 extern을 이해하려면 선언과 정의의 차이를 알아야 한다.선언선언은 컴파일러에..

C++ 동적 메모리 할당은 왜 필요할까? - Stack과 Heap

프로그램에서 사용하는 모든 데이터의 크기와 수명을 프로그램 실행 전에 미리 알 수 있는 것은 아니다. 예를 들어 게임을 만든다고 생각해보자. 사용자가 선택한 플레이어 수, 런타임에 생성되는 몬스터의 수, 불러온 맵 데이터의 크기처럼 프로그램이 실행된 이후에야 필요한 메모리 크기가 결정되는 경우가 많다.또 어떤 객체는 특정 함수가 끝난 뒤에도 계속 살아 있어야 할 수 있다.이러한 데이터를 다루려면 단순히 지역 변수를 선언하는 것만으로는 부족하다. 이번 글에서는 왜 동적 메모리 할당이 필요한지, 그리고 이를 이해하기 위해 필요한 Stack과 Heap 메모리의 차이를 정리해본다. 동적 메모리 할당이 필요한 이유 [1] 정적 크기만으로는 모든 상황을 처리할 수 없다다음과 같이 배열을 선언했다고 해보자.int P..

C++ 멤버 접근 제어 방법 - Getter/Setter, friend, using

클래스를 설계할 때 멤버 변수를 private으로 두는 경우가 많다.외부에서 객체의 내부 상태를 직접 수정하지 못하게 하고, 클래스가 정해둔 방식으로만 상태를 변경하도록 만들기 위해서다. 그런데 실제 코드를 작성하다 보면 외부에서 private 멤버의 값을 읽거나 수정해야 하는 상황도 생긴다.이때 단순히 멤버를 public으로 바꾸기보다는, 필요한 범위만 열어주는 여러 방법을 사용할 수 있다. 이번 글에서는 Getter/Setter, friend, 그리고 상속받은 멤버의 접근 수준을 다시 노출할 때 사용하는 using을 통해 C++의 접근 제어 방법을 정리해본다. Getter와 Setter가장 기본적인 방법은 public 멤버 함수를 통해 private 멤버에 접근하도록 만드는 것이다.클래스 내부의 멤버..

C++ Struct와 Class의 차이, 서로 상속할 수 있을까?

C++에서 새로운 타입을 정의하다 보면 struct와 class 중 무엇을 사용해야 할지 고민하게 된다.처음에는 struct는 단순히 데이터를 묶는 용도이고, class는 함수와 객체 지향 기능을 사용하는 타입이라고 생각하기 쉽다. 하지만 C++의 struct와 class는 생각보다 훨씬 비슷하다.생성자, 소멸자, 상속, 가상 함수, 다형성 등 거의 모든 기능을 동일하게 사용할 수 있다. 그렇다면 굳이 두 문법을 나누어 사용하는 이유는 무엇일까?이번 글에서는 struct와 class의 실제 차이가 무엇인지, 그리고 코드에서 어떤 기준으로 구분해서 사용하는지 정리해본다. Struct와 Class는 기능적으로 거의 같다C에서는 struct가 주로 여러 데이터를 하나로 묶는 용도로 사용되었다.하지만 C++의 ..