인프런 커뮤니티 질문&답변

dmlgus1205님의 프로필 이미지
dmlgus1205

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

3강 언리얼C++ 기본타입과 문자열

UE_LOG에 빨간 밑줄이 생겨요.

작성

·

1.6K

1

h

#pragma once

#include "CoreMinimal.h"

#include "Engine/GameInstance.h"

#include "MyGameInstance.generated.h"

 

UCLASS()

class ABC_API UMyGameInstance : public UGameInstance

{

GENERATED_BODY()

public:

virtual void Init() override;

private:

};

 

 

cpp

#include "MyGameInstance.h"

void UMyGameInstance::Init()

{

Super::Init();

TCHAR LogCharArray[]= TEXT("Hello Unreal");

UE_LOG(LogTemp, Log, LogCharArray);

}

인데 UE_LOG에 밑줄 생기고 실행이 안됩니다.

 

답변 2

2

이득우님의 프로필 이미지
이득우
지식공유자

배열을 넘기려는 경우 const로 선언해주셔야 합니다.

dmlgus1205님의 프로필 이미지
dmlgus1205
질문자

#include "MyGameInstance.h"

void UMyGameInstance::Init()

{

Super::Init();

TCHAR LogCharArray[]= TEXT("Hello Unreal");

UE_LOG(LogTemp, Log, LogCharArray);

}

TCHAR LogCharArray[] 앞에

const를 넣어도 문제해결이 안돼서

TCHAR LogCharArray[] 앞에

static const를 넣어줘야 UE_LOG에 빨간 밑줄이 사라집니다.

강의와 다르게 실행되는 이유를 알려주시면 감사하겠습니다.

이득우님의 프로필 이미지
이득우
지식공유자

헛.. UE_LOG가 버전마다 매크로 선언이 조금씩 다르네요.
어제는 깃헙소스만 보고 답변드렸었는데, 지금 직접 살펴보니 5.1의 UE_LOG의 내부는 아래와 같이 선언되어 있고 TCHAR 배열을 받고 에러도 안나네요.

#define UE_INTERNAL_LOG_IMPL(CategoryName, Verbosity, Format, ...) \
		static_assert(TIsArrayOrRefOfTypeByPredicate<decltype(Format), TIsCharEncodingCompatibleWithTCHAR>::Value, "Formatting string must be a TCHAR array."); \
		static_assert((ELogVerbosity::Verbosity & ELogVerbosity::VerbosityMask) < ELogVerbosity::NumVerbosity && ELogVerbosity::Verbosity > 0, "Verbosity must be constant and in range."); \
		UE_LOG_EXPAND_IS_FATAL(Verbosity, PREPROCESSOR_NOTHING, if (!CategoryName.IsSuppressed(ELogVerbosity::Verbosity))) \
			{ \
				UE_VALIDATE_FORMAT_STRING(Format, ##__VA_ARGS__); \
				DispatchCheckVerify([] (const auto& LCategoryName, const auto& LFormat, const auto&... UE_LOG_Args) UE_DEBUG_SECTION \
				{ \
					TRACE_LOG_MESSAGE(LCategoryName, Verbosity, LFormat, UE_LOG_Args...) \
					UE_LOG_EXPAND_IS_FATAL(Verbosity, \
						{ \
							FMsg::Logf_Internal(UE_LOG_SOURCE_FILE(__FILE__), LINE, LCategoryName.GetCategoryName(), ELogVerbosity::Verbosity, LFormat, UE_LOG_Args...); \
							UE_DEBUG_BREAK_AND_PROMPT_FOR_REMOTE(); \
							FDebug::ProcessFatalError(PLATFORM_RETURN_ADDRESS()); \
						}, \
						{ \
							FMsg::Logf_Internal(nullptr, 0, LCategoryName.GetCategoryName(), ELogVerbosity::Verbosity, LFormat, UE_LOG_Args...); \
						} \
					) \
				}, CategoryName, Format, ##__VA_ARGS__); \
				UE_LOG_EXPAND_IS_FATAL(Verbosity, CA_ASSUME(false);, PREPROCESSOR_NOTHING) \
			} \

그런데 5.2버젼의 UE_LOG 매크로의 내부는 다르게 선언되어 있네요.
강의는 5.1버전으로 진행해주시면 되겠습니다.

/** Private macro used to implement the public log macros. DO NOT CALL DIRECTLY! */
#define UE_PRIVATE_LOG(Condition, CategoryConst, Category, Verbosity, Format, ...) \
{ \
	static_assert(std::is_const_v<std::remove_reference_t<decltype(Format)>>, "Formatting string must be a const TCHAR array."); \

0

지금 5.3으로 사용하고 있는데 TCHAR 로 텍스트 변수 선언할 때 "TCHAR" 앞에 "static const"를 입력해서 선언하면 문제 없이 사용 됩니다. 이유는 모르겠는데 작동은 되네요. 혹시 이에 대한 자세한 설명도 부탁 드려도 될까요?

  • static const TCHAR LogCharArray[] = TEXT("Hello Unreal"); 방식은 LogCharArray 변수를 함수 범위 내에서만 유지하고 값을 변경할 수 없도록 지정합니다.

  • TCHAR 배열과 const 키워드는 UE_LOG 매크로의 요구 사항을 충족시킵니다.

  • TEXT 매크로는 명확성을 위해 사용됩니다.

    음...

    5.1이후로는 UE_LOG 대신 GEngine->AddOnScreenDebugMessage를 권장 하고 있다네요

    그리고 UE_LOG 방식 외에도

    //5.3
    // TEXT 매크로 사용하여 해결
    UE_LOG(LogTemp, Log, TEXT("Hello Unreal"));
    
    // FString 객체 사용하여 해결
    FString LogString = TEXT("Hello Unreal");
    UE_LOG(LogTemp, Log, LogString);

추가로 GEngine 사용

 

void UMyGameInstance::Init()
{
	Super::Init();

	// FString 객체 사용
	FString LogString = TEXT("Hello Unreal");

	// GEngine->AddOnScreenDebugMessage 함수 사용
	GEngine->AddOnScreenDebugMessage(
		0, // Unique message ID (optional)
		5.0f, // Message duration in seconds
		FColor::Green, // Message color
		LogString // Message text
	);
}
dmlgus1205님의 프로필 이미지
dmlgus1205

작성한 질문수

질문하기