- 목차
길게 쓸일 없는거 정리
몽타주 편집창에서 Notify 추가
일부 최신버전의 언리얼 엔진(예 4.27 버전대)의 몽타주 편집창과 참고하고 있던 자료의 몽타주 편집창의 UI가 서로 같지 않아
Notify 편집을 어떻게 하나 고민을 했었다.
이 경우 Notify 영역 부분에서 우클릭을 해야 “노티파이 추가” 메뉴가 생성된다.
임포트에 실패했습니다. 알려지지 않은 ‘uasset’ 확장자 입니다.
- 방법 1 : uasset에 맞는 Unreal Engine 버전으로 시도한다.
- 방법 2 : 언리얼 에디터 쪽이 아니라 실제 탐색기 Project Content 폴더 내부에 직접 uasset을 복사한다.
언리얼 에디터 내부로 'uasset’을 드래그 앤 드롭 하는 경우 해당 에러가 발생하는데, 에디터가 아닌 실제 프로젝트의 콘텐츠 폴더 내부에 직접 복사해서 에디터에서 자동으로 인식하게끔하면 된다. 참고링크
[C1083] “No such file or directory”
- 방법 1 : 만일 현재 작업하고 있는 코드가 Content - Source 쪽이라면 (보통은 여기겠지만), Plugin에 있는 header를 include 했는지 살펴 본다. 즉,"…/…/…/plugins/ …" 경로로 시작하는 header를 지워본다.
- 방법 2 : IDE 프로그램 재실행
- 방법 3 : 컴퓨터 재부팅
"No such file or directory exists"
또는
Cannot open source file "파일 이름"
- 방법 1
- "프로젝트 이름".Build.cs 파일의 "PublicDependencyModuleNames" 부분 (아니면 "PrivateDependencyModuleNames")에 모듈이 추가되었는지 확인
- 수정 했을 경우, "uproject" 파일 우클릭 → "Generate Visual Studio project files" 명령을 수행하여 sln 파일을 재생성해야된다.
- 방법 2 : h 또는 cpp 파일에 헤더가 포함되어 있는지 확인
새로 생성한 C++ 클래스가 프로젝트에서 인식하지 못함
- uproject 파일 우클릭 → "Generated Visual Studio Project files"
- Unreal 편집기 (예 : Visual Studio) 에서 프로젝트 빌드
- 헤더 포함관계 검토
- C++ 코드는 빌드 오류가 나지 않도록 적절히 편집할 것
FName, FText, FString
인코딩
일반적으로 스트링 변수 리터럴 설정시에는 TEXT() 매크로를 사용해야 합니다. TEXT() 매크로를 지정하지 않으면, 리터럴은 ANSI 를 사용해서 인코딩되기에,
지원되는 글자가 크게 제한됩니다.
FString 에 전달되는 ANSI 리터럴은 TCHAR (네이티브 유니코드 인코딩)으로의 변환을 겪어야 하기에, TEXT() 를 사용하는 편이 보다 효율적입니다. (From Doc UE5.3) + (Character encoding)
_T 매크로는 "tchar.h" 헤더가 필요함. 즉, Windows 플랫폼에 특화되어 있음.
애셋이 저장되지 않는 경우
원인 1 : 프로젝트가 여러개 열림
간혹 똑같은 언리얼 에디터 프로젝트가 2개 이상 열려있는 경우가 있다. 나머지를 닫은 후 재시도한다.
원인 2 : (블루프린트) 애셋 복사과정에서 꼬임
- 방법 1 : (블루프린트 내부에서) 변수명을 다르게 수정
- 방법 2 : "파일" → "모든 노드 새로고침"을 한 후, 재시도
원인 3 : UMaterialInstanceDynamic을 C++ 생성자 내부에서 생성
"Graph is linked to external private object MaterialInstanceEditorOnlyData" 메시지와 나타난다. 포럼을
참고하면 C++ 생성자 내부에서 UMaterialInstanceDynamic을 생성하지 말라고 한다.
- 해결방법 : C++ 코드 생성자 이외 다른 함수에서 생성
- 함수 예시 1 : 해결방법은 Blueprint의 "Construct Script" 쪽에서 생성(Blueprint의 생성자는 C++ 생성자보다 늦게 호출된다.)
- 함수 예시 2 : C++ 코드에서 "PostActorCreated" 함수에서 생성
- 생성 예시 1 : 생성자에서 ConstructorHelpers::FObjectFinder 함수로 찾은 UMaterialInstance를 전역변수에 저장한 후, 다른 함수에서 전역변수를 이용하여 UMaterialInstanceDynamic을 생성 (포럼 참고 링크)
- 생성 예시 2 : (생성자 이외에) 다른 함수에서 LoadObject 함수를 사용 (포럼 참고 링크)
게임 exe 생성 (실제 플레이용)
- UE4 : 왼쪽 상단 “File” → “Package Project” → 원하는 플랫폼 선택
- UE5 : 상단에 탭 아래 부분에 있는 “Platform” → 원하는 플랫폼 → “Project Package”
패키징 오류 (Packaging Error)
Unknown structure
Error 메시지를 확인해본 결과 blueprint 부분에서 발생. 겉으로는 멀쩡해 보일지라도 하나씩 다시다시 수정해보자.
그리고 “파일” → “모든 노드 새로고침”
참고링크
텍스처 스트리밍 풀이 예산을 초과 했습니다 (Texture Streaming Pool Over Budget)
- 방법 (1) (임시) : 출력 로그 → CMD 부분에 “r.Streaming.PoolSize 원하는 용량 숫자” 입력
- 방법 (2) (반영구) : 해당 프로젝트 폴더 → Config 폴더 → DefaultEngine.ini 파일 열기 → [/Script/Engine.RendererSettings] 항목에 “r.Streaming.PoolSize=원하는 숫자” 입력 (항목이 없으면 추가한다.)
[에디터] 단위 바꾸기
Unreal은 기본적으로 mks 단위계를 사용한다. 단, "거리/길이" 부분은 센치미터로 되어 있다. 이를 바꾸기 위해서는 "프로젝트 세팅" → "에디터" → "외형" 부분에서 →
"거리/길이" 부분에 "Centimeters" 부분을 윈하는 단위로 바꾸면 된다.
객체 바닥에 놓기
키보드 End 키. 안되면 일단 해당 객체를 z축으로 올렸다가 다시 END키를 눌러본다.
(런타임에서) 객체가 이동, 회전되지 않음
Collider 확인
Outer
현재 객체의 부모라고 생각하자.
(실제 정의는 현재 객체를 가지고 있는 상위 객체를 의미. Garbage Collection과 밀접한 연관을 가짐.)
참고
Error MSB3073
10>Microsoft.MakeFile.Targets(44,5): Error MSB3073 : ""C:\Program Files\Epic
Games\UE_5.3\Engine\Build\BatchFiles\Build.bat" 프로젝트이름 플랫폼 빌드타입 -Project="uproject파일 경로" -WaitMutex
-FromMsBuild" 명령이 종료되었습니다(코드: 6).
- 방법 1 : 열려있는 Unreal Engine을 닫고 다시 빌드해본다.
- 방법 2 : PC 재부팅하고 재시도
"프로젝트이름".build.cs 파일 내부에 추가한 모듈이 인식되지 않음 OR 추가된 h, cpp 파일이 인식되지 않음
"프로젝트이름".uproject 파일 우클릭 → "Generate Visual Studio project files" 명령을 수행하여 sln 파일을 재생성
Error LNK2001, Error LNK1120
Error LNK2001 : 확인할 수 없는 외부 기호
Error LNK1120 : n개의 확인할 수 없는 외부 참조
Error LNK1120 : n개의 확인할 수 없는 외부 참조
- 방법 1 : Plugin에 있는 매크로 코드를 (#define) 사용했을 경우. 제거하고 빌드 재시도.
- 방법 2 : "솔루션 다시 빌드" 또는 빌드 결과물(프로젝트와 플러그인에 있는 "Binaries", "Intermediate" 폴더 제거)을 제거하고 다시 빌드
- 방법 3 : 모듈 인식이 안되었을 수도 있다. "프로젝트이름".uproject 파일 우클릭 → "Generate Visual Studio project files" 명령을 수행하여 sln 파일을 재생성
- 방법 4 : class "모듈명_API" 클래스명
부분에서 중간 부분에 있는 "모듈명_API" 부분이 누락되었다면 추가해본다.
netsdk1045
빌드에 활용할 dotnet의 버전이 맞지 않는 경우임.
Error LNK1169, Error LNK2005
Error LNK1169 : 여러번 정의된 기호가 있습니다.
Error LNK2005 : 이미 정의되어 있습니다.
Error LNK2005 : 이미 정의되어 있습니다.
- 방법 1 : Header가 정의가 제대로 되었는지 확인 "헤더 파일 맨 상단에 #pragma once 입력했는지 확인"
- 방법 2 : 모듈 종속성 상태 확인
- "모듈이름".Build.cs 파일에 PublicDependencyModuleNames, PrivateDependencyModuleNames가 잘 정의되었는지 확인
- ".uproject" 파일에 모듈 또는 플러그인 정의 상태 확인
- 방법 3 : "모듈이름".h 파일에 IMPLEMENT_PRIMARY_GAME_MODULE 매크로
확인.
IMPLEMENT_PRIMARY_GAME_MODULE 매크로는 단 하나의 모듈에만 존재해야되며, 나머지는 IMPLEMENT_MODULE로 정의해야된다. - 본인의 경우 "Editor" 에서 빌드되고 "Game"에서 빌드가 안되었는데 이것으로 해결.
레벨에 배치된 액터 복사하기
레벨에 배치된 액터를 선택한 후, 키보드 alt키를 누른 상태에서 아무 이동 축을 눌러 이동 (액터가 새로 복사되며, 복사되어 생성된 액터가 축에 따라 이동됨)
런타임에서 조명이 밝기가 너무 어둡거나 안바뀌는 경우
조명의 모빌리티를 "스테이셔너리" 또는 "무버블"로 변경
Actor 내부에서 WorldContext가 필요한 다른 객체 생성
C++ 생성자에서의 호출을 피하고 "PostInitializeComponents" 또는 "BeginPlay" 함수에서 생성하기. 즉, Actor가 완전 Spawn 되어
GetWorld()가 Null이 아닐 때까지 기다려야한다.
C++의 생성자에서는 GEngine도 아직 초기화 진행상태이다.
참고 (Actor 생명 주기)
https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-actor-lifecycle구조체 선언
가능한 기본 생성자 생성, 가능한 모든 코드를 Header 안으로 모두 넣기. (FORCEINLINE 활용도 좋음) (LNK2019, LNK2001 오류 방지)
int32 VS int
가능한 int32를 사용할 것.
각 (최신 운영체제가 아닌) OS마다 int의 크기가 다를 수 있는 점과 BP에서는 int32를 주로 사용함.
참고
Deprecated 표시
- 방법 1 : C++코드에서 클래스, 함수, 변수명 위에 아래와 같은 형식으로 입력
UE_DEPRECATED("5.3", "코멘트") - 방법 2 : C++ 코드에서 클래스, 함수, 변수명 위에 아래와 같은 형식으로 입력
[[deprecated("코멘트")]]
Bool Log 출력
1 2 3 4 5 6 7 | bool bIsVisible = true; UE_LOG(LogTemp, Warning, TEXT("Visibility: %s"), bIsVisible ? TEXT("true") : TEXT("false")); //또는 UE_LOG(LogTemp, Warning, TEXT("Visibility (as int): %d"), bIsVisible); //1/0 | cs |
C++과 Editor(의 디테일 패널)에서 Rotator
C++코드에서 생성자 : using FRotator UE::Math::TRotator<double>;
→ TRotator(T InPitch, T InYaw, T InRoll)
근데 실제로 에디터의 디테일 패널을 보면
Pitch → Y 부분에 위치 // Yaw → Z 부분에 위치 // Roll → X 부분에 위치
즉, X : Roll, Y : Pitch, Z : Yaw
주의하면서 써야된다...
댓글
댓글 쓰기