본문 바로가기

개발일지14

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.
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. 8.
2022/12/07 개발 일지 ChunkDownloader을 통해 정상적인 패치 수행하기 전 사전 작업들~ Http기능을 통해 패치 서버가 실행 중인지 검사한다. 패치 서버가 정상 실행중 이라면 서버에서 최신 ContentBuildId을 얻어온다. 패치 서버로 부터 가져온 ContentBuildId을 청크 다운로더의 초기화 함수 인자로 입력해서 청크 다운로더을 실행한다. UKismetStringLibrary을 이용하여 기본 타입 변수들의 문자열 변환 https://road-road.tistory.com/23 2022. 12. 7.
2022/12/06 개발 일지 청크 다운로더의 패치 특성 청크가 수정되어 새로 패치을 해야 한다면 매니페스트 파일 안에서 ContentBuildId(패치서버 폴더명)와 수정된 청크의 pak파일의 ver을 갱신해 줘야 한다. 그래야 청크 다운로더는 패치을 정상적으로 수행한다. 수정된 pak파일은 파일 사이즈의 변경 여부와 관계 없이 반드시 매니페스트에서 ver을 수정해 주어야 한다. 그래야 청크다운로더는 해당 pak파일을 다시 다운 받는다. 수정되지 않은 청크의 pak파일은 매니페스트 파일에서 그냥 그대로 ver가 이전 버전 값 그대로 유지된다. pak파일 사이즈가 변경되어 매니페스트 파일에 수정된 파일 사이즈을 기입 했는데도 ver을 수정하지 않는다면 패치시 청크다운로더에서는 오류를 발생한다. 청크가 수정되었지만 pak파일의 사이즈가.. 2022. 12. 6.
2022/12/02 개발 일지 UGameInstance을 C++에서 상속 받은 후 다시 블루프린트에서 상속받아서 사용할 경우 블루프린트에서 호출한 Shutdown가 호출 안되는 문제 만약 C++코드에서 UGameInstance을 상속 받아서 오버라이드 한 후 해당 함수에서 Super::Shutdown()을 추가해 주지 않았다면 블루프린트에서 호출되는 Shutdown 이벤트은 호출되지 않는다. 왜냐하면 UGameInstance::Shutdown()에서 블루프린트의 Shutdown이벤트인 ReceiveShutdown()함수을 호출해 주고 있기 때문이다. 함수 뒤에 오는 const의 의미 해당 함수 안에서 아무것도 바꿀 수 없다는 의미~ ChunkDownloader은 패치 서버의 셧 다운 여부을 제대로 확인하지 못한다. 청크 다운로더은 한.. 2022. 12. 2.
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.
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.
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.