wan의 개발일기

RoomCraft #9. 방 커스터마이징 — 사용자 입력으로 방 크기 설정 본문

1인 게임개발 활동/가구배치 시뮬레이터

RoomCraft #9. 방 커스터마이징 — 사용자 입력으로 방 크기 설정

wan_ 2026. 6. 28. 20:19
소스코드 → github.com/Jywan/RoomCraft

들어가며

지금까지 방 크기가 코드에서 new RoomData(4f, 3f, 2.5f)로 고정돼 있었다. 내 방이 4m × 3m이 아니면 쓸모가 없는 셈.

이번에는 앱 시작 시 사용자가 직접 방 크기를 입력해서 원하는 크기의 방을 만들 수 있게 한다.


동작 흐름

  1. 앱 시작 → 방 설정 패널이 뜸
  2. 방 이름, 가로(m), 세로(m), 높이(m) 입력
  3. “방 만들기” 클릭 → 입력한 크기로 방 생성
  4. 패널 사라지고 배치 화면으로 전환
방이 만들어지기 전에는 “가구 추가” 버튼이 비활성화 상태다. 방 없이 가구를 만들면 의미가 없으니까.

RoomSetupUI 구현

입력값 파싱 + 방 생성

private void OnCreateRoomClicked()
{
    float width, depth, height;
    if (!float.TryParse(widthInput.text, out width)) width = 4f;
    if (!float.TryParse(depthInput.text, out depth)) depth = 3f;
    if (!float.TryParse(heightInput.text, out height)) height = 2.5f;

    // 범위 제한 (1~20m, 높이 1.5~5m)
    width = Mathf.Clamp(width, 1f, 20f);
    depth = Mathf.Clamp(depth, 1f, 20f);
    height = Mathf.Clamp(height, 1.5f, 5f);

    currentRoomData = new RoomData(width, depth, height, roomName);
    roomBuilder.BuildRoom(currentRoomData);

    // 카메라 + 충돌 감지에 방 크기 전달
    cameraController.SetTargetPoint(Vector3.zero);
    furnitureBounds.SetRoomSize(width, depth);

    // 가구 추가 버튼 활성화
    addFurnitureButton.interactable = true;

    panel.SetActive(false);
}

입력 안 하면 기본값(4×3×2.5m), 범위 밖이면 클램핑. 잘못된 입력에 앱이 터지지 않는다.

가구 추가 버튼 비활성화

private void Start()
{
    createButton.onClick.AddListener(OnCreateRoomClicked);
    panel.SetActive(true);

    // 방 생성 전에는 가구 추가 불가
    addFurnitureButton.interactable = false;
}
button.interactable = false로 버튼을 회색 처리할 수 있다. SetActive(false)와 달리 버튼이 보이긴 하지만 클릭이 안 되는 상태.

실행 결과

앱 시작 시 방 설정 패널
방 생성 후 — 가구 추가 버튼 활성화

UI 구조

Panel 안을 두 영역으로 나눴다:

RoomSetupPanel
├── InputArea (Vertical Layout Group)
│   ├── RoomNameInput
│   ├── RoomWidthInput
│   ├── RoomDepthInput
│   └── RoomHeightInput
└── CreateRoomButton (하단 고정)
InputArea에 Vertical Layout Group을 붙여서 InputField들을 자동 정렬하고, 버튼은 별도로 하단에 Anchor를 잡았다. Panel의 Layout Group과 분리하는 게 포인트.

정리

기능핵심 구현
방 크기 입력TMP_InputField + float.TryParse + Mathf.Clamp
방 생성RoomBuilder.BuildRoom() + 카메라/충돌 감지 연동
버튼 비활성화button.interactable = false/true
현재 제한직사각형 방만 지원 (L자/다각형은 추후 확장)

다음 편에서는 저장된 프로젝트를 목록에서 선택해서 불러오는 UI를 구현할 예정이다.