작성
·
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
헛.. 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
);
}
#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에 빨간 밑줄이 사라집니다.
강의와 다르게 실행되는 이유를 알려주시면 감사하겠습니다.