목록Categories (1099)
KoreanFoodie's Study
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..
SetTimer 에 함수 및 람다(Lambda) 연결하기 핵심 : 1. UObject 상속 클래스에서는 기존 함수를 SetTimer 함수에서 바로 연결할 수 있다. 2. 일반적으로는 FTimerDelegate 에 Lamda 함수를 연결해 사용하며, UObject 를 상속하지 않는 클래스에서도 이 방법을 사용할 수 있다. 3. FTimerHandle 은 전역이며, 사용 완료 후에는 ClearTimer 를 이용해 타이머를 해제해 주도록 하자! 이전 글에서 언급한 바 있지만, 일정 시간 이후 특정 함수가 호출되도록 만드는 방법을 조금 더 자세히 기록해보려 한다. SetTimer 에 함수와 람다를 연결하는 방법을 추가로 소개한다! 1. 기존 함수에 그대로 연결 (UObject 클래스에서 사용 가능) FTimer..
현재 시간 로그 찍기 핵심 : 1. FDateTime 구조체를 이용해서 각종 시간을 체크할 수 있다. 2. FDateTime::Now() 를 통해서 현재 시간(초까지)를 구할 수 있다(static). 3. FDateTime::GetMillisecond() 를 통해 현재 밀리 초를 구할 수 있다(non-static). 아래 코드를 이용해서 현재 시간을 구하는 간단한 로그를 찍어 볼 수 있다! FDateTime dateTime; UE_LOG(Error, FText::FromString( FString::Format(TEXT("Current Time : %s:%d ms"), { FDateTime::Now().ToString(), dateTime.GetMillisecond() }))); UE_LOG 매크로는 F..
SafeZone 위젯 핵심 : 1. SafeZone 위젯을 사용하면, 콘솔/PC/모바일 등 에서 패널 가장자리에 UI 및 컨텐츠가 제대로 출력이 되지 않는 문제를 해결할 수 있다. 먼저, SafeZone 패널에 대한 언리얼 엔진의 설명은 다음과 같다 : 언리얼 공식 문서에 있는 세이프 존에 대한 그림을 보자. 왼쪽은 SafeZone 위젯이 없는 경우이고, 오른쪽은 SafeZone 위젯이 있는 경우이다. 오른쪽의 경우, Uniform Safe Zone (균등 세이프 존) 영역을 0.9(빨강) 으로 설정했다. 이렇게 세이프 존을 활용하면, 가장자리의 "Unsafe" 한 존에 위젯이 잘리는 것을 방지할 수 있다! 참고 : 언리얼 공식 문서
언리얼의 Cast 동작 원리 핵심 1. Cast 는 UObject 에 쓰여야 한다. Cast 는 static_cast 와는 달리 타입 안정성을 지닌다(nullptr 를 리턴). 2. Cast 의 런타임 비용은 에디터 환경에서는 O(O(Depth(InheritanceTree))) 이고, 에디터가 아닐 때는 O(1) 이다. 3. Cast 는 dynamic_cast 를 사용하지 않는다. dynamic_cast 대신 Cast 를 사용하라! 실제로 언리얼의 Cast 는 다음과 같이 구현되어 있다 : // Dynamically cast an object type-safely. template FORCEINLINE To* Cast(From* Src) { return TCastImpl::DoCast(Src); } 내부..
UObject 의 클래스 타입 체크 (런타임) 우리가 아이템을 사용하는데, 소모품일 경우 수량을 깎는 코드를 짠다고 가정해 보자. 코드는 다음과 같다. if (nullptr != Cast(myItem)) { this->consumeItem(myItem); } else { this->useItem(myItem); } (물론 현실적으로 이런 경우, FConsumable 클래스에서 useItem 을 override 하겠지만.. 여튼) 위처럼, 객체의 클래스 타입을 체크하는 경우, 어떻게 하는 것이 효율적일까? 위와 같은 경우에, 만약 캐스팅이 실제로 필요한 경우가 아니라면(즉, 그냥 타입 체킹만 하면 되는 경우라면), Cast(언리얼의 Cast 는 업/다운 캐스팅을 할 수 있도록 구현되어 있다)를 쓰는 것보다..
텍스트 조회 보통 프로젝트 규모가 커지게 되면, 각종 스트링들을 스트링 테이블에 넣어서 사용할 것이다. 이때 스트링 테이블은 Namespace 와 키 값 두 개가 있고, 원하는 Namespace 에서 키를 대입해 원하는 텍스트를 찾게 된다. Namespace 는 간단히 말해 스트링 테이블 파일의 이름이라고 보면 된다. 실제로 C++ 코드로 짜면, 다음과 같다 : FText findText; FText::FindText(TEXT("your_namespace"), TEXT("your_key"), findText); your_namespace 와 your_key 에 적합한 값을 주면, 원하는 값이 findText 에 들어갈 것이다. 아참, 스트링 테이블을 만든 다음, 상단의 '네임스페이스' 를 제대로 설정해 ..
Delay 실행 만약 일정 시간이 지난 후 함수가 실행되길 원한다면, FTimerHandle 을 이용해 다음과 같이 코드를 짜면 된다. FTimerHandle myTimerHandle; GetWorld()->GetTimerManager().SetTimer(myTimerHandle, FTimerDelegate::CreateLambda([&]() { // 내가 원하는 코드 구현 DoSomething(); // 타이머 초기화 GetWorld()->GetTimerManager().ClearTimer(fadeOutTimerHandle); }), InDelayTime, false); // 반복 실행을 하고 싶으면 false 대신 true 대입 아, 참고로 FTimerHandle 은 글로벌 타이머 매니저에서 사용하며..