inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

UE_LOG에 빨간 밑줄이 생겨요.

1943

dmlgus1205

작성한 질문수 1

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에 밑줄 생기고 실행이 안됩니다.

 

unreal-engine 언리얼-c++

답변 2

2

이득우

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

0

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에 빨간 밑줄이 사라집니다.

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

7

이득우

헛.. 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

Lee Daehyun

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

0

빠타박스

  • 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);

0

빠타박스

추가로 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
	);
}

저는 저 노란색 미리보기 창이 안뜹니다

0

21

1

강의중에 사용하는 ppt 수업 자료

0

37

1

GetName(), SetName() 함수의 오버로딩 관련 문제 문의드립니다.

0

40

1

언리얼 공부 방법에 대해서 질문드립니다.

0

72

1

컴포지션을 위한 컴포넌트 생성에 관해 질문드립니다.

0

83

2

if (NameProp) 은 if (NameProp != nullptr)이랑 같은 의미인가요?

0

96

2

언리얼 계정 로그인 불가 문제

0

117

2

가비지컬렉션 주기를 짧게 유지하면 어떤 이슈가있을까요?

0

75

2

11강 TArray TSet 에 대해서 질문있습니다.

0

72

1

Unreal 연동 후 Visual Studio 빌드오류 제발 살려주십쇼

0

366

3

언리얼에서 제공하는 스마트 포인터 라이브러리 사용

0

75

2

FGCObject 상속 받은 객체에서 Uobject 삭제를 원할 때

0

80

2

게임 내 인벤토리 데이터를 관리 할 경우, TArray / TSet 무엇이 올바를까요?

0

75

2

8강 컴포지션 중 궁금한 것이 있습니다.

0

56

2

헤더 파일 분리 방법

0

84

2

언리얼 엔진 깃 설치

0

88

2

FObjectInitializer 를 사용한 생성자.

0

96

2

언리얼엔진 에서 새로운 클래스를 생성하면

0

75

2

GetName이 이미있는데용?

0

113

2

TObjectPtr 과 일반 포인터에 대한 용도 질문

0

105

2

UPROPERTY() 다음 라인에서 세미콜론이 입력되지 않습니다.

0

164

1

[18:50] 패키지 저장 시 이미 패키지가 있으면 로딩을 다 하고 저장하는 것이 좋은 이유가 궁금합니다

0

140

2

NonPropStudent가 GC이후 invalid된 이유

0

78

2

[44:22] 커스텀 구조체에서 GetTypeHash() 와 operator== 를 오버로딩 하는 이유에 대한 질문

0

108

2