목록Game Dev (263)
KoreanFoodie's Study
언리얼 소스 빌드에서 플러그인만 빌드하기소스 빌드에서 플러그인을 추가하는 것은 다소 번거로운 일이다. 그래서 사실 같은 버전의 Binary 빌드를 받아놓고, 에픽 게임즈 런처를 통해 플러그인을 받은 후, 복사 붙여넣기를 하는데... 소스 빌드에서는 해당 플러그인을 빌드해 주어야 한다.이 때, 전체 리빌드를 하지 않고 새로 받은 플러그인만 빌드할 수 있다.일단, 에픽 게임즈 런처를 통해 받은 플러그인을 복붙해 소스 빌드의 Plugins 폴더에 넣어준다. 그리고 아래 파일을 찾아준다.[소스 빌드 언리얼 설치 경로]\Engine\Build\BatchFiles\RunUAT.bat그리고 아래 명령어와 함께 실행한다 (해당 bat 파일 경로에서 cmd 열고 실행)start RunUAT.bat BuildPlugin ..
"게임은 흥미로운 선택의 연속이다". 이 말은 시드 마이어의 게임 철학을 매우 잘 나타내는 문장으로 널리 쓰여 왔습니다.문명 시리즈는 '문명하셨습니다' 라는 밈이 나올 정도로 중독성이 큰 게임으로 알려져 있는데요, 이런 세간의 시선과 높은 평가와 달리 저는 문명 시리즈를 많은 사람들에게 추천드리기는 어려운 게임이라고 생각합니다.그 이유는, 문명이 '엄청 재미있지는 않기 때문'입니다.조금 이상하게 들리시죠? 저 또한 대학생 시절 문명5 를 하면서 셀 수 없을 정도로 많은 밤을 세운 사람이지만, 이상하게도 문명을 하면서 여타 다른 게임들처럼 '너무 재미있다, 짜릿하다, 등골이 시린다, 허리가 활처럼 휘었다' 같은 감정을 느낀 적은 많지 않습니다.오히려 퇴근 시간만을 기다리는 좀비처럼 책상에 앉아 승리 조건이..
언리얼 TSubClassOf 가 비어있을 때핵심 :1. EditDefaultsOnly, EditAnywhere 등의 UPROPERTY 메타 태그를 잘 써보자간혹 그럴 때가 있다. 위젯을 생성할 때, 블루프린트에 생성하고 싶은 BP 위젯을 넣어 코드에서 동적으로 생성하는 경우가.UPROPERTY(BlueprintReadWrite, Category = Config)TSubclassOf MyWidgetClass;보통은 위처럼 TSubclassOf 를 사용해서 위젯 블루프린트 클래스를 넣어주는데...A -> B -> C ... 처럼 위젯의 hierarchy 구조가 있고, 내가 위의 TSubclassOf 세팅을 B 에서 했을 때, 최상위 부모 위젯인 A 에서는 MyWidgetClass 가 nullptr 인 이상한..
UTexture2D 사용시 빌드 에러때때로, 아래처럼 UTexture2D 를 로드해서 쓰려는데, Get() 에서 빌드 에러가 발생하는 경우가 있다.TSoftObjectPtr InTexturePtr;auto WeakThis = MakeWeakObjectPtr(this);UAssetManager::GetStreamableManager().RequestAsyncLoad( InTexturePtr.ToSoftObjectPath(), [WeakThis, InTexturePtr]() { if (WeakThis.IsValid()) { WeakThis->Img_Texture->SetBrushFromTexture(InTexturePtr.Get()); ..
에디터에서 게임을 실행하면, 가끔 아래와 같은 메시지가 나오며 에디터가 꺼질 때가 있다.Unable to launch ShaderComiplerWorker.exe - make sure you built ShaderCompileWorker 그럴 때는 아래 두 가지를 시도해 보자.1. Engine\Binaries\Win64 에서 ShaderCompileWorker.exe 실행해당 파일이 없으면, 2 번을 따라하면 생긴다. 2. Solution > Programs 에서 ShaderCompileWorker 빌드
[언리얼] 어떤 개념 : 어떻게 하기 핵심 : 1. UObject 라면, UWorld::GetRealTimeSeconds() 함수를 사용할 수 있다. 2. C++ 클래스라면, FDateTime::Now() 를 쓸 수도 있다. 3. milisecond 를 원한다면 FDateTime::UtcNow() 를 쓰자. 1. UObject 일 경우 UWorld* World = GetWorld(); float PrevSeconds; float ElapsedSeconds; if (World) { ElapsedSeconds = MyWorld->GetRealTimeSeconds() - PrevSeconds; PrevSeconds = MyWorld->GetRealTimeSeconds(); UE_LOG(LogTemp, Warn..
언리얼 UI 최적화 핵심 : 1. UI 최적화를 위해서는 먼저 UI 구조와 렌더링 프로세스를 이해해야 한다. 2. UI 최적화의 핵심은 결국 Tick 이다. Tick 을 필요할 때만 호출하게 만들거나, Tick 당 담기는 연산의 크기를 줄여야 한다. 전자는 게임쓰레드와, 후자는 렌더링 쓰레드와 연관이 깊다. 3. 게임 쓰레드 최적화에는 Invalidation Box, Visibility, Widget Binding 등이 있고, 렌더링 쓰레드 최적화에는 Merging Batches, Retainer Box 등이 있다. 언리얼에서 UMG 를 이용한 UI 작업을 상당히 많이 하는데, 일정에 쫓기다 보니 프로젝트 차원에서 최적화를 고려하면서 만드는 경우가 잘 없는 것 같다는 생각이 들었다. 또한 최적화를 한다고..
[C++ 게임 서버] 7-5. Procedure Generator 핵심 : 1. Python 을 이용해 Procedures 를 자동 생성해 보자. 우리는 이전에 BindParam/BindCol 을 이용해서 테이블에 접근을 하곤 했다. 이런 부분을 조금 더, 자동화 시키기 위해 ProcedureGenerator 를 만들어 보자. 우리는 XML 로부터, 테이블에 데이터를 추가하거나 조회하는 API 를 자동으로 만들어 줄 것이다. 먼저 XmlDBParser 가 필요하다. 이건 참고용이니, 접은 글에 넣도록 하겠다. 🙂 더보기 XmlDBParser.py import xml.etree.ElementTree as ET class XmlDBParser: def __init__(self): self.tables = {..
[C++ 게임 서버] 7-4. ORM 핵심 : 1. ORM 을 사용하면, DB 를 간편하게 관리할 수 있다. 이번 글에서는 간단한 ORM 을 만들어 보도록 하겠다. 참고로 ORM 이란... 라고 한다. 자세한 설명은 이 블로그를 참고하자. 음.. 일단 DB 모델을 표현하는 DBModel 과, 현재 DBModel 에 맞게 Table 을 구성해 주는 DBSynchronizer 클래스를 만들 것이다. 그런데... 이게 하나하나 설명하기에는 양이 많고, 굳이 암기할 필요는 없기에... 나중에 필요할 때 슬쩍(?) 들춰보는 것으로 하고, 예제 코드만 기록하고 넘어가도록 하겠다. 절대 귀찮아서 때우려고 하는게 아니다. 😅 더보기 DBModel #pragma once #include "Types.h" NAMESPAC..
[C++ 게임 서버] 7-3. XML Parser 핵심 : 1. DB 도 버전 관리가 필요하며, 따라서 테이블과 쿼리는 버전에 맞게 존재해야 한다. 이를 위한 XML Parser 를 만들어 본다. 프로젝트를 진행하다 보면 자연스럽게 버전 관리가 필요하다. 이는 사실 DB 에도 마찬가지인데, 어떤 버전에서는 특정 테이블에 특정 컬럼이 없다던지, 추후 버전에서 테이블이 추가된다던지 하는 경우가 생길 것이다. 따라서 쿼리도 그런 DB 의 변동에 맞게 내용물이 바뀌어야 하는데... 보통 이를 관리해 주는 직군이 DBA 이다(물론 서버 담당자가 하기도 한다). 우리는 앞으로 이런 DB 쿼리를 XML 로 관리한 다음, 실제로 GameServer 에서 쿼리를 날려줄 때 XML Parser 를 이용해 해당 쿼리가 자동..