공부/Unreal Engine 4 18

aos, ios 네이티브 빌드&패키징 vs 언리얼 모바일 패키징

참고 : https://creazier.tistory.com/15310767 [AOS] 1. java 코드 작성 2. java 코드 바탕으로 class 파일 생성 3. class 파일 dex 파일로 변환 4. dex 파일과 사용중인 리소스들을 `apkbuilder`로 apk 파일 생성 5. zipalign`으로 apk 파일 binary aligning 6. 앱 사이닝 (사이닝 = 구글 플레이스토어에 제출하기 위한 과정? apk에 키값이라고 불리는 문자열을 같이 포함하는 건가?) 7. `adb` 혹은 스토어를 통해 apk 다운로드 (Android ADB (Android Debug Bridge)는 PC와 스마트 폰 간에 통신을 할 수 있는 명령어도 도구입니다. 안드로이드 개발자에게는 apk 설치, log 출..

에셋의 이동 및 수정

에셋의 이름을 바꾸고 경로를 바꾸는 행동은 에디터의 컨텐츠 브라우저 내에서 해야한다. 컨텐츠 브라우저 외에서, 예를 들어 윈도우 파일 탐색기 상에서 에셋을 옮기는(사실은 package 를 옮기는 것이다) 행동은 에셋에 대한 참조 관계를 고려하지 않기 때문에 옮겨진 경로나 이름으로 참조 관계가 업데이트 되지 않는다. 컨텐츠 브라우저에서 에셋의 이름을 바꾸거나 옮기는 경우는 참조 관계가 맞게 업데이트 됩니다. 만약 컨텐츠 브라우저에서 에셋을 다른 경로로 옮긴 경우, 기존 에셋 위치에는 ∴리디렉터가 남게 됩니다. ∴리디렉터란? 에셋을 이동하거나 이름을 바꾸면 원래의 장소에 리디렉터라는 것이 남는다. 이 리디렉터는 새로운 에셋의 경로를 가지고 있다. 이 리디렉터를 이용해 에셋을 참조하고 있던 에셋들이 새로운 에..

Package과 Asset 의 차이

Package .uasset 파일 Asset 컨텐츠 브라우저에 나타나는 것들. .uasset 파일에 포함된 대표적인 오브젝트. UObject 를 상속한 어떤 오브젝트라도 패키지의 대표 오브젝트가 될 수 있다. 패키지(.uasset)에 포함된 것이라고 볼 수 있다. Object Path 패키지 이름과 에셋 이름을 합친 경로. 예를 들어 SM_Chair 이란 패키지가 있고 대표 에셋이 SM_Chair 이면 Object Path 는 Game/.../SM_Chair.SM_Chair 이다. 에셋 생성 에디터에서 우클릭해서 에셋을 생성한다. 에셋 생성은 에셋 팩토리를 이용해 생성한다. UFactory 를 상속 받아서 특정 에셋의 팩토리 클래스를 구현 할 수 있다. 팩토리는 에셋을 찍어내는 클래스. UFactory ..

AOS, IOS 어플의 설치 경로에서 파일 읽어오기

윈도우에선 FFileHelper::LoadFileToString 으로 파일의 스트링을 읽어올 수 있지만 안드로이드나 iOS 에서 파일을 읽으려면 특수한 함수를 이용해야 한다. 안드로이나 iOS 에선 설치된 어플의 경로에서 파일을 가져와야 한다. 안드로이드의 경우 AAssetManager 를 이용해서 앱의 리소스들이 들어있는 assets 폴더의 경로를 가져와야 하고 iOS 의 경우엔 [NSBundle mainBundle] 를 이용해서 어플의 경로인 '어플 이름.app' 의 경로를 가져와야 한다. 플랫폼에 맞게 리소스가 있는 폴더 경로를 가져올 수 있는 함수가 FGenericPlatformMisc::LoadTextFileFromPlatformPackage 함수이다. 각 플랫폼에 맞게 override 해서 사..

Build.cs, Target.cs, .uproject, .uplugin 의 사용성

build.cs 각 모듈에는 각자만의 build.cs가 있다. build.cs 는 컴파일 타임에 로드되고 처리되는 전처리기 같은 거라고 한다. (런타임에서는 로드 안 됨) build.cs 에서 해당 모듈에서 참조할 다른 모듈 목록을 지정할 수 있는 등 다양한 옵션을 제공하고 있다. 아래는 build.cs 에서 지정해줄 수 있는 유용한 기능들을 정리해보았다. RuntimeDependencies 사용 예시는 아래와 같다. RuntimeDependencies.Add("$(TargetOutputDir)/cjson.dll", Path.Combine(ModuleDirectory, DllCjsonPath + "cjson.dll"), StagedFileType.SystemNonUFS); 패키징할 때 특정 경로에 특정 ..

UE4 모듈에 관해서

UE4에선 모듈이라고 라이브러리를 한 프로젝트 내에서 여러 개 생성할 수 있게 해줌. 모듈은 스태틱 라이브러리로도, DLL로도 생성이 가능하다. Modular 모드 DLL 같은 개념 Monolithic 모드 스태틱 라이브러리 같은 개념 UE4 엔진 모듈 타입 Developement 개발 도중에만 사용하는 모듈 Editor 에디터에서만 사용하는 모듈 Runtime 언제든, 어디에서든 사용 가능한 모듈 ThirdParty 써드 파티(에픽 게임즈가 코드 작성 안 한) 라이브러리(모듈), 코드 모듈과 플러그인 차이 플러그인은 모듈을 여러 개 가질 수도 있고, 리소스도 따로 가질 수 있음. 즉 모듈은 코드만 있는데 플러그인은 코드랑 리소스 둘 다 가질 수 있다. 플러그인의 모든 코드는 모듈에 포함되야 됨. UCL..

언리얼 엔진에서 dll의 사용성

ThirdParty dll을 패키징 빌드에서 사용할 때와 에디터 빌드에서 사용할 때 경로가 다르다. 패키징 빌드에서는 패키징 할 때에 dll 이 포함되도록 작업해야 한다. 패키징 빌드에서 이용하는 dll 들은 build.cs 에서 패키징 빌드의 특정 경로에 복사할 수 있도록 작성 할 수 있다. (https://haewoneee.tistory.com/101 에서 RuntimeDependencies 부분 참조) 에디터 빌드 중 참조하는 dll 들은 Binaries/(PlatformType) 의 경로에 포함해줘야 한다. 일반 모듈의 경우는 (ProjectName)/Binaries/(PlatformType) 에 포함해주면 되고, 플러그인의 경우는 각 플러그인 폴더 내에 Binaries 폴더가 있으므로 (Proj..

Build.cs에서 모듈의 private 폴더 경로 추가

참조하는 모듈의 헤더 파일이 private 폴더에 있다면 build.cs의 PublicDependencyModuleNames나 PrivateDependencyModuleNames에 모듈을 참조하겠다고 선언해도 헤더 파일 인클루드가 안 된다. 위처럼 모듈을 참조하겠다고 선언해도 #include로 헤더가 인클루드 안 된다. 하지만 방법이 있다. 헤더를 인클루드 하기 위해선 모듈의 private 폴더 경로를 추가해줘야 한다. 위에 처럼 참조하는 모듈의 Private 폴더 경로를 PublicIncludePath, 혹은 PrivateIncludePath 에 추가를 해주면 헤더 인클루드가 잘 된다. PublicIncludePath 와 PrivateIncludePath 의 기능적인 차이는 없는 걸로 보인다. 하지만 ..

World Composition Level Streaming Problem when Teleporting

월드 컴포지션 레벨 스트리밍 문제 [문제점] 텔레포트 시 레벨들이 완전히 스트리밍이 완료되기 전에 캐릭터가 생성된다. 아직 스트리밍 되지 않은 레벨에 캐릭터가 떨어지게 되면 아무 것도 없는 공중에서 계속 낙하한다. [해결 방법] 월드 컴포지션이 스트리밍 레벨들을 스트리밍 하는 방식을 이해하고 스트리밍 레벨들이 로드가 완료된 시점을 알 수 있는 방법을 찾는다. 로드가 완료된 시점부터 캐릭터를 조작할 수 있게 할 방법을 찾는다. 레벨 로딩 방식 분석 [월드, 월드 컴포지션, 스트리밍 레벨, 레벨 간의 관계] 월드는 월드 컴포지션과 레벨 배열을 갖고 있다. 월드 컴포지션은 스트리밍 레벨 배열을 갖고 있다. 스트리밍 레벨은 로드된 레벨을 갖고 있다. [월드 컴포지션의 레벨 스트리밍 방식] 월드 컴포지션은 Pla..