목록Game Dev/Unreal C++ : Dev Log (40)
KoreanFoodie's Study

언리얼 에러 : Missing '*' in Expected a pointer type 핵심 : 1. UFUNCTION 함수의 인자로, UStruct 타입이 있는데 포인터 형식이 아닐 경우 2. 추후 추가 3. 추후 추가 언리얼 에러 로그 중 아래와 같은 내용이 뜰 때가 있다 : Missing '*' in Expected a pointer type 위와 같은 에러의 경우, 정확히 뭘 고치라는지 몰라 헤멜때가 있다. 그럴 때는 아래와 같은 상황을 체크해 보자! 1. UFUNCTION 함수의 인자로, UStruct 타입이 있는데 포인터 형식이 아닐 경우 다음과 같은 예제를 보자 : UFUNCTION() void OnSomeEvent(UObject* InObject, UUserWidget& InWidget); ..

[언리얼] 어떤 개념 : 어떻게 하기 핵심 : 1. 2. 3. 언리얼 서밋 온라인 2022 를 훑어 보면서, 최적화 및 프로파일링과 관련한 내용이 있어 기록차 요약해 보려 합니다. 현재 개발 중인 버전이 언리얼5 가 아니라서 아쉬운 부분은 있지만... 일단 알아두면 많은 도움이 되겠죠 😅 언리얼 서밋 온라인 2022 를 보며 내용을 정리했으니, 궁금하신 분은 풀 영상을 보시길 바랍니다! 😄 Hitching 이 언제 발생하는지 파악하여 어떤 부분에서 병목현상이 발생하는지 파악해야 한다. 카트라이더의 경우 GameThread 에서 병목이 발생하여 이를 집중적으로 다루었다고 함. 강의에서는 다루지 않았지만... RenderThread 의 경우, PSO 캐시를 통해 최적화를 진행하였다고 한다. 관련 내용은 공식..

언리얼 인사이트 핵심 : 1. 언리얼 인사이트는 최적화를 위해 프로파일링을 쉽게 도와주는 유용한 툴이다. 2. 게임 쓰레드, 렌더 쓰레드 등 어디에서 병목 현상이 일어나는지를 파악하자 3. 모바일 기기로도 utrace 를 내보내어 분석을 할 수 있다! 언리얼 인사이트라는 툴을 통해 언리얼 최적화 및 프로파일링을 한 번 해 보자! (만약 소스빌드에서 시작할 경우, UnrealInsight 모듈을 빌드하면 UnrealInsights.exe 파일이 생긴다. UnrealInsights-Win64-DebugGame 라는 이름일 수도 있음 😅) 애플리케이션을 실행하면 Trace Sessions(트레이스 세션) (1), Trace Store Directory(트레이스 스토어 디렉터리) (2) 제어, New Conne..

동적으로 위젯 생성하기 핵심 : 1. UUserWidget 은 CreateWidget, UWidget 은 ConstructWidget 을 사용해 위젯을 생성하자. 2. 생성 후, 그냥 WidgetTree 에 붙이기만 하면 된다. 3. AddChild 같은 함수로 부모자식 관계를 설정할 수 있다! 이전 글에서 동적으로 액터 컴포넌트를 만드는 방법을 기록한 적이 있는데, 이번에는 위젯을 동적으로 만드는 법을 알아보자. 코드는 사실 매우 간단하다 😄 원하는 위젯 클래스를 UUserWidget 으로부터 상속받아 만들었다고 하자. 그럼 아래와 같은 식으로 쓰면 된다 : // UTextBlock 을 동적으로 생성하여 WidgetTree 에 붙인다 UTextBlock* textBlock = WidgetTree->Co..
보호되어 있는 글입니다.

[언리얼] Visual Studio 한글 깨짐 (Log 한글 깨짐) 핵심 : 1. 임시 방편으로 한글 대신 영어 로그만 나오게 하기 2. 컴퓨터 환경의 인코딩 세팅을 바꾸기 (불안정) 3. cl-filter 를 수정해서 '완벽'하게 해결하기 구글링 중 세 가지 방법을 찾았고, 각각을 적용해 본 결과를 기록한다. 임시 방편으로 한글 대신 영어 로그만 나오게 하기 이 링크를 참고하자. 첫번째 방법이다. 근데 한글도 나와야 되는 상황이면... 이렇게 하면 안된다. 당근. 컴퓨터 환경의 인코딩 세팅을 바꾸기 (불안정) 이 링크의 두번째 방법을 참고하자. 절대 하지 말기. 기존 파일들 완전 다 깨진다. cl-filter 를 수정해서 '완벽'하게 해결하기 God 실력자 분이 올리신 링크를 통해 수정을 시도했다. (..

TSharedRef 를 클래스 멤버 변수로 선언할 때 에러 핵심 : 1. TSharedRef 를 선언할 때는 반드시 초기화를 해 주자. 2. TSharedRef 를 초기화할 때는 MakeShareable 보다 MakeShared 를 사용하자. 3. 초기화가 힘들면 TSharedPtr 로 선언하는 것도 대안이다. TSharedRef 를 멤버 변수로 선언할 때, 만약 헤더파일이나 생성자에서 초기화를 해 주지 않는다면 아래와 같은 에러를 만나게 된다... void EnsureRetrievingVTablePtrDuringCtor(const TCHAR* CtorSignature) { UE_CLOG(!GIsRetrievingVTablePtr, LogCore, Fatal, TEXT("The %s constructor..

ENUM_CLASS_FLAGS 사용하기 (언리얼 플래그 사용법) 핵심 : 1. 여러 조건을 동시에 가질 수 있는 상황을 다를 때는, Enum Class 의 값을 Shift 연산자를 활용해 Bit Flag 처럼 사용하는 것이 좋다. 2. EnumClassFlags 파일에 정의된 템플릿 함수들(e.g. EnumHasAnyFlags)을 활용하면, Enum Class 에 정의된 플래그들을 이용해 케이스들의 중첩을 효율적으로 체크할 수 있다. 3. 일반적으로 Enum Class 내의 값들을 Flag 로 표현하는 경우는 UI 나 환경설정 세팅 등이 있다. 일반적으로 Enum Class 는 같은 주제 내에서 여러 조건들을 다룰 때 사용한다. 그런데 만일 여러 복합적인 상황을 동시에 다뤄야 하는 케이스가 있다고 하면 ..

TimerHandle 배열 사용하기 (TimerHandle Array) 핵심 : 1. TArray 타입을 사용하면 된다. 2. 새로운 FTimerHandle 을 넣을 때는 Emplace 를 사용한다. 3. 객체가 파괴되거나 정리하는 시점에 ClearTimer 및 배열을 비워주는 작업을 해 주자. 설명할 것은 위의 3줄 요약에서 다 했으니, 코드만 보자. // 선언 // 일정 시간 후 UTextBlock 본래 색상으로 돌아가게 만들때 사용하는 타이머핸들 TArray timerHandleList; // 구현 void UTestWidget::NativeConstruct() { for (int i = 0; i < 10; ++i) { FTimerHandle newTimerHandle; timerHandleList..

동적으로 컴포턴트 생성하기 (Dynamically create ActorComponent) 핵심 : 1. 일반적으로 ActorComponent 는 생성자에서 CreateDefaultSubobject 함수를 통해 CDO 가 생성된다. 2. 동적으로 액터 컴포넌트를 생성할 때는 두 가지 방법이 있다. 블루프린트에서는 AddComponent 함수를 사용하면 되며, C++ 에서는 NewObject 로 ActorComponent 를 생성 후, 기존 RootComponent 에 Attach 하는 방식을 활용한다. 3. 커스텀 AddComponent 함수를 만들어서 편하게 활용하거나, 템플릿 함수를 만드는 것도 좋은 방법이다. 블루프린트에서 AActor 클래스에는 AddComponent 라는, 내부적으로 NewObj..