[TIL] 2025-05-27 알고리즘 문제, 코드 리팩토링, 세이브 및 로드 구현, 인코딩 설정 변경, 기타 버그 수정
2025-05-27 TIL
알고리즘 문제
이번 알고리즘 문제는 무방향 그래프와 BFS를 응용하는 문제였는데, 문제 자체는 난이도가 높지는 않았다고 생각합니다.
다만 처음에는 각 병사의 위치에서 부대의 위치로 최단 시간을 구하고자 했는데, 이 방법으로는 문제를 풀 수 없었습니다.
그래서 고민을 하다가 결국 방법을 찾지 못했고, 알아본 결과 역으로 부대에서 각 병사의 위치로 길찾기를 하여 문제를 해결할 수 있었습니다.
[프로그래머스][C++] 부대복귀
최종 프로젝트
오늘은 최종 프로젝트에서 기존 코드를 리팩토링하고, 기능을 구현하고, 간단한 버그들을 수정해보았습니다.
이외에 프로젝트 및 코드 컨벤션을 재정비하여 비주얼스튜디오의 인코딩 설정을 변경해보았습니다.
코드 리팩토링
코드 리팩토링은 기존에 코드 컨벤션이 다른 팀원과 맞지 않은 부분들을 회의하여 재정리해서 코드를 다시 작성해보았습니다.
우선, 회의한 내용은 #pragma region
사용에 관한 내용으로 시작했습니다.
이 기능을 사용할건지, 사용한다면 어떻게 사용할건지 이야기하여 사용하기로하고 각 기능을 카테고리별로 분리하여 해당 기능에 적용하기로 했습니다.
이 기능을 사용하여 헤더에서 찾고자 하는 코드를 좀 더 빠르게 찾을 수 있을 것이라고 기대합니다.
이외에는 UPROPERTY()
에서 EditAnywhere
를 과하게 사용하던 문제였습니다.
이외에는 BlueprintReadWrite
또한 무분별하게 사용하던 문제도 포함됐습니다.
이 문제는 어디서든 값을 수정할 수 있다는 문제로 인해서 버그, 디버깅 등 다양한 문제를 야기하므로 이번에 다시 재정리하여 수정하기로 했습니다.
이렇게 컨벤션을 재정비하여 작성한 코드를 수정하였습니다.
이외에도 수정한 로직은 소스 코드의 디렉토리를 변경하고, 상속 관계를 수정했습니다.
코드 리팩토링 이외에도 기존에 구현했던 레벨 이동 로직을 좀 더 다양한 곳에서 사용하게되어 게임 인스턴스의 함수로 변경하여 구현했습니다.
함수로 변경하면서 기존에 작성했던 코드를 좀 더 최적화해보았습니다.
기존에는 소프트 레퍼런스로 저장된 레벨 애샛을 직접 로드해주었는데, 알아본 결과로 UGameplayStatics::OpenLevel
함수는 레벨이 로드되지 않았어도, 패키지 경로만 유효하다면 자동으로 로드를 해준다고 합니다.
그렇기 때문에 직접 로드하는 로직은 제거해주어 코드가 좀 더 간결해지고, 속도가 향상되었습니다.
이외에도 기존에는 패키지 경로의 전체를 가져와서 확장자까지 가져왔는데, ToSoftObjectPath
함수에 GetLongPackageName
를 사용하여 확장자를 제거한 패키지의 전체 경로만 가지고와 애셋 이름을 추출하여 사용해주었습니다.
세이브 및 로드 구현
플레이어 캐릭터가 사용하는 무기에 대해서 세이브와 로드 기능을 구현해보았습니다.
이를 위해서 관련된 클래스도 추가하고, 데이터를 관리하던 곳에서 필요한 함수를 추가해보았습니다.
세이브를 하는 함수를 호출하는 방법에 대한 고민이 있었는데, 이 경우 델리게이트를 사용한 이벤트 디스패처로 특정 시점에 바인딩 된 함수들을 모두 호출하여 저장할 수 있도록 해주었습니다.
이렇게 한다면 세이브를 해야하는 정보가 다양해지더라도 유지보수에 큰 어려움이 있지 않을 것이라고 생각합니다.
이번에 처음으로 세이브와 로드를 구현해보았는데, 언리얼 엔진에서 이 시스템이 잘 준비되어있어 구현에 큰 어려움이 없었던 것 같습니다.
다만, 세이브보다 로드하는 것이 더 어려웠습니다.
세이브에서는 로드에서 필요한 데이터를 정리하고, 추려내어 필요한 데이터만 저장할 수 있도록 해주어 큰 어려움은 없었습니다.
하지만, 로드에서는 저장된 데이터로 다시 액터를 만들어 플레이어 캐릭터에 적용하거나 값을 적용하여 상태를 변화시키는 등 작업이 필요해서 어려웠습니다.
다만 세이브에서 미리 로드에서 필요한 데이터들을 준비하지 않았다면 세이브도 충분히 어려운 작업이 됐을 것 같습니다.
인코딩 설정 변경
지금 프로젝트에서 비주얼 스튜디오를 사용하는 팀원과 라이더를 사용하는 팀원으로 사용하는 IDE의 종류가 다릅니다.
IDE에 의해서 비주얼 스튜디오는 cp949로 인코딩을 하고, 라이더는 utf-8로 인코딩을 하는데 이 문제로 인해서 주석을 알아볼 수 없거나 깨지는 등의 문제가 발생하게 됐습니다.
그래서 팀에서 내부적인 회의로 모든 IDE에서 utf-8로 인코딩을 하기로 결정했습니다.
그렇기 때문에 비주얼 스튜디오의 경우 직접 인코딩을 변경하는 것은 효율적이지 않기 때문에 .editorconfig
파일을 생성하여 utf-8로 인코딩 되도록 설정했습니다.
.editorconfig
파일은 프로젝트 폴더의 Source
폴더에 위치하도록 했습니다.
.editorconfig
를 사용한 이유는 기존 파일을 직접 인코딩을 변경해주지 않아도, 기존 파일의 인코딩이 잘 변경되기 때문에 작업을 효율적으로 할 수 있었기 때문입니다.
그리고 이후에 생성하는 파일들 또한 인코딩이 변경되기 때문에 효율적이라고 판단했습니다.
기타 버그 수정
첫 번째 버그로는 스켈레탈 메시가 애니메이션을 재생하면 Block되는 다른 오브젝트가 날아가는 문제였습니다.
이 문제는 스켈레탈 메시가 다른 오브젝트가 Block되지 않도록 하여 해결해주었습니다.
다른 오브젝트와 Block하도록 하는 것은 캡슐 컴포넌트에서 담당하도록 해주어 바닥이 뚫리거나 벽과의 충돌이 사라지지 않도록 해주는 것 도 잊지 않고 작업해주었습니다.
두 번째 버그로는 플레이어 캐릭터 메시를 변경하면서 본도 변경되었는데, 이때 본에 부여했던 소켓이 사라져 관련된 로직이 정상적으로 동작하지 않는 문제가 발생했습니다.
이 문제는 간단하게 기존 본과 유사한 본이었기 때문에 같은 이름으로 소켓을 추가하고, 최대한 비슷하게 트랜스폼을 가지도록 해주어 문제를 해결해주었습니다.
댓글남기기