2025-06-10 TIL

알고리즘 문제

이번 문제도 굉장히 어렵게 느껴졌고, 문제를 어떻게 풀어내야할지 감도 잡지 못했습니다.
해당 문제는 나중에 다시 풀어본다고 해도 제대로 풀어내지 못할 것 같습니다.
이런 문제들에 대해서 여러번 복습하고 학습해야할 필요가 있을 것 같습니다.
[프로그래머스][C++] 2차원 동전 뒤집기

최종 프로젝트

기능 구현

오늘은 게임 플로우에서 부족한 부분에 대한 기능들을 집중적으로 구현해보았습니다.

대표적으로 레벨간 이동에 필요한 로직과 세이브 및 로드를 추가적으로 구현해주었습니다.
이 과정에서 유저위젯을 생성하고, 서로 다른 세이브 파일에서 데이터를 주고받는 로직을 구현해야 했습니다.

레벨간 이동에 필요한 로직과 세이브 및 로드, 유저 위젯 생성 등은 기존에 계속 작업해왔고 이제는 익숙한 작업이 되고있기 때문에 수월하게 작업을 진행할 수 있었습니다.
다만, 서로 다른 세이브 파일에서 데이터를 주고받도록 로직을 구현하는 부분이 좀 문제가 됐습니다.
기존 로직에서 세이브 파일을 로드하고 값을 수정하여 다시 저장하게 되면 기존 로직에 책임이 많아지므로, 별도의 인스턴스 서브 시스템 클래스를 추가해주었습니다.
이번에 추가한 해당 서브 시스템에서 세이브와 관련된 델리게이트와 세이브 파일의 슬롯 네임, 이번에 구현해야할 데이터를 주고받을 로직 등을 구현하여 책임을 분리하였습니다.

이번 작업으로 좀 더 책임을 분리하여 구조적으로 좋은 구조를 만들어 낼 수 있었고, 프로그래밍에서 세이브파일끼리 데이터를 교환하는 로직을 구현해보는 좋은 경험이 되었습니다.

이미지 애셋 문제

이번에 인벤토리에서 사용할 아이콘 이미지 애셋을 준비하는 작업이 진행되었습니다.

아이콘 애셋을 준비하던 중 특정 분야의 아이콘 애셋은 텍스쳐2D로 준비된 반면 다른 아이콘 애셋은 머티리얼 인스턴스로 준비가 되었습니다.
그런데, 데이터 테이블에서는 텍스쳐2D만을 받을 수 있는 자료형으로 설정해두었습니다.

그래서 머티리얼 인스턴스를 데이터 테이블에 저장할 수 없다는 문제가 생겼습니다.

이 문제를 해결하기 위해 고민을 하던 중 각각 다른 자료형으로 변수를 2개 선언하여 사용하게 되면 로직이 불필요하게 복잡해지고 다른 단점이 많아 해당 방법을 사용하지 않았습니다.
다른 좋은 방법으로는 유저위젯에서 UImage를 사용할 때 Image프로퍼티에 텍스쳐2D와 머티리얼 인스턴스 두 가지 모두 한 자료형으로 사용할 수 있다는 것을 기억해냈고 어떻게 사용해야할지 알아내기 위해 직접 언리얼 엔진의 소스코드를 살펴보았습니다.

FSlateBrush라는 구조체에 Image프로퍼티가 포함된 상태였습니다.
해당 구조체에서 Image라는 이름을 가진 프로퍼티를 찾아보았는데 다음과 같은 변수를 찾아낼 수 있었습니다.

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Brush, meta=( AllowPrivateAccess="true", DisplayThumbnail="true", DisplayName="Image", AllowedClasses="/Script/Engine.Texture,/Script/Engine.MaterialInterface,/Script/Engine.SlateTextureAtlasInterface", DisallowedClasses = "/Script/MediaAssets.MediaTexture"))
TObjectPtr<UObject> ResourceObject;

해당 변수의 UPROPERTY가 굉장히 복잡하지만 하나하나 살펴보면 크게 어렵지 않았습니다.
다만 처음 보는 설정이 있었기 때문에 구글링을 통해 알아보았습니다.

가장 중요한 부분은 AllowedClasses이라고 생각됩니다.
해당 변수의 자료형은 UObject이기 때문에 거의 모든 오브젝트들을 에디터에서 할당할 수 있었지만, AllowedClasses로 설정된 텍스쳐와 머티리얼 인터페이스 등 만을 할당할 수 있게 됐습니다.

또한, DisallowedClasses를 사용하여 반대로 특정 클래스는 제거할 수 있었기 때문에 굉장히 유용하다고 생각할 수 있었습니다.

이렇게 데이터 테이블에서 어떤 자료형을 사용하고 UPROPERTY를 설정할지 알아낼 수 있었기 때문에 알아낸 것을 토대로 데이터 테이블을 수정해주었습니다.

다음에는 UObject 자료형으로 저장된 리소스 오브젝트를 어떻게 사용하냐는 문제가 있었는데, 이 문제는 간단하게 해결할 수 있었습니다.
UImage에서 SetBrushResourceObject를 사용하여 매개변수로 UObject자료형을 가진 변수를 넘겨주었을 때, 간단하게 이미지를 설정할 수 있어서 쉽게 해결해냈습니다.

이렇게 새로운 문제를 마주쳐도 기존 언리얼의 시스템을 토대로 문제를 해결해내는 경험을 가지게 되었습니다.
이를 토대로 앞으로 다른 문제를 마주치더라도 잘 해결해낼 수 있을 거라는 자신감을 얻게되는 좋은 경험이었습니다.

Date:     Updated:

카테고리:

태그:

TIL 카테고리 내 다른 글 보러가기

댓글남기기