Unity/개발일지

[Project_MTS] 개발 일지 - 2 [상호작용을 통한 위치 이동]

devrabbit22 2026. 5. 3. 01:52

상호작용을 이용한 위치 이동

세부적인 연출 컨트롤은 조정하지 않고 순수하게 UI를 동한 위치 이동을 구현했다.

맵 전환 시스템 설계

맵 전환 시스템 설계

맵 전환 기능을 구현하기 위해 MapController를 구성하고, 마을(Area)과 관련된 데이터는 ScriptableObject를 통해 관리하도록 설계했다.

맵 데이터는 Inspector에서의 설정 편의성을 고려해 List로 구성했으며, 마을 데이터가 상황에 따라 추가되거나 제거될 수 있기 때문에 동적으로 관리가 가능한 구조를 선택했다.

런타임에서는 Dictionary로 변환하여 사용하도록 구현했다. 이를 통해 AreaData를 기준으로 맵 정보를 키 기반으로 빠르게 조회할 수 있으며, 기존 List 기반 순차 탐색에서 발생하는 비용을 줄이고 O(1)의 시간 복잡도로 데이터를 처리할 수 있도록 개선했다.

또한 AreaData와 MapEntry를 매핑하는 구조를 통해 데이터 간 관계를 명확히 하고, 새로운 맵이 추가되더라도 기존 로직 수정 없이 확장 가능하도록 설계했다.

 

이동 시스템 설계

맵 전환 시스템과 연계하여 플레이어의 지역 이동을 처리하는 이동 시스템을 구현했다.
각 지역에 대한 정보는 AreaData ScriptableObject로 관리하며, 이를 기반으로 플레이어의 실제 위치 이동이 이루어지도록 설계했다.

BaseScene에서는 BaseMoveController를 통해 이동 로직을 중앙에서 제어하도록 구성했다.
플레이어는 표지판과 상호작용하여 UI를 열고, 해당 UI에서 원하는 지역을 선택하여 이동할 수 있다.

UI의 각 버튼(AreaButton)은 특정 AreaData를 참조하고 있으며, 버튼 클릭 시 선택된 지역 정보를 BaseMoveController에 전달한다. 이후 컨트롤러는 해당 데이터를 기반으로 맵 전환과 플레이어 위치 이동을 수행한다.

이러한 구조를 통해 UI는 단순히 데이터 전달 역할만 수행하고, 실제 이동 로직은 컨트롤러에서 처리하도록 분리하여 책임을 명확히 했다.

각 버튼마다 이동할 위치의 데이터를 할당해준다.

해당 데이터는 BaseMoveController로 전달되며, 컨트롤러는 이를 기반으로 이동 코루틴을 실행한다.
코루틴 내부에서는 MapController를 통해 선택된 AreaData에 해당하는 맵 오브젝트를 활성화하고, 플레이어를 지정된 위치로 이동시킨다.

이 과정에서 플레이어의 상태를 Lock으로 전환하여 이동을 제한하고, UI 페이드 연출(Fade In/Out)을 포함한 일련의 과정을 순차적으로 처리하도록 구성했다.

UI 상호작용을 통한 캐릭터 이동과정

GameManager에서 관리하는 현재 위치 데이터를 UI에 직접 참조시키지 않고, 필요한 시점에 전달하는 방식으로 설계하여 UI와 게임 상태 간의 결합도를 낮췄다.

 

표지판 UI가 활성화될 때, 현재 위치 정보를 참조하여 내부 상태를 초기화하고 모든 이동 버튼을 순회하면서 각 버튼이 가진 AreaData와 비교한다. 이때 현재 위치와 동일한 지역에 해당하는 버튼은 비활성화하여, 불필요한 이동이 발생하지 않도록 구성했다.

또한 이동 버튼을 클릭하면 이동 코루틴이 실행되며, 이동 완료 시 GameManager의 currentArea가 갱신된다. 이후 UI가 다시 활성화될 때 갱신된 데이터를 기준으로 버튼 상태가 재설정되도록 구현했다.

그래서 이동 버튼에서 클릭하면 이동 코루틴이 실행되면서 GameManager에서 현재 지역에 대한 데이터를 할당해주며 표지판 UI가 활성화 될 때 이 데이터를 바탕으로 내부 데이터를 초기화하면서 표지판 UI에 포함된 모든 버튼을 순회하면서 데이터를 초기화시킨다. 여기서 currentArea가 포함된 버튼은 비활성화 된다.


GameManager에서 관리하는 현재 위치 데이터는 UI에 직접 접근하지 않고 전달하는 방식으로 설계했으며, 표지판 UI는 전달받은 데이터를 기반으로 각 버튼의 활성 상태를 갱신하도록 구성했다. 이를 통해 UI와 게임 상태 간의 결합도를 낮췄다.