-
AttributeSet이 변경되면 자동 호출되는 함수들~
AttributeSet와 바인딩 되는 것은 위젯컨트롤러의 함수이다. 그리고 그 바인딩 된 위젯컨트롤러의 함수 안에서는 멤버로 가지고 있는 델리게이트들을 실행한다. 위젯은 멤버 변수로 가지고 있는 위젯컨트롤러을 참조하여 public인 델리게이트을 참조하여 자신의 UI상태을 갱신하는 함수와 바인딩 한다. 그래서 AttributeSet값이 변경되면 위젯컨트롤러의 바인딩 된 함수가 자동으로 호출될 것이고 이어서 그 함수안의 델리게이트가 호출되어 결국은 델리게이트에 바인딩 된 위젯의 UI상태 갱신 함수가 실행될 것이다. 이때 위젯컨트롤러는 위젯을 참조하고 있지 않다. 위젯컨트롤러가 참조하는 것은 AttributeSet일 뿐이다. 하지만 위젯은 위젯컨트롤러의 델리게이트을 사용하기 위해 위젯컨트롤러을 참조하고 있다.
2023.12.16
-
Widget와 WidgetController의 연동
Widget은 WidgetController의 참조을 가지고 있다. WidgetController는 Widget의 참조을 가지고 있지 않다. 대신 WidgetController은 PlayerController, PlayerState, AbilitySystemCompoment, AttributeSet의 참조을 가지고 있다. 그래서 AttributeSet의 속성 값들이 갱신 된다면 WidgetController의 브로드캐스트 함수 호출을 통해 WidgetController가 가지고 있는 델리게이트들을 실행시켜 주면 된다. 그리고 이 WidgetController의 델리게이트들에 바인딩 처리되는 로직은 Widget에 있다. WidgetController의 델리게이트 멤버들이 public이므로 Widget함수에..
2023.12.15
-
블루프린트에서 SafeDivide 노드은 분모가 0이면 값을 0으로 반환해 준다.
2023.12.14
-
Unreal에서 GPU LightMass 사용하기
참고 - https://docs.unrealengine.com/5.1/ko/gpu-lightmass-global-illumination-in-unreal-engine/ GPU 라이트매스 글로벌 일루미네이션 프리컴퓨티드 라이팅 데이터를 생성하는 GPU 기반 시스템을 살펴봅니다. docs.unrealengine.com
2023.12.13
-
Unreal에서 셰이더 컴파일 속도 높이기
참고 - https://blog.naver.com/PostView.naver?blogId=hyper1234&logNo=222941764559
2023.12.13
-
Unreal의 위젯 블루프린트에서 여러 위젯들을 겹쳐 쌓아서 출력하고 싶다면 먼저 오버레이(Overlay)을 추가해 주어야 한다.
Unreal의 위젯 블루프린트에서 여러 위젯들을 겹쳐 쌓아서 출력하고 싶다면 먼저 오버레이(Overlay)을 추가해 주어야 한다. 그리고 그 오버레이의 자식으로 위젯들을 추가해 주면 된다.
2023.12.12
-
Unreal의 위젯 블루프린트에서 위젯의 모양을 수정하고 싶은 경우 Desired로 디자이너 창을 설정해 준다.
Unreal의 위젯 블루프린트에서 위젯의 모양을 수정하고 싶은 경우 Desired로 디자이너 창을 설정해 준다. 그래야 우측 디테일 창에서 설정하는 값들이 컴포넌트에 적용이 되어 보여진다.
2023.12.12
-
ShowDebug 콘솔 명령으로 게임 어빌리티 시스템 디버깅
참고 - https://devjino.tistory.com/376
2023.12.11
-
Unreal에서 C++와 블루프린트간의 실행 순서
언리얼에서 C++이 블루프린트의 근간이지만 실제로 함수 호출은 블루프린트에서 먼저 이루어진다. 아래는 액터가 생성될 떄의 호출 순서이다. 보면 알겠지만 블루프린트의 노드가 먼저 호출되고 C++함수가 호출됨을 알 수 있다. 액터에서 C++, Blueprint 실행 순서 C++ 생성자 Blueprint의 BeginPlay C++ BeginPlay Blueprint의 EndPlay C++ EndPlay C++보다 블루프린트가 먼저 호출되었습니다. 액터, 퍼시스턴트 레벨, 서브 레벨 실행 순서 액터를 영구 레벨에 배치하면, 액터의 BeginPlay 퍼시스턴트 레벨 BeginPlay 서브 레벨 BeginPlay 서브 레벨 EndPlay 액터의 EndPlay 퍼시스턴트 레벨 EndPlay BeginPlay는 퍼시스..
2023.12.08
-
Unreal에서 포스트 프로세싱 볼륨에 머터리얼 설정하기
2023.12.05
-
Unreal의 프로젝트에서 포스트 프로세싱을 위해 스텐실 버퍼에 읽고 쓰게 설정하기
2023.12.05
-
Unreal에서 추가한 PostProcessVolume이 레벨 전체에 적용되게 하기
디테일 창에서 "무한 규모(언바운드)"을 체크해 주면 해당 레벨 전체에 대해 포스트 프로세싱이 적용된다.
2023.12.05
-
UE5에서 PlayerStart 추가하기
2023.12.04
-
Unreal에서 로테이터(Ratator) 값으로 부터 Forward벡터와 Right벡터 얻기
1.해당 액터나 컨트롤러 로테이션의 Yaw값을 이용해 Yaw로테이터을 생성한다. const FRotator Rotation = GetControlRotation(); const FRotator YawRotation(0.f, Rotation.Yaw, 0.f); 2.Yaw 로테이터을 행렬 연산하여 Forward벡터와 Right벡터을 얻는다. const FVector FowardDir = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); const FVector RightDir = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
2023.12.03
-
UE5에서 향상된 입력을 사용하려면 Build.cs에 "EnhancedInput"모듈을 추가해 주어야 한다.
2023.12.01
-
Unreal에서 참조할 변수을 검증된 노드로 변환하기
2023.11.30
-
애니메이션 블루프린트도 베이스가 되는 블루프린트을 만들어 상속하여 사용할 수 있다. 그럴경우 템플릿으로 애니메이션 블루프린트을 생성해 주어야 한다.
1.애니메이션 블루프린트 템플릿 만들기 2.상속받아 새로운 블루프린트 생성
2023.11.30
-
Unreal 캐릭터 무브먼트의 속도 벡터로 부터 현재 속도 얻기
2023.11.30
-
Unreal C++에서 헤더 파일의 참조 경로 설정
만약 Character라는 하위 폴더가 있고 그 폴더 안에 MyCharacter.h파일이 있다면 아래와 같이 Build.cs파일에 폴더 이름을 추가해 준다. 그러면 MyCharacter.h을 선언시 Character 폴더 경로을 사용할 필요 없다. 헤더 파일명만 선언해 주면 된다. #include " MyCharacter.h " *.Build.cs에 아래와 같은 형식으로 추가해 주면 된다. PrivateIncludePaths.Add("Character"); PrivateIncludePaths.Add("Character/Enmey"); 참고 - https://devjino.tistory.com/212
2023.10.25
-
GameUserSettings.ini의 값들을 설정하는 곳~
UGameUserSettings클래스을 상속받아 코드로 창 모드나 기본 해상도 등에 대한 설정을 할 수 있다.
2023.08.28
-
패키징 한 실행 파일을 창 모드로 실행하기
패키징 한 후 Saved 폴더에서 GameUserSettings.ini파일을 찾아서 [/Script/Engine.GameUserSettings]섹션의 해상도 관련 설정들을 수정해 준다.
2023.08.28
-
프리컴파일러 디렉티브 지시문
언리얼 엔진 C++코드에서 조건부 컴파일을 하고자 하거나 특정 동작을 수행하게 지시하고자 할 떄 아래와 같은 지시문을 사용한다. #pragma once - 같은 헤더 파일이 중복 사용되는 것을 방지 하기 위해 사용 #ifdef, #ifndef, #endif - 조건부 컴파잉을 하고자 할 때 사용 #define - 매크로을 정의 하거나 가독성을 높이기 위해 사용
2023.08.27
-
AsyncTask와 UnrealTaskGraph에 대해~
AsyncTask와 UnrealTaskGraph은 둘다 비동기 태스크 작업을 행하지만 작업의 성격에 따라 달리 사용해야 한다. - AsyncTask - 비동기 어셋 로딩 같은 단순한 비동기 작업에 적합하다. - UnrealTaskGraph (ParallelFor, ParallelAsync) - AI 병렬 처리, 물리학 계산, 복잡한 데이터 처리 같이 디테일한 스레드 제어가 필요한 비동기 작업에 적합하다.
2023.08.24
-
언리얼에서 대량의 AI 캐릭터 처리
- 언리얼 엔진은 내부적으로 이미 멀티 쓰레드로 AI에 관련된 기능들을 처리하고 있기 때문에 프로그래머가 따로 저 수준의 작업을 할 필요는 없다고 한다.
2023.08.24
-
언리얼 GPU 시각화 툴
- GPU 시간화 툴을 왜 사용하는가? GPU 시각화 툴은 GPU가 하는 작업들에 대해 얼만큼의 시간을 소모하는지 구체적으로 보여주기 때문에 어떤 렌더링 요소가 시간을 얼마나 잡아 먹는지 쉽게 파악할 수 있어 그래픽 적인 최적화에 유용하게 사용할 수 있다. 예를 들어 포인트 라이트가 다른 것들 보다 많은 처리 시간을 잡아 먹는다고 파악되면 해당 포인트 라이트을 아웃라이너에서 찾아서 설정이 어떻게 되어 있는지 파악하고 문제가 있을 시 수정하면 된다. GPU 시각화 툴은 GPU에서 하는 작업에 대한 프로파일링을 할 수 있다. - Ctrl + Shift + , 키을 누르면 실행된다. - Scene버튼을 클릭하면 상세 페이지를 볼 수 있다. - 하단의 탭에서 경과 시간(ms)을 클릭하여 시간 순으로 정렬하여 어..
2023.08.24
-
언리얼 빌드 환경 확인하기
참고 링크 - https://devjino.tistory.com/366
2023.08.23
-
언리얼 인사이트01 (Unreal Insights)
참고1 - https://youtu.be/ssBKLh0fDzY 참고2 - https://youtu.be/af_M38Z325I 1.언리얼 인사이트 프로그램을 실행 시켜 놓는다. 2.게임을 실행한다. 3.언리얼 인사이트의 커넥션 탭에서 Connect 버튼을 클릭하여 게임에 연결한다. (보통은 인사이트가 실행된 상태에서 게임을 실행하면 자동으로 연결되어 추적하기 시작한다.) 4.Trace Store창에서 해당 게임이 추적되고 있는걸 확인할 수 있다. 아래는 에디터을 실행한 경우이다. 에디터을 실시간(Live)로 추적하고 있는 걸 볼 수 있다. 5.프로파일링 하고자 한다면 해당 항목을 선택하고 하단의 Open Trace버튼을 클릭한다. 6.그러면 이와같이 프로파일링 창이 뜬다. 7.추적을 중지시키고 싶다면 콘솔..
2023.08.23
-
언리얼 블루프린트 흐름제어 노드들
참고 링크 - https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/Blueprints/UserGuide/FlowControl/ 플립 플롤 (Flip Flop) - 실행할 때 마다 내부 boolean 변수가 토글되어 A와 B 핀이 순차적으로 실행된다. 첫 번째 실행은 A핀이 실행 두번째 실행은 B핀이 실행 그리고 세 번째 실행은 다시 A핀이 실행된다. 이렇게 노드을 호출할 때 마다 A와 B가 번갈아 실행된다. 기존에 토글되는 기능을 만들어야 할 경우 boolean변수을 따로 만들어 토글 기능을 구현해 주어야 했는데 이 노드는 자체적으로 토글 기능을 가지고 있다. 멀티 게이트(Multi Gate) - 노드을 호출할 때 마다 Out0핀에서 다음 순서의..
2023.08.23
-
언리얼 엔진 버전 단위로 DDC 경로 설정해 주기
언리얼 엔진 에디터의 개인설정 창에서 DDC 경로을 설정하면 다른 엔진 버전에도 동일하게 설정되는 문제가 있다. 따라서 엔진 버전 마다 DDC 경로을 따로 설정하려면 언리얼 엔진의 설치 폴더에서 \Engine\Config\BaseEngine.ini 파일을 열어서 직접 DDC 경로을 설정해 주면 된다. 1.먼저 [InstalledDerivedDataBackendGraph]라는 섹션을 찾는다. 2.Local의 Path에 원하는 폴더 경로을 설정해 준다. 아래의 예는 Unreal4와 Unreal5을 각각 따로 설정한 예이다. 물론 에디터의 개인설정 창에서는 DDC 경로을 모두 비워준다.
2023.08.22
-
언리얼 최적화 01
아래 링크을 보고 공부하면서 정리한 내용입니다. https://devjino.tistory.com/m/373 큰 범위에서 작은 범위로 좁혀 가면서 분석하여 병목 지점을 찾아야 한다. 구체적으로 CPU에서 발생하는지 GPU에서 발생하는지 아니면 특정 쓰레드에서 병목 현상이 발생하는지 파악을 해야 한다. 따라서 가장 먼저 사용하는 기능은 'stat unit'라는 콘솔 명령이다. 실시간 그래프을 보고 싶다면 'stat unitgraph'라는 명령을 사용한다. 60프레임이 목표라면 프레임 간의 시간 간격은 16.66밀리 세컨드 보다 작아야 한다. 30프레임이 목표라면 프레임 간의 시간 간격은 33.33밀리 세컨드 보다 작아야 한다. 엔진 퀄리티 설정이 프렘이 큰 영향을 주기 때문에 하드웨어의 스펙에 따라 엔진 ..
2023.08.22
-
언리얼에서 Sleep()함수을 사용해서 딜레이 주기
블루프린트에서는 Delay노드을 통해 설정한 값 만큼 시간을 지연 시킬 수 있다. C++에서는 아래와 같이 시간을 지연 시킬 수 있다. FPlatformProcess::Sleep(2.f);
2023.08.21
-
언리얼 엔진에서 비동기 작업을 수행하고 콜백 받기
//this을 사용하면 AnyncTask함수을 호출하는 객체의 함수도 태스크 안에서 그대로 사용할 수 있다. void AMyAsyncTask::RunTask(FTaskCallbackDelegate CallbackDel) { UE_LOG(LogTemp, Log, TEXT("AMyAsyncTask::RunTask_111")); int32 NumCount = 100; AsyncTask(ENamedThreads::AnyHiPriThreadNormalTask, [this, NumCount, CallbackDel]() { UE_LOG(LogTemp, Log, TEXT("AMyAsyncTask::RunTask_222")); UE_LOG(LogTemp, Log, TEXT("%d"), NumCount); UpdateTa..
2023.08.18
-
언리얼에서 각종 게임 프레임워크 객체의 참조 얻는 방법
참고 - https://kyoun.tistory.com/81
2023.08.18
-
VR이나 모바일에 포스트 이펙트 적용
프로젝트 세팅에서 모바일 HDR을 활성화 하면 포스트 이펙트가 적용된다. 만약 비 활성화 하면 성능은 올라간다.
2023.08.18
-
Unreal 목차
언리얼 에디터에서 카메라 위치 북마크 하기 언리얼 에디터에서 카메라 위치 북마크 하기 아래 이미지 처럼 직접 메뉴을 선택하거나 단축키로 카메라의 위치을 북 마킹 할 수 있다. 그리고 북마킹 된 카메라 위치는 단순히 숫자키을 눌러주면 카메라가 해당 위치로 위치하게 된다. Ctrl+ road-road.tistory.com 언리얼 프로파일링 언리얼 프로파일링 참고 - https://devjino.tistory.com/373 road-road.tistory.com VR이나 모바일에 포스트 이펙트 적용 VR이나 모바일에 포스트 이펙트 적용 프로젝트 세팅에서 모바일 HDR을 활성화 하면 포스트 이펙트가 적용된다. 만약 비 활성화 하면 성능은 올라간다. road-road.tistory.com 언리얼에서 각종 게임 프..
2023.08.17
-
언리얼 에디터에서 카메라 위치 북마크 하기
아래 이미지 처럼 직접 메뉴을 선택하거나 단축키로 카메라의 위치을 북 마킹 할 수 있다. 그리고 북마킹 된 카메라 위치는 단순히 숫자키을 눌러주면 카메라가 해당 위치로 위치하게 된다. Ctrl+숫자키.... => 북마킹 숫자키... => 북마킹 카메라 위치로 이동 UE5에서도 비슷하다.
2023.08.17
-
WorldContextObject을 인자로 요구하는 C++함수을 블루프린트 노드로 만들기
C++코드에서 UGameplayStatics::GetPlayerPawn( )함수는 첫 번째 인자로 WorldContextObject을 인자로 요구한다. 따라서 보통 GetWorld()함수을 통해 인자을 입력해 준다. APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0); 하지만 블루프린트의 GetPlayerPawn노드 에서는 WorldContextObject 인자를 요구하지 않는다. 그 이유는 meta 키워드을 통해서 WorldContextObject을 설정해 주기 때문이다. 아래 코드는 블루프린트의 GetPlayerPawn 노드에 대한 C++ 선언이다. 보면 알겠지만 WorldContextObject을 meta 키워드을 통해 설정하고 있..
2023.08.17
-
Unreal 메모리 관리
Unreal의 참조 카운팅 시스템 - UObject클래스로부터 파생된 클래스 객체들의 메모리을 관리하는 시스템 UObject로 부터 파생되지 않는 클래스의 경우(순수 C++클래스의 경우) - TsharePtr, TWeakPtr를 사용해야 한다. 메모리 할당(객체 생성) Unreal에서 더 이상 참조하지 않는 메모리 포인터는 즉시 지워지거나 마킹이 되어 다음 차례의 가비리 컬렉션때 삭제된다. Unreal에서 메모리가 관리되기 위해서는 NewObject 또는 SpawnActor을 통해 객체가 생성되어야 한다. UObject 파생 클래스는 NewObject을 통해 객체가 생성된다. AActor 파생 클래스는 SpawnActor을 통해 객체가 생성된다. Unreal에서 객체들의 포함관계 Package -> Wo..
2023.08.17
-
에픽런쳐의 언리얼5.1와 GitHub에서 받아 빌드한 언리얼5.1 버전의 DDC 폴더 설정
에픽런쳐을 통해 설치된 언리얼 5.1와 GitHub에서 소스코드을 받아서 빌드한 언리얼5.1은 DDC폴더을 공유한다. 즉 각 엔진마다 따로 DDC폴더을 설정하려고 해도 마지막에 설정한 폴더가 두 엔진 모두에 설정된다. 아마도 어딘가에 DDC폴더 경로을 저장한 파일을 공유하는 것 같다. 따라서 두 엔진 모두 엔진 버전이 같다면 DDC폴더가 공유 된다는 것을 유의하자~ 내가 GitHub에서 언리얼 엔진 소스코드을 다운받아 컴파일 한 것은 DebugEditor로 실행하였다. DevelopmentEidtor로 실행되는 에픽런쳐 엔진와 DDC 폴더을 공유하지만 크게 문제가 되지는 않는 것 같다.
2023.08.16
-
언리얼의 리플렉션 기능을 이용하여 클래스나 구조체의 정보 얻기
아래의 코드에서 TFieldIterator나 UProperty을 사용하기 위해서는 위에 정의된 헤더 파일들을 기억하자. #include "UObject/UnrealType.h" #include "UObject/UnrealTypePrivate.h" void AccessVariableNames() { FMyStructure MyStructureInstance; const UStruct* Struct = MyStructureInstance.StaticStruct(); for (TFieldIterator PropIt(Struct); PropIt; ++PropIt) { UProperty* Property = *PropIt; FString PropertyName = Property->GetName(); FStrin..
2023.08.14
-
언리얼에서의 메모리 할당
UObject의 파생 객체을 생성할 때 - NewObject Actor의 파생 객체을 생성할 때 - SpawnActor
2023.08.14
-
언리얼 엔진 빌드 환경
결론 - 코드을 디버깅 하고자 한다면 Debug Editor이나 DebugGame Editor을 사용할 것~ Debug Editor - 언리얼 에디터와 게임 로직 모두을 디버깅 할 수 있다. DebugGame Editor - 언리얼 에디터는 디버깅을 할 수 없고 게임 로직들만 디버깅이 가능하다. 즉 엔진은은 Development로 빌드되고 게임 로직만 Debug로 빌드된다. 따라서 에디터을 쾌적하게 실행할 수 있다. Development Editor - 에디터을 Development로 빌드한 것으로 보통 일반적인 개발용으로 사용하고 디버깅은 되지 않는다. Development - 에디터은 제외한 게임 로직만 빌드하는 환경으로 개발에 관련된 기능들이 추가된 환경이다. 보통 팀 내에서 빌드해서 테스트할 때 ..
2023.08.11
-
Unreal 5.1.1 엔진 소스 Setup.bat 오류 해결 방법
Unreal 5.1.1의 소스코드을 다운받아 Setup.bat을 실행하면 아래와 같은 오류가 발생한다. Failed to download 'http://cdn.unrealengine.com/dependencies/UnrealEngine-23448686/00bea197a7e321f427afb5898d135b353746bab8': InvalidDataException: The archive entry was compressed using an unsupported compression method. at System.IO.Compression.Inflater.Inflate(FlushCode flushCode) at System.IO.Compression.Inflater.ReadInflateOutput(Byt..
2023.08.10
-
UIinstanceStaticMeshComponent을 사용하여 대량의 스택틱 메쉬을 생성하는 이유
UIinstanceStaticMeshComponent을 사용하여 대량의 스택틱 메쉬을 생성하는 이유 1.드로우 콜 감소 2.메모리 효율성 증가 3.성능 향상 4.관리 용이성 5.인스턴스 렌더링 기능 동일한 모양의 대량의 오브젝트들을 성능의 하락 없이 렌더링 하고자 할 때 UIinstanceStaticMeshComponent을 사용한다.
2023.07.27
-
[UE] 빠른 개발을 위한 블루프린트 사용 전략
프로젝트을 C++프로젝트로 생성을 하지만 일단 모든 것들을 블루프린트로 개발한다. 블루프린트로 개발하는 것이 개발 속도에 있어서 장점이 된다. 그리고 추후 성능 프로파일링을 거쳐 최적화가 필요한 부분들만 C++로직으로 변환한다.
2023.07.07
-
Unreal의 콘솔(Console) 명령어 보기
2023.06.21
-
Static Mesh의 LOD 설정
트라이앵글이 128개인 Plane 메쉬에 LOD을 적용하자~ 인스펙트의 LOD세팅>LOD그룹을 HighDetail로 설정한다. (Deco, Foliage등이 다양하지만 여기서는 HighDetail이 가장 좋은 설정인거 같아 사용~) LOD 0단계 LOD 1단계 LOD 2단계 LOD 3단계 LOD 4단계 LOD 5단계
2023.06.21
-
MyUnityPatcher
유니티의 어드레서블 어셋 시스템을 이용해서 공부하면서 Patcher 데모을 개발해 보았다. 개인 나스 서버에 빌드한 어셋 번들와 카탈로그 파일을 업로드 한 후 안드로이드 에뮬레이터을 통해 테스트해 보았다. 물론 안드로이드 태블릿에서도 문제 없이 작동한다. 그룹은 설치 파일에 포함되는 Local 그룹와 원격 서버에 업로드 될 Remote, Stage01, Duplicate Asset Isolation 그룹으로 나누었다. Duplicate Asset Isolation 그룹은 내가 직접 만든 그룹이 아니라 중복 어셋을 분석해서 새로운 그룹을 생성해 주는 Addressables Analyze의 기능을 사용해서 생성하였다. Addressables Analyze에서 Fix Selected Rules을 실행하면 된다..
2023.06.12
-
어드레서블 어셋 시스템의 Contiguous Bundles와 Non-Recursive Dependency Calculation 설정에 대해~
Addressables Groups > Tools > Inspect System Settings > Build Contiguous Bundles(연속 번들) - 이 옵션을 체크하면 보다 효율적인 번들 레이아웃을 생성해 준다. 단 주의할 점은 현재 패치된 번들 파일이 Addressables 1.12.1 버전 또는 이전 버전으로 생성된 거라면 이 옵션을 체크하지 않는게 좋다. Non-Recursive Dependency Calculation(비 재귀 종속성 계산) - 어셋들간에 서로 종속하여 재귀적인 종속성이 있어 빌드 시간이 길어지는 문제를 해결하고 런타임 메모리 사용량을 줄이려면 이 옵션을 체크한다. 참고 - https://docs.unity3d.com/Packages/com.unity.addressab..
2023.06.01
-
작업중 - Addressables.GetDownloadSizeAsync()함수의 정확한 파일 사이즈 얻기
어드레서블 그룹들을 리모트로 설정한 상황에서 유니티 에디터에서 프로젝트 실행시 Addressables.GetDownloadSizeAsync()함수을 호출한다고 해서 어드레서블 번들의 정확한 파일 사이즈을 알 수 있는 것은 아니다. Play Mode Script의 설정이 Use Existing Build로 설정되어야 에디터에서 플레이 시에 정확한 다운로드 파일 사이즈을 얻을 수 있다. 물론 빌드된 어드레서블 번들 파일은 Remote 서버에 업로드 해 주어야 한다.
2023.06.01
-
리모트 카탈로그(Remote Catalog) 사용하기
원격의 서버로 부터 새로운 어드레서블 번들을 다운받기 위해서는 현재 로컬의 번들와 서버의 번들의 차이점을 알 수 있는 최신 카탈로그 파일이 있어야 한다. 따라서 어드레서블 어셋 시스템에서는 리모트 카탈로그을 사용할지 말지를 설정하고 사용한다면 어떤 경로에서 카탈로그 파일을 다운 받을지에 대한 설정을 할 수 있다. 주의해야 할 점은 c# 코드을 통해 최신 카탈로그 파일을 갱신한다면 Disable Catalog Update on Startup을 체크해 주어야 한다. 만약 체크를 해제해 준다면 게임 실행시 자동으로 카탈로그 파일을 갱신한다.
2023.06.01
-
어드레서블 어셋 그룹의 로컬와 리모트 설정에 대해~
어드레서블 어셋 시스템에서는 어셋들을 그룹 단위로 로컬에서 로드할 지 아니면 원격에서 다운받아 로드할 지 설정할 수 있다. 그룹을 로컬로 설정하면 패키징시 설치 파일에 함께 포함되며 원격으로 설정하면 따로 어셋번들을 빌드해서 원격서버에 업로드 해 주어야 한다. 이렇게 함으로써 파일 사이즈가 작고 항상 로드하는 어셋은 설치파일에 포함시키고 파일 사이즈가 크거나 특정 조건에만 로드하는 어셋들은 원격의 어셋 서버로 부터 다운받아 사용할 수 있다. 테스트로 Inventory Items그룹은 로컬로 설정하였고 Duplicate Assets Sorted By Label은 원격으로 설정하였다. 따라서 어드레서블 어셋을 빌드할 때 Duplicate Assets Sorted By Label 그룹만 빌드될 것이다. 물론 ..
2023.06.01
-
어드레서블 어셋 시스템에서 특정 그룹을 빌드에서 제외 시키는 옵션
특정 그룹을 빌드에서 제외 시키고 싶다면 해당 그룹의 인스펙터 창에서 Advanced Options의 Include in Build을 체크 해제 해 주면 되다.
2023.06.01
-
어드레서블 어셋 시스템을 에디터에서 테스트 할 때 주의할 점~
Play Mode Script은 3가지 모드을 지원한다. 1.Use Asset Database 2.Simulate Groups 3.Use Existring Build - 원격 서버로 부터 어셋 번들을 다운받아 로드한다. 이 3가지 모드중 Use Asset Database와 Simulate Groups 모드은 어드러서블 어셋을 Build하지 않아도 에디터에서 실행하는데 문제가 없지만 Use Existring Build은 사전에 어셋을 빌드해 주어야 오류없이 동작한다. Use Existring Build시에 사전에 어드레서블 어셋 빌드를 안 하고 에디터에서 게임을 실행하면 아래와 같은 오류가 발생한다. 또한 빌드후에 실제 원격 서버에 해당 어셋 번들들이 존재 하지 않으면 어셋들을 로드할려고 할 때도 오류가 ..
2023.06.01
-
Memory Profiler 사용시 주의할 점~
에디터에서 어드레서블을 사용하는 프로젝트을 플레이 한 후 메모리 프로파일러로 메모리을 프로파일링 할 경우 아무것도 스폰하지 않아도 일부 텍스쳐가 메모리에 로드되어 있는 상황이 있을 수 있다. 왜냐하면 이전 플레이의 영향으로 에디터에서 텍스쳐를 참조하는 부분이 남아 있을 수 있기 때문이다. 따라서 정확한 측정을 위해서는 에디터을 다시 실행해서 테스트을 하거나 모바일 기기에 프로젝트을 설치하고 원격으로 메모리을 프로파일링을 해 봐야 한다. 메모리 프로파일러로 정확한 메모리을 프로파일링 하기 위한 방법 에디터을 종료후 다시 실행해서 프로파일링을 시도해 본다. 게임을 빌드해서 아예 해당 기기에서 실행한 후 원격으로 프로파일링 해 본다.
2023.06.01
-
모바일에서 오디오(Audio) 메모리 최적화
Force To Mono - 모바일에서는 스트레오 사운드는 큰 의미가 없다. 모노 포맷으로 바꾸어서 메모리 용량을 줄이자~ Load Type Decompress on load - 오디오 파일이 256KB보다 작으면 압축하지 않고 그대로 사용해도 된다. 총성이나 타격음등에 사용~ Compressed into memory - 오디오 파일이 1MB보다 작으면 압축해서 사용한다. 총성이나 타격음등에 사용~ (압축했다고 해서 메모리 로드후에 압축이 풀려서 사용되는 건 아니다. 압축한 형태 그대로 메모리에서 플레이 된다. 만일 용량이 큰 오디오 파일을 이 옵션으로 사용한다면 사운드 플레이시에 반응속도가 느릴 것이다.) Streaming - 오디오 파일의 사이즈가 1MB보다 크면 그냥 스트리밍을 하여 사용하자~ 배경..
2023.05.25
-
프로파일러 (Profiler)
게임의 메모리 상태를 대략적으로 파악하고자 할 때는 프로파일러을 사용하면 된다. Window > Analysis > Profiler 하지만 더 자세하게 메모리 상태를 체크하고 싶다면 메모리 프로파일러을 사용해야 한다.
2023.05.25
-
메모리 프로파일러(Memory Profiler)
Memory Profiler은 패키지 매니저로 부터 설치한다. 만약 패키지 매니저에 메모리 프로파일러가 보이지 않는다면 아래의 URL을 패키지 매니저에 추가하여 해당 패키지을 불러오자~ com.unity.memoryprofiler 실행은 Window > Analysis > Memory Profiler로 시작된다. 게임을 플레이한 상태에서 메모리 프로파이러에서 Capture을 클릭하여 스냅샷을 얻고 Open을 클릭하여 열어준다. 그러면 스냅샷을 했던 때의 메모리 상태을 볼수 있다. 또한 두가지 상황에서의 스냅샵을 찍어서 Swap와 Diff 기능으로 두 스냅샵의 메모리 상태를 비교할 수 있다. 메모리 프로파일러는 에디터에서의 캡쳐는 큰 의미가 없다. 왠만하면 모바일 기기와 연결된 상태에서 캡쳐하여 분석하자~..
2023.05.25
-
Addressable Asset System 메모리 최적화 전략
어드레서블 어셋이란 어드레스가 할당 된 어셋을 의미한다. 이 어드레스(주소)를 통해 시스템은 어디서든 해당 어셋을 동일하게 참조할 수 있다. 어드레서블 에셋 시스템도 하나의 에셋을 로드하면 그 에셋에 종속된 에셋들 모두 함께 로드하는 시스템이다. 문제점 01 - 프리팹을 스크립트의 public 멤버에 바인딩을 하는 것 만으로도 게임 실행시 월드상에 해당 프리팹들을 스폰하지 않아도 해당 프리팹와 종속 어셋들은 모두 메모리에 자동으로 로드된다. 따라서 이 메모리 로드 문제를 해결하기 위해서는 어드레서블 어셋 시스템을 사용해야 한다. 문제점 02 - 문제점 01을 해결하기 위해 어드레서블 어셋 시스템을 사용하여 참조을 한다고 해도 어드레서블 어셋 시스템에서 어셋번들 파일안에 있는 어셋을 부분적으로 로드할 수 ..
2023.05.25
-
유니티 어드레서블 어셋 시스템에서 Addressables.UpdateCatalogs()함수가 실행 안되는 문제~
아래 코드에서 catalogsToUpdate.Count가 0보다 커야 하는데 값이 항상 0이라면 Disable Catalog Update on Startup이 체크 되어 있는지 확인해야 한다. 즉 Inspector System Settings에서 Disable Catalog Update on Startup을 체크하지 않으면 Addressables.InitializeAsync()함수 내부적으로 Addressables.UpdateCatalogs()함수을 호출하여 카탈로그을 업데이트 한다. 따라서 내가 구현한 코드에서 Addressables.UpdateCatalogs()함수을 실행하고 싶다면 Disable Catalog Update on Startup을 체크해 주자~
2023.05.23
-
컨텐츠 업데이트 제한 (Content Update Restriction)
Cannot Change Post Release - 업데이트 하지 않을 것으로 예상되는 정적 컨텐츠 그룹에 설정한다. Can Chanage Post Release - 업데이트 될 수 있는 동적 컨텐츠 그룹에 설정한다.
2023.05.17
-
AsyncOperationHandle은 비동기 작업을 위한 템플릿 구조체이다.
AsyncOperationHandle은 비동기 템플릿 구조체로서 비동기 작업을 하고자 하는 타입을 타입으로 설정하여 사용한다. 예를 들어 어드레서블 어셋 시스템에서 어셋에 관련되어 비동기로 다운로드 받거나 로드하거나 할 때에 이 구조체을 사용하여 해당 어셋이 다 로드 되었는지 또는 다 다운로드 되었는지를 이 구조체 값을 확인하여 작업이 이루어진다.
2023.05.17
-
StartCoroutine()로 실행하지 않는 코루틴 함수
IEnumerator Start() { Isinitialized = false; syncOperationHandle InitAddressables = Addressables.InitializeAsync(); yield return InitAddressables; yield return UpdateCatalog(); Isinitialized = true; } Start(), Awake등등의 함수중 비동기로 로직을 실행하고자 한다면 반환형 타입을 IEnumerator로 선언해 주면된다.
2023.05.17
-
어드레서블 어셋 시스템 작업01
어드레서블 어셋 특징들 스크립트를 제외한 거의 모든 것을 넣을 수 있다. 각 그룹은 하나의 번들로 간주된다. 그룹에 추가된 어셋의 이름을 설정할 수 있따. 그룹에 추가된 어셋에 레이블 이름을 설정할 수 있다. Object.Instantiate()와 AssetReference.InstantiateAsync()의 차이 Object.Instantiate() - 로컬 어셋만 인스턴싱 가능 AssetReference.InstantiateAsync() - 원격 서버의 어셋을 비동기로 다운로드 및 인스턴싱 가능 AssetReference.LoadAssetAsync() - 어셋이 로컬이든 원격이든 상관없이 비 동기적으로 로드하고 Completed 이벤트로 콜백을 해 준다.
2023.05.17
-
어드레스블 어셋에서 업데이트로 빌드된 어셋 번들은 가장 최신 번들이다. 따라서 서버의 이전 버전의 번들을 삭제하고 최신 버전의 번들을 업로드해서 사용해야 한다.
어드레스블 어셋에서 업데이트로 빌드된 어셋 번들은 가장 최신 번들이다. 따라서 서버의 이전 버전의 번들을 삭제하고 최신 버전의 번들을 업로드해서 사용해야 한다. 즉 Update a Previous Build로 빌드된 어셋번들은 최근에 변환된 어셋 정보만 가지고 있는게 아니라 어셋번들 전체에 대한 정보 모두을 가지고 있다. 따라서 가장 마직만 빌드된 어셋 번들만 서버에 업로드해서 패치해 주면 된다.
2023.05.12
-
어드레서블 어셋 시스템에서 어브레서블 그룹에 등록된 어셋은 코드에서 3가지 방법으로 인스턴싱 할 수 있다.
어드레서블 그룹에 등록된 어셋을 인스턴싱하는 3가지 방법 1.어셋의 이름으로 인스턴싱 어드레서블 그룹에 등록된 어셋은 코드에서 그냥 해당 어셋의 이름을 그대로 사용해도 어드레서블이 자동적으로 찾아서 해당 어셋을 인스턴싱해 준다. 즉 어셋의 이름이 Cube라면 그냥 Cube 문자열을 사용해서 인스턴싱할 수 있다. 다만 주의할 점이 있다. 어셋을 어드레서블 그룹에 드래그 앤 드롭을 했다면 그대로 경로명이 이름으로 설정되므로 긴 경로명을 그대로 사용할 게 아니라면 이름을 설정해 주어야 한다. IEnumerator InstantiateAsset(string asset) { var async = Addressables.LoadAssetAsync(asset); yield return async; GameObject..
2023.05.12
-
DownloadDependenciesAsync()함수의 첫 번째 인자는 어드레서블 어셋의 Label이다.
오래간 만에 예전에 만들어 놓은 어드레서블 어셋 데모를 다시 보다가 아무리 다운로드 버튼을 클릭해도 원격 서버의 어셋번들이 다운로드 되지 않았다. 이유를 찾아보니 어드레서블 그룹을 새로 만들면서 그룹 이름와 라벨 이름을 혼동했다. DownloadDependenciesAsync()함수에 라벨 이름을 넣어 주어야 하는데 계속 그룹 이름을 넣고 다운로드 실행을 하고 있었음~ 함수의 레퍼런스을 한번 확인하면 될 것을 습관이 무섭다.
2023.05.12
-
어드레서블 어셋 시스템 (Addressable Asset System)
어셋번들와 어드레서블의 차이점 어셋번들 - 원격의 어셋을 경로를 통해 직접 가져오는 방식 어드레서블 - address라는 중개자를 통해 원격의 어셋을 가져온다. (따라서 프로그래머가 별도의 URL 경로를 가지고 코딩 작업할 필요가 없다.) 어드레서블 그룹 (Addressable Group)은 여러개의 어셋을 포함한다. 따라서 이게 빌드되면 그룹당 하나의 어셋번들이 생성된다. 그리고 당연히 해당 번들에는 여러개의 어셋들이 포함되어 있다. 어드레서블 그룹은 어셋 종류별 또는 레벨에 따라 그룹핑 할 수 있다. 어드레서블 그룹에 어셋을 추가하는 방법은 크게 3가지 방법이 있다. 방법1 - 어셋을 어드레서블 그룹창에 드래그 앤 드롭 방법2 - 인스펙트 창에서의 Addressable 체크 박스 설정 방법3 - 레이..
2023.05.11
-
UObject를 상속 받지 않는 커스텀 클래스의 메모리 관리
UObject을 상속 받지 않은 커스텀 클래스는 TSharedPtr나 TWeakPtr을 사용해서 개체의 참조가 0이 될때 메모리을 해지하는 방법으로 메모리을 관리한다. class PlayerCharacter {}; TSharedPtr PlayerChar (new PlayerCharacter()); TWeakPtr PlayerChar (new PlayerCharacter()); TSharedPtr은 공유 포인터이고 TWeakPtr은 약한 포인터이다. 참조 카운트가 0이 되어도 개체의 메모리을 해지 안되게 하는 기능의 유무 차이 TSharedPtr - 참조 카운트가 0이 되어도 메모리에 개체을 계속 유지시키는 옵션 기능이 있다. TWeakPtr - 참조 카운트가 0이 되어도 메모리에 개체을 계속 유지시켜주는..
2022.12.19
-
2022/12/19 개발 일지
UObject를 상속 받는 것들에 대한 메모리 관리 UObject을 상속 받는 것들에 대한 메모리 관리 언리얼에서 클래스의 멤버 변수가 UPROPERTY을 통해 가비지 컬렉터을 통해 메모리 관리가 되듯이 멤버 함수도 UFUNCTION 매크로을 통해 가비지 컬렉터로 메모리 관리가 된다. UFUNCTION() void Attack(); 언 road-road.tistory.com UObject를 상속 받지 않는 커스텀 클래스의 메모리 관리 UObject를 상속 받지 않는 커스텀 클래스의 메모리 관리 방법 UObject을 상속 받지 않은 커스텀 클래스는 TSharedPtr나 TWeakPtr을 사용해서 개체의 참조가 0이 될때 메모리을 해지하는 방법으로 메모리을 관리한다. class PlayerCharacter ..
2022.12.19
-
UObject을 상속 받는 것들에 대한 메모리 관리
언리얼에서 클래스의 멤버 변수가 UPROPERTY을 통해 가비지 컬렉터을 통해 메모리 관리가 되듯이 멤버 함수도 UFUNCTION 매크로을 통해 가비지 컬렉터로 메모리 관리가 된다. UFUNCTION() void Attack(); 언리얼 엔진에서 UObject을 상속받는 모든 클래스들은 엔진의 가비지 컬렉터을 통해 메모리 관리가 될 수 있다. 다만 클래스는 UCLASS, 멤버 변수는 UPROPERTY, 멤버 변수는 UFUNCTION 매크로을 선언해 주어야 한다. UCLASS() class PROJECT_NAME_API APlayerCharacter : public ACharacter { }; UPROPERTY() APlayerCharacter* PlayerCharacter; UPROPERTY을 사용하는 ..
2022.12.19
-
2022/12/08 개발 일지
언리얼 C++클래스 UCLASS()에서 사용하는 Blueprintable와 BlueprintType에 대해~ Blueprintable - 해당 C++클래스을 블루프린트의 부모 클래스로 사용할 수 있게 해 주는 지정자 BlueprintType - 해당 C++클래스을 블루프린트의 변수로 사용할 수 있게 해 주는 지정자 UCLASS(BlueprintType, Blueprintable) class COMPOSURE_API UCompositingPostProcessPass : public UCompositingElementTransform { GENERATED_BODY() ... } NewObject로 생성한 C++ 오브젝트의 멤버 변수에 설정된 델리게이트가 무효화 되어 제대로 호출되지 않는 문제에 대해~ C++..
2022.12.08
-
UE4와 UE5의 개발 정보들
C++에서 기본 타입 변수들의 문자열 변환
2022.12.07
-
언리얼에서 UKismetStringLibrary을 이용하여 여러 타입의 변수들을 문자열로 변환하기
UKismetStringLibrary클래스에는 아래와 같이 특정 타입의 변수을 문자열로 변환하는 static함수들이 있다. FString UKismetStringLibrary::Conv_FloatToString(float InFloat) { return FString::SanitizeFloat(InFloat); } FString UKismetStringLibrary::Conv_IntToString(int32 InInt) { return FString::Printf(TEXT("%d"), InInt); } FString UKismetStringLibrary::Conv_ByteToString(uint8 InByte) { return FString::Printf(TEXT("%d"), InByte); } FStr..
2022.12.07
-
2022/12/07 개발 일지
ChunkDownloader을 통해 정상적인 패치 수행하기 전 사전 작업들~ Http기능을 통해 패치 서버가 실행 중인지 검사한다. 패치 서버가 정상 실행중 이라면 서버에서 최신 ContentBuildId을 얻어온다. 패치 서버로 부터 가져온 ContentBuildId을 청크 다운로더의 초기화 함수 인자로 입력해서 청크 다운로더을 실행한다. UKismetStringLibrary을 이용하여 기본 타입 변수들의 문자열 변환 https://road-road.tistory.com/23
2022.12.07
-
2022/12/06 개발 일지
청크 다운로더의 패치 특성 청크가 수정되어 새로 패치을 해야 한다면 매니페스트 파일 안에서 ContentBuildId(패치서버 폴더명)와 수정된 청크의 pak파일의 ver을 갱신해 줘야 한다. 그래야 청크 다운로더는 패치을 정상적으로 수행한다. 수정된 pak파일은 파일 사이즈의 변경 여부와 관계 없이 반드시 매니페스트에서 ver을 수정해 주어야 한다. 그래야 청크다운로더는 해당 pak파일을 다시 다운 받는다. 수정되지 않은 청크의 pak파일은 매니페스트 파일에서 그냥 그대로 ver가 이전 버전 값 그대로 유지된다. pak파일 사이즈가 변경되어 매니페스트 파일에 수정된 파일 사이즈을 기입 했는데도 ver을 수정하지 않는다면 패치시 청크다운로더에서는 오류를 발생한다. 청크가 수정되었지만 pak파일의 사이즈가..
2022.12.06
-
2022/12/02 개발 일지
UGameInstance을 C++에서 상속 받은 후 다시 블루프린트에서 상속받아서 사용할 경우 블루프린트에서 호출한 Shutdown가 호출 안되는 문제 만약 C++코드에서 UGameInstance을 상속 받아서 오버라이드 한 후 해당 함수에서 Super::Shutdown()을 추가해 주지 않았다면 블루프린트에서 호출되는 Shutdown 이벤트은 호출되지 않는다. 왜냐하면 UGameInstance::Shutdown()에서 블루프린트의 Shutdown이벤트인 ReceiveShutdown()함수을 호출해 주고 있기 때문이다. 함수 뒤에 오는 const의 의미 해당 함수 안에서 아무것도 바꿀 수 없다는 의미~ ChunkDownloader은 패치 서버의 셧 다운 여부을 제대로 확인하지 못한다. 청크 다운로더은 한..
2022.12.02
-
2022/11/25 개발 일지
FChunkDownloader을 사용하는 프로젝트을 언리얼 에디터에서 재 실행할 경우 에디터가 비 정상 종료되는 문제 FChunkDownloader을 사용하는 프로젝트을 언리얼 에디터에서 재 실행할 경우 에디터가 비 정상 종료가 된다. 그 이유는 에디터의 플레이 종료시 static 메서드인 Shutdown() 메서드을 호출 안해 주었기 때문이다. 따라서 게임 인스턴스의 Shutdown() 메서드나 그와 비슷한 메서드에서 FChunkDownloader::Shutdown()메서드을 호출해 주어야 한다. 그렇지 않으면 FChunkDownloader::Initialize()메서드의 check(PakFiles.Num() == 0);로직에서 오류가 발생하여 에디터을 비 정상 종료시킨다. //static void F..
2022.11.25
-
2022/11/24 개발 일지
게임 실행 게임 로고 레벨 { InitPatcher실행하여 매니페스트 파일 다운 받기 분기1 - 다운받을 Pak파일이 있다면 패치 씬으로 진입 분기2 - 다운받을 Pak파일이 없다면 Pak파일 마운트 } 게임 로딩 레벨 게임 로비 레벨 인 게임 레벨
2022.11.24
-
2022/11/23 개발 일지
UObject 생성와 소멸에 대해~ UObject은 NewObject, NewNamedObject, ConstructObject 메서드 등으로 생성된다. UObject은 명시적으로 소멸 시킬 수 없다. 왜냐하면 UObject의 인스턴스은 가비지 컬렉터에서 관리한다. 즉 더 이상의 참조가 없다면 가비지 컬렉터에서 알아서 소멸 시킨다. 또한 UObject가 생성될 때 가비지 컬렉션 관련 옵션을 설정할 수 있다. https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Creation/ UObject 인스턴스 생성 게임플레이 코드에서 오브젝트의 새 인스턴스, 즉 UObject..
2022.11.23
-
2022/11/22 개발 일지
ChunkDownloader은 이전의 HTTPChunkInstaller을 개선한 버전으로 Battle Breakers라는 게임에서 사용되었다. ChunkDownloader은 pak파일로 만들고자 하는 어셋들을 PrimaryAssetLabel을 통해 생성할 수 있다. 하나의 PrimaryAssetLabel은 하나의 Pak파일을 생성하게 된다. 게임 프로젝트을 패키징하면 엔진은 기본적으로 청크ID을 0으로 하는 하나의 청크 그룹을 생성한다. 따라서 일부 어셋들을 별도의 청크 그룹으로 생성하고자 한다면 데이터 어셋(PrimaryAssetLabel)을 생성하고 그곳에 별도의 청크ID을 설정해 주면 프로젝트을 패키징시에 해당 파일이 존재하는 폴더의 모든 어셋들을 하나의 청크로 그룹화하여 Pak파일로 생성해 준다...
2022.11.22
-
UE4 DDC 경로 설정
언리얼 에디터는 프로젝트을 처음 열면 쉐이더등을 컴파일을 해서 프로젝트 폴더 안에 DerivedDataCache라는 폴더을 만들어서 캐시파일을 저장한다. 그래서 다음에 프로젝트을 열때 이미 저장해 놓은 쉐이더의 캐시파일을 참조하여 사용한다. 하지만 해당 프로젝트을 삭제하고 다시 생성하거나 DerivedDataCache폴더을 삭제하면 프로젝트을 열때 다시 쉐이더을 컴파일하게 된다. 따라서 언리얼 에디터에서 "에디터 개인설정"의 DDC경로 설정을 통해 해당 캐시 파일을 따로 저장해 놓고 재 사용할 수 있다. 또한 필요하다면 네트워크 DDC패스을 설정하여 서버에 DDC데이터을 업로드 하여 같은 네트워크 환경에 있는 팀원의 동일 프로젝트와도 DDC을 공유할 수 있다. 즉 팀원 한명이 이미 프로젝트을 열어 DDC..
2022.11.21
-
2022/11/21 개발 일지
UE4 버전의 프로젝트을 UE5 버전으로 변환하는 것은 큰 문제가 없지만 그 반대로 하면 UE4에디터에서 에셋 파일들을 인식하지 못한다. 프로젝트을 처음 열때 셰이더 컴파일을 한다. 그때 컴파일한 데이터은 DerivedDataCache에 저장된다. 그리고 다시 프로젝트을 열 때는 셰이더을 다시 컴파일 하지 않고 이 폴더에 있는 캐쉬 데이터을 사용하게 된다. 따라서 DerivedDataCache을 삭제하면 다시 셰이더 컴파일을 하게 된다. 프로젝트을 이전할 때 셰이더 컴파일을 다시 하지 않도록 하고 싶다면 DerivedDataCache폴더도 포함시켜 전달해야 한다. DDC(DerivedDataCache) 경로 설정 https://road-road.tistory.com/12
2022.11.21
-
2022/11/20 개발 일지
UE5에서 Android NDK 설치 방법 - https://road-road.tistory.com/9
2022.11.20
-
UE5에서 Android NDK 설치 방법
UE5에서 Android NDK 설치 방법 \UE_5.1\Engine\Extras\Android폴더에 존재하는 SetupAndroid.bat을 실행하면 현재 AndroidSdk가 설치되어 있는 폴더 내부에 ndk폴더을 생성한 후 bat파일에 정의된 버전의 ndk을 다운 받아준다. 만약 버전을 바꾸고 싶다면 SET NDK_VERSION=의 버전을 수정한 후 실행해 주면 된다. 그럼 이렇게 콘솔창을 뛰은 후 다운받아준다. 아래의 ndk폴더에는 두가지 버전의 ndk가 있다. 21.4~는 UE4용이고 25.1~은 UE5용이다. 이건 언리얼 에디터에서의 ndk경로 설정이다.
2022.11.20
-
2022/11/18 개발 일지
RunUAT.bat로 플러그인 패키징하기 언리얼 에디터의 플러그인 창에서 해당 플러그인을 패키징 할 수도 있지만 만약 "ERROR: Visual Studio 2017 must be installed in order to build this target."와 같은 오류가 발생한다면 cmd에서 RunUAT.bat에 인자들을 주어서 직접 플러그인을 패키징할 수 있다. UE4.27.2 에디터에서 플러그인을 패키징을 하려고 하니 Visual Studio 2017을 설치하라는 오류가 발생하였고 현재 Visual Studio 2019가 설치된 상황에서 플러그인을 패키징하기 위해 2017을 다시 설치하고 싶지는 않았다. 따라서 cmd에서 RunUAT.bat에 -VS2019 인자을 주어서 해당 플러그인의 패키징을 시도하..
2022.11.18
-
2022/11/17 개발 일지
어디서든 로드한 모듈의 인스턴스을 얻어서 사용하는 방법 모듈은 IModuleInterface을 상속받고 IMPLEMENT_MODULE(모듈클래스명, 사용자가 정의한 모듈이름)와 같은 매크로로 엔진에 등록된다. 따라서 해당 모듈의 인스턴스을 얻어서 사용하고자 한다면 모듈을 등록할 때 설정해 준 모듈 이름으로 찾아 주어야 한다. 일단 모듈은 Cpp파일에 추가된 IMPLEMENT_MODULE(FPatcherModule, Patcher)매크로를 통해 엔진에 해당 모듈이 등록된다. 그리고 아래와 같은 코드로 인스턴스을 얻을 수 있다. FPatcherModule& Patcher = FModuleManager::GetModuleChecked("Patcher"); 언리얼 C++에서 엔진 버전에 따른 조건부 컴파일 하기..
2022.11.17
-
2022/11/16 개발 일지
*.uproject나 *.plugin파일의 Modules블럭 안에 정의 되는 "LoadingPhase" 명령 (로딩 단계) LoadingPhase은 해당 모듈을 어느 시점에 로드할 지을 정의해 주는 명령이다. 프로그램을 시작하자 마자 로드할지 엔진의 초기화 후에 로드할지 첫 렌더링 화면에 로들할지 등을 설정할 수 있다. namespace ELoadingPhase { enum Type { EarliestPossible, PostConfigInit, PostSplashScreen, PreEarlyLoadingScreen, PreLoadingScreen, PreDefault, Default, PostDefault, PostEngineInit, None, Max, } } 참고 링크 - https://docs.u..
2022.11.15