5월, 2026의 게시물 표시

내일배움캠프 67일차 - 언리얼 C++ 심화: 오브젝트 풀링(1)

이미지
오브젝트 풀링 게임에서 동적으로 오브젝트를 생성하고 삭제할 때, 이를 처리하는 비용이 발생한다. 이 작업을 한순간에 많이 일으키면 CPU에 부하가 생겨 화면이 잠깐 끊기는 프레임드랍이 발생할 수 있어 유저에게 부정적인 경험을 야기할 수 있다. 이를 위해 게임을 시작하기 전에 미리 다량으로 생성하고 적재적소에 가져다 쓰는 것을 오브젝트 풀링이라고 한다. MyObjectPool -> Actor(Manager) PooledObject -> Component(추적용도) PooledObjectData -> None(파라미터용) bCanGrow: 필요로 할 것 같은 PoolSize가 한계치를 넘어갈 것 같을 때 즉시 칸을 늘려주는 것을 의미한다

내일배움캠프 66일차 - 이력서 세션 및 언리얼 C++ 프로젝트 회고

C++ 언리얼 이라는 거의 처음 배우다시피 하는 기술을 팀과 같이 한 달에 걸쳐 프로젝트를 무사히 완성하였다. 과거 나는 블루프린트 위주로만 배우고 언리얼 C++를 처음 접했을 때, 내가 비록 C++만 몇 년의 세월을 파왔던 사람이었지만 언리얼에서 사용하는 C++은 독자적으로 구축된 기능이 많아 제 아무리 기본 지식이 있어도 언리얼 C++을 몇 달 동안 가르쳐줄 이가 없었기 때문에 이를 건드릴 엄두가 나지 않았었다. 하지만 이번 내일배움캠프를 통해 두 달간 언리얼 C++을 집중적으로 수강한 결과 이젠 누가 가르쳐주지 않아도 대부분의 문제는 구글링을 통한 독학으로도 지식을 깨우칠 수 있게 되어 이 캠프를 수강하길 잘했다는 생각이 든다.

내일배움캠프 65일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 16일: 결과물발표, 프로젝트 소감

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제 작업했던 내용들을 패키징을 하고 그 과정에서 발생했던 문제들을 해결하면서 발표자료 겸으로 내 분담영역의 브로셔를 완성했다. 발표자료의 시각화는 다른 팀원이 담당을 해주셨기에 오늘은 특별히 작업한 내용 없이 우리 조를 포함한 다른 조들의 발표내용들을 보면서 언리얼엔진5 C++ 기반 슈터게임 팀 프로젝트는 마무리되었다. 프로젝트를 하면서 느낀 점 내 담당이었던 무기 시스템을 만들면서 템플릿 메서드 패턴을 의식하면서 만들었으나 정작 만들어지고 나니 실제 템플릿 메서드 패턴과 다르고 샌드박스 패턴도 아닌 평범한 상속구조가 만들어졌다. 그렇게 만들어졌다보니 어느순간 실제 템플릿 메서드 패턴은 어떤 구조를 띄고 있는지 기억이 안나서 팀원에게 물어보았더니 아래와 같은 그림을 그려주면서 설명해주셨다. 템플릿 메서드 패턴의 구조 샌드박스 패턴의 구조 개인/팀 프로젝트 작업 시 자료나 로그를 많이 남겨야 한다. 에셋의 패키지를 닫운로드 - 프로젝트 적용 - 클리어 클리셔 젤리시 10미터 구역화 녹화본에서 재확인

내일배움캠프 64일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 14~15일

언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 총기 사격 시의 반동 애니메이션 및 시점 흔들림 추가, 사격음 추가 오늘의 작업 필요한 모든 일이 끝났기 때문에 유지보수 차원에서의 추가 작업을 했으며, 발표를 위한 게임 패키징에 들어갔다. 팀 브로셔에 내가 했던 작업과 사용했던 기술 매커니즘을 적었다. 트러블 슈팅

내일배움캠프 63일차 - 언리얼 C++ 심화: 서브시스템(싱글톤), 생명주기

Subsystem(서브시스템)  - 엔진이 알아서 켜주고 꺼주는 시스템  - 싱글톤 -> GameInstance  - 싱글톤의 속성을 그대로 가져왔기 때문에 단 하나만 존재하여 필요할 때 그것 하나 만을 사용한다.  - 해당 파일이 존재하기만 한다면 자동으로 게임에 배치되고 실행된다. Subsystem의 종류 EngineSubsystem - 엔진 시작과 끝 EditSubsystem - 에디터 시작과 끝 GameInstanceSubsystem - 게임 시작과 끝 WorldSubsystem - 레벨이 로드 되고 바뀔 때, 언로드 될때 LocalplayerSubsystem - 플레이어가 접속, 나갈 때

내일배움캠프 62일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 12~13일차

언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 반동 시의 메시 애니메이션을 추가하여 총기 사격 시의 반동 매커니즘을 일부 구현. 오늘의 작업 모든 총기 메시에 반동 시 애니메이션을 추가하였으며 시점 흔들림도 구현하였다. 또한 구비되어 있던 사운드 에셋을 기반으로 총기 사격음을 구현하였다.

내일배움캠프 61일차 - 자료구조 & 알고리즘 11주차 : 백트래킹

이미지
백트래킹 - "완전 탐색 + 가지치기" 완전 탐색을 하되, "답이 될 수 없는 방향" 을 조기에 포기하고 되돌아가는 기법 완전 탐색: 재귀 트리의 모든 잎(leaf)까지 내려간다. - 무조건 끝까지. 백트래킹: 트리의 중간 에서 "이 아래는 볼 필요 없다"고 판단하면 가지를 잘라낸다. × = "답이 될 수 없다" → 이 아래 전체를 건너뛴다는 의미 백트래킹의 핵심 두 요소 1) 유망성 판단 (Promising)  :"현재 상태에서 더 진행해도 답이 될 가능성이 있는가? "  - 제약 조건을 검사하는 단계 2) 가지치기 (Pruning)  :유망하지 않으면 그 가지 전체를 건너뜀  - 아래로 더 내려가지 않는다. = 백트래킹 이란 가능성, 유망성을 보고 안되면 그 가지를 잘라내는 것 이다. 부분합 문제 - 같은 문제, 더 똑똑하게. 문제: 배열 {3,7,1,8,4} 에서 합이 11 인 부분집합 을 찾아라. 완전 탐색 방법: 부분집합 2^5 = 32개 를 모두 만든 뒤 각각의 합을 확인 →  11인 것 찾기 백트래킹: 부분집합을 만드는 도중 에 "이미 합이 11 초과" 라면 → 가지치기 ※ 합은 원소(양수)를 추가할 수록 커지기만 하므로 합이 목표를 넘으면 더 깊이 들어갈 필요가 없음 부분합 추적 회색: 탐색한 루트 / 녹색: 정답 루트 / 주황색: 오답 루트 / 희미한 색: 탐색하지 않은 루트 배열 {3,7,1,8,4}의 부분집합 은 사진의 모든 구슬의 개수와 같다. ( 완전탐색 시 탐색횟수 2^5 = 32회 ) 백트래킹 을 통해 부분합 11을 만족하는 부분집합을 구하기 위해  위에서부터 가지 아래로 내려가면서 만나는 숫자를 모두 합 해서 11을 만족하면 결과에 포함 하고, 11을 초과하면 그 아래의 탐색은 중단 한다. ( 위 사진에서 백트래킹 으로 탐색한 횟수 14  + 8  + 3 = 25회 ) 정렬이 가지치기를 효율적으로 만든다 배열을 ...

내일배움캠프 60일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 11일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 총기 교체시의 애니메이션을 추가하였다. 애니메이션 블루프린트(ABP)를 사용한 것이 아닌 UTimelineComponent와 UCurveVector를 사용한 시간 경과에 따른 무기 메시의 컴포넌트의 트랜스폼을 조정한 것에 가깝다. 오늘의 작업 총기 사격 시의 반동을 일부 구현하였다. 방식은 총기 교체 애니메이션과 동일하게 UTimelineComponent를 사용한 재생 방식이며, 각 무기의 DataTable에 등록된 커브에 따라 무기 메시가 움직이도록 구현하였다. DataTable에 등록된 반동 커브 (Loc: 위치, Rot: 회전)

내일배움캠프 59일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 9~10일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 사격 시 총구와 착탄 지점에 이펙트와 탄흔(데칼)을 추가. 오늘의 작업 UTimelineComponent 와 Curve데이터 를 사용하여 총기 교체 시의 애니메이션을 제작 하였다. 일반적으로 애니메이션은 캐릭터 메시에서 ABP(애님 블루프린트)를 통해 실행하는 것이지만 우리에게는 정해진 캐릭터 메시와 ABP가 존재하지 않으므로 타임라인 기능으로 교체 시의 무기의 움직임을 구현 하도록 한다. 1) 타임라인 컴포넌트 선언 보통 무기를 교체할때면 화면밖으로 무기를 옮기고 총구를 아래로 거둬들이므로 Location이 변화하는 벡터와 Rotation이 변화하는 로테이터가 필요하다. 따라서 XYZ 세가지의 값을 가지는 CurveVector를 두 개 생성하여 할당하도록 한다. 이때 UTimelineComponent는 생성자에서 만들고, 할당이 필요한 UCurveVector는 블루프린트에서 따로 디폴트값으로 할당을 한다. (혹은 ConstructorHelpers로 경로를 받아 할당해도 된다)

내일배움캠프 58일차 - 언리얼 C++ 심화: SoftRef와 동기/비동기로드, DataTable과 DataAsset

이미지
에셋을 C++에서 가져오는 방법 1) 프로퍼티 참조 UPROPERTY(EditAnywhere) 를 붙여 블루프린트에서 할당하는 방식을 일컫는다. 2) 생성 시간 참조 생성자단계에서 ConstructorHelpers::FObjectFinder<타입>이름(TEXT("경로위치")) 를 입력해 지정경로에 오브젝트와 오브젝트 클래스를 찾아서 로드하는 방식. .Successed() 로 로드 여부를 확인할 수 있다. 3) 간접 프로퍼티 참조 SoftObjectPtr<Type> 을 사용해 할당하는 방식. 아래에서 설명하도록 한다. TSoftObjectPtr(소프트 오브젝트 레퍼런스) TSoftObjectPtr < UStaticMesh > MeshToLoad; TSoftClassPtr < AActor > MyActor; 하드 레퍼런스( 오브젝트 레퍼런스 , 클래스 레퍼런스 ):  1) 타입 값 처음부터 로드 .  2) 참조된 에셋 바로 사용가능.  3) 메모리 점유율 상승. 소프트 레퍼런스( 소프트 오브젝트 레퍼런스 , 소프트 클래스 레퍼런스 ):  1) 경로만 가지고 있음.  2) 로딩 전까지는 메모리 점유하지 않음.  3) 중간로딩으로 프레임드랍 발생가능성 있음(비동기방식 로드로 해결가능) 동기 로드 메인 스레드 에서 로드를 하여 로드 중에는 다른 작업을 멈추므로 프레임드랍이 발생할 수 있다.  - SoftPtr. IsNull() : 객체가 nullptr인가?  - SoftPtr. IsValid() : 객체가 로드되어있는가?  - SoftPtr. LoadSynchronous() : 객체를 동기로드를 한다. TSoftObjectPtr < UStaticMesh > MySoftMesh 를 BP에서 로드하는 코드 비동기 로드 원하는 시점에 서브 스레드 로 로드를 하여 게임 진행에 영향을 주지 않으면서 로딩이 끝나면 특정 함수를 호출하...

내일배움캠프 57일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 7~8일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 총기시스템의 연동작업 끝. 이제 DataTable에 있는 원하는 총기를 가져와 캐릭터에게 장착시킬 수 있다. 오늘의 작업 사격 시의 총구와 각 착탄 지점에 이펙트를 생성하였다. 총구지점에 이펙트를 생성하기 위해 우선 DataTable에 등록된 에셋에 맞는 총구의 위치 FVector도 같이 추가하였다. Muzzle Pos(메시 기준 총구의 위치) 그리고 총기는 플레이어의 메시 컴포넌트(CurrentWeaponComp)에 부착되어 있으므로 실제 총구의 위치는 메시 컴포넌트의 트랜스폼을 따라 움직인다. 따라서 입력된 총구의 위치에 메시 컴포넌트의 트랜스폼을 기준으로 TransformPosition을 받아 실제 총구의 위치를 가리키도록 한다.

내일배움캠프 56일차 - 자료구조 & 알고리즘 10주차 : 완전 탐색

완전 탐색 - "빠짐없이 전부 확인" 가능한 모든 경우를 하나씩 확인하여 답을 찾는 방법. 이름의 유래는 Brute Force(무차별 대입) - 원래 암호학 용어. 장점: 정확성 보장 - "답이 있다면 반드시 찾는다." 단점: 경우의 수가 많으면 시간이 오래 걸린다. 비유: 방 100개짜리 호텔에서 잃어버린 열쇠 찾기. 1호부터 100호까지 다 열어보면 반드시 찾는다. 시간이 좀 걸릴 뿐. 이진 탐색 vs 완전 탐색 - 성격이 다른 문제 이진 탐색이 통하는 문제 - "정렬된 배열에서 값 찾기"  - 구조가 있다 (단조성)  - 절반을 버릴 수 있다.  - O(log n) 완전 탐색이 필요한 문제 - "비밀번호 찾기" ※경우의 수가 충분히 작으면, 완전 탐색이 최선이다. 핵심 판단 - "1초에 1억 번" 1억번 이하의 연산  - 완전 탐색이 최선 (1초 이내 해결) 1억번 초과의 연산  - 더 똑똑한 방법 필요 패턴1)순열 - "줄 세우기" n명을 한 줄로 세우는 경우의 수: n! (n 팩토리얼) 5! = 120 10! = 약 360만 12! = 약 5억 - 1초 한계 근처 13! = 약 62억 - 불가능 12명까지는... 패턴2)조합 - "팀 뽑기" n명 중 r명을 뽑는 경우의 수: C(n, r) = n! / (r! × (n-r)!) C(20,5) = 15,504 -> 여유 C(30, 15) = 약 1.5억 -> 간신이 가능 C(40, 20) = 약 1,378억 -> 불가능 순열은 "순서가 있다"(ABC != BAC), 조합은 "순서가 없다"(ABC = BAC). 5명 중 3명을 줄 세우면 60가지, 그냥 뽑으면 10가지 - 6배 차이 패턴3)부분집합 - "넣거나 빼거나" 각 원소마다 "포함" 또는 "불포함" 두 가지 선택: 2^...

내일배움캠프 55일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 6일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 작업 DataTable을 사용한 총기 관리 시스템의 제작 도입. 각 총기마다 스펙과 특징이 다르고 발사 방식에 따라 각자의 DataTable을 사용하여 필요할 때마다 테이블의 무기 정보를 가져와 불러올 수 있게 함. 데이터 테이블에서 정보를 가져오는 것에는 성공했으나 플레이어가 소유중인 무기 정보를 등록하는 데에 실패하여 내일 이어서 하기로 함. 오늘의 작업 어제의 총기 시스템 연동 작업의 연장선. 강사님에게 문제 해결에 대한 조언을 요청하여 왜 DataTable으로부터 가져온 정보가 플레이어의 무기에 적용이 안되는 지에 대해 살펴보았다. 자식의 클래스와 구조체 (좌) 부모의 클래스와 구조체(우) 총기시스템은 Base가 되는 부모로부터 자식을 상속해 부모의 것까지 사용하는 구조이다. 그런데 사용하지 않는 부모의 status변수와 자식의 status변수와 이름이 겹쳐 빈 껍데기인 부모의 변수를 우선적으로 가져오게 되어 null값만 불러온 것이었다. 현재는 부모의 변수를 제거하였다. 총기 시스템을 적용한 게임화면이다. 어제의 작업물에서는 플레이어에 생성자로 직접 총기 에셋을 부착시켜 사용했으나 지금은 먼저 DataTable에서 기본무기를 가져온 후 그곳에 담긴 무기의 정보를 불러와 캐릭터에 부착시켰다. 앞으로 필요한 기능 총기 발사 시의 총구와 착탄지점에 파티클 부착 (데칼이나 디포머 등을 사용한 탄흔을 묘사해야함) 총기 종류 늘리기 Pause시의 컨트롤러 전환하기

내일배움캠프 54일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 4~5일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 문제 에디터가 주기적으로 크래시나는 문제가 발생. 나에게만 발생했던 현상으로 그래픽 드라이버를 최신버전으로 업데이트로 해결됨. 오늘의 작업 주로 총기와 관련된 작업을 진행하고 있으며 약간 긴 여정이 될 것이라고 생각한다. 이전의 시스템은 캐릭터에서 직접적으로 적에게 대미지를 주는 방식이나 이번 업데이트가 끝난다면 총기의 스펙과 발사 매커니즘을 경유해서 총기별로 다른 방식으로 적에게 대미지를 주게 될 것이다. 아직은 총기시스템과 연동이 채 이루어지지 않아 테스트용 총기 메시만 붙여놓은 상태이다. 업데이트에 포함될 총기 시스템에서는 총기의 종류는 DataTable 에서 관리 하게 될 것이며, Base가 되는 구조체를 상속 하여 총기의 발사 작동방식에 따라(단발형 무기, 연사형 무기, 산탄 무기 등) 각자 다른 자식구조체를 사용하는 DataTable 여러 개 로 분류하여 관리하게 될 것이다. DataTable에 사용가능한 Base구조체 (좌) Base구조체를 상속한 단발총기 구조체 (우) DataTable을 사용한 이유 하나의 총기에는 여러개의 변수가 필요하며, 생성 시에 많은 매개변수를 입력해야 한다. 그렇게 많은 매개변수를 짊어진 총기가 여럿일 때 추가로 필요한 매개변수가 필요하게 되면 매개변수 순서를 정렬해야 할 필요 가 생겨날 수도 있고, 매개변수의 추가로 인해 순서가 바뀌게 되면 수 많은 총기의 입력 매개변수 순서를 다시 한번 정리하는 데에서 유지보수 비용이 크게 들 것이다. 따라서 총기의 변수를 순서에 상관없이 관리 해줄 수 있고 한눈에 모든 종류를 내다볼 수 있는 DataTable 이 채택된 것이다. 앞으로 필요한 기능 총기시스템 연동 완성, 총기의 종류(DataTable) 늘리기, 총기로 몬스터 타격시 파티클 남기기 등

내일배움캠프 53일차 - 언리얼 C++ 심화: 인터페이스와 델리게이트, 바인드

이미지
언리얼 인터페이스 상속만을 위한 객체. 상속만을 위해 만들어진 것이기 때문에 해당 객체에 코드를 직접 구현하는것은 바람직한 방법이 아니다. 코드의 구현은 자손에게 맡겨야한다. 인터페이스는 인터페이스 클래스의 형태 로도 UObject의 형 태로도 구현된다. UClass*에 사용 해야할 일이 있으면 UObject로 참조 할 것. 다중상속 클래스에 콤마(,) 후 추가적으로 상속을 받아 두 개의 멤버 변수/함수를 동시에 쓸 수 있다. 델리게이트(Delegate) 함수를 저장(Bind)하고 실행(Execute)할 수 있는 변수이다. 델리게이트의 종류 // C++ 형대로 1대1만 지원한다 DECLARE_DELEGATE // C++ 1대 다수 DECLARE_MULTICAST // 1대1 형태로 블루프린트까지 지원한다 DECLARE_DYNAMIC // 1대 다수로 블루프린트까지 지원 DECLARE_DYNAMIC_MULTICAST // 바인드 되기 전까지 1바이트도 차지 않는다!!! 사용자 -> 느려집니다. 거의 바인딩 되지 않으면 효율적!!!!!!! DECLARE_SPARSE 파라미터가 하나다. DECLARE_DELEGATE_OneParam 반환값이 있고, 파라미터가 세개다. DECLARE_DELEGATE_RetVal_ThreeParams ※ MULTICAST는 반환값(RetVal)을 지원하지 않는다. 블루프린트까지 지원하고 1대1이며 리턴값이 있고, 두 개의 파라미터를 가진다. DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams 바인딩 - 호출되면 실행되는 함수 C++ 전용 바인딩은 AddUObject : 실행속도가 빠름 블루프린트까지 포함한 바인딩은 AddDynamic : 느리지만 블루프린트 이벤트디스패처와 연동가능 싱글 1대1 사용 -> Bind 멀티 1대 다수 -> Add 앞부분 Bind/Add 뒷부분 UObject/Dynamic 오브젝트, SharedPtr, Lambda, Static, UFUNCTION (★중요)오브젝트 -...

내일배움캠프 52일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 2~3일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 어제의 문제 작업 도중 h, cpp 내의 클래스명을 Ctrl+R→R 등으로 자동 Rename 시켰더니 cpp의 코드가 먹통이 되는 일이 발생했음. h, cpp파일을 새로 만들어서 해결. 오늘의 작업 2일차 되었던 어제에는 플레이어 캐릭터의 이동, 공격과 관련된 작업을 했고, 3일차에 플레이어 UI를 작업했다. 현재 추가된 기능으로는 플레이어의 이동, 사격, 그리고 타워 건설모드와 연계되는 키를 바인드하여 몬스터, 타워와의 상호작용을 연동하였다. 또한 플레이어와 수비목표가 되는 건물의 체력 을 UI에 표시시켜 진행 상황을 확인할 수 있게 하였다. 발생했던 문제 어느 순간을 기점으로 에디터가 주기적으로 크래시가 발생하는 현상이 있었다. 이 현상은 나에게만 발생했던 문제로 다른 팀원들은 해당 현상이 발생하지 않았었다. 팀장이 그래픽 드라이버 버전의 최신화를 제안하여 재설치 후 버전업을 했더니 해당 문제가 해결되었다. 앞으로의 필요한 기능 플레이어가 사용할 총기의 종류, 탄창 수, 재장전 기능, 사격/건설 모드의 UI시각화 등

내일배움캠프 51일차 - 자료구조 & 알고리즘 9주차 : 이진 탐색(녹화본 생성 후 수정)

순차 탐색 - "처음부터 하나씩" 정렬되지 않은 배열에서 값을 찾으려면 veoctor에서 하나씩 순회하면서 비교해간다. 시간 복잡도 O(n)... ※ "정렬된 사전에서 한 글자를 찾을 때, 첫 페이지부터 한 장씩 넘기... 이진 탐색 - "가운데를 보고 절반을 버린다" 정렬된 배열의 가운데(mid)를 보고, 찾는 값이 mid보다 크면 오른쪽 절반만, 작으면 왼쪽 절반만... 왜 O(log n)인가? 매 비교마다 탐색 범위가 절반으로 줄어든다. n을 계속 2로 나누는 횟수 → log2n 주의사항 배열이 정렬되어 있어야 한다.  : 정렬되지 않은 데이터에 이진 탐색을 적용하면... 이진탐색 = 분할정복 + 재귀 이진탐색은 분할 정복의 한종류 분할 vs 정복 병합 정렬과의 차이  : 병합 정렬은 양쪽 모두를 처리, 이진 탐색은 한쪽만 처리한다. O(n log n) vs O(log n) 콜 스택 - 재귀 깊이는 log n STL의 도구 upper_bound / lower_bound lower_bound vs upper_bound 활용 패턴 정확한 값 찾기 - 값의 개수 -  이진탐색의 함정 함정1 - 정렬되지 않은 배열 사진 이진 탐색은 "왼쪽은 작고 오른쪽은 크다"는 정렬 가정 위에서 동작. 그 가정이 깨지면 알고리즘 자체가 무너진다. 함정2 - 정수 오버플로우 함정3 - Off-by-one 에러 left, right의 경게를 잘못 설정하면 무한 루프에 빠진다. 위험한 패턴 vs 안전한 패턴 CS 돋보기 도서관의 카드 목록 도서관에 책 100만 권이 있다고 한다. "제목이 '해리포터'"인 책을 찾아보자. 비교 차이 ※ 이것이 바로 데이터베이스...  B-Tree - 이진 탐색의 진화 실제 노트DB에 이진 트리가 아닌 B-Tree를 사용, 한 노드에 여러 key를 저장하고, 여러 갈래ㅗ 분기. ※ 왜 이진트리가 아니아 B-Tree인가? 하드디스크에서 데이터를 읽을 때 ...

내일배움캠프 50일차 - 언리얼 C++ 팀프로젝트: 타워 디펜스 1일차

이미지
언리얼엔진5 C++ 기반 슈터 게임 팀 프로젝트 제작 첫 기획안 Sanctum2 스타일의 타워디펜스 슈터 게임 사각형 Grid 위에 장애물을 배치해 길을 만들고 적이 코어를 부수기 전에 막아내기  : Grid 내에서 타워와 벽을 전개한 뒤 적이 코어까지 최대한 돌아가게 만들게 끔 미로를 설계하고 설치한 타워와 함께 FPS슈터로서 적을 쓰러트리는 것이 목적인 게임. 기획의 베이스가 된 게임 트레일러 (Sanctum2) 팀에서 ChatGPT로 뽑아낸 키 비주얼 역할분담 팀장의 아이디어로 Trello 를 사용하여 필요한 기능과 현재 분담하고 있는 기능, 완성한 기능 등을 구분해서 사용하고 있음. 디스코드와 연동하여 실시간으로 변동사항을 체크할 수 있음. 본인은 오늘 플레이어 조작과 관련된 구현을 맡고 있음. 트러블 슈팅 발생 플레이어 조작 구현을 위해 플레이어 캐릭터와 컨트롤러 cpp를 제작하던 중 소스코드는 문제없이 작성되었음에도 캐릭터가 컨트롤러 입력을 제대로 함수에 바인딩하지 못하는 현상 이 있었음. 해결 강사님의 도움을 받아 원인을 물색했음에도 문제가 발견되지 않아 cpp를 지우고 새로 만들었더니 문제가 해결 됨. 원인 cpp 작성 중에 클래스 이름을 Ctrl+R → R 을 사용해 리네임을 했던것이 발단 으로 추측하고 있음. 이전에도 비슷한 행동을 했다가 문서 자체가 먹통이 되었던 일이 있었음. 예방법 클래스 이름을 수동으로 바꿀 것. Ctrl+R → R 을 사용해 자동으로 리네임하면 모르는 부분까지 바뀌는 것으로 추정 됨. 수동으로 바꾸기 힘들 정도로 분량이 많다면 현재 문서 범위 내에서만 리네임하는 것이 좋을 것으로 보임.

내일배움캠프 49일차 - 언리얼 C++: 디자인 패턴 - 템플릿 패턴과 샌드박스 패턴

이미지
템플릿 메소드 패턴 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하는 패턴. 같은 역할을 하는 메소드지만 여러 곳에서 다른 형태로 사용이 필요한 경우 사용하는 패턴이다. 템플릿 메소드 패턴을 사용할 때 '변하지 않는 기능'은 상위 클래스에 저장하고, 확장할 기능은 서브 클래스에서 만들게끔 설계한다.