wan의 개발일기
RoomCraft #13. 버그 두 개 잡고 가구 정보 패널 통합하기 본문
소스코드 → github.com/Jywan/RoomCraft
들어가며
지난 편에서 룸/가구 툴바를 나누고 색상 피커를 만들었다. 이번엔 새 기능보다 버그 두 개를 잡는 게 메인이었고, 그 김에 가구 선택했을 때 뜨는 정보 패널들(치수 표시, 회전/삭제 버튼)을 하나로 합치고 회전도 더 세밀하게 조절할 수 있게 슬라이더를 추가했다.
버그 1 — 방 크기를 바꿔도 예전 경계로 검사됨
테스트로 가로 10m, 세로 5m짜리 방을 만들고 침대를 옮겨봤는데, 벽 근처에 가지도 않았는데 가구가 빨갛게(경계 이탈 경고) 변했다.
원인을 찾아보니 어이없게도 FurnitureBounds.SetRoomSize()가 코드 어디에서도 호출되지 않고 있었다. RoomBuilder.BuildRoom()은 바닥/벽을 실제로 만들어주지만, 그거랑 별개로 FurnitureBounds한테 "방 크기가 이거다"라고 알려주는 코드가 빠져있던 것. 그래서 항상 인스펙터에 박제된 기본값(4m×3m) 기준으로 경계 검사가 되고 있었다. 기본값이랑 다른 크기로 방을 만들 때만 재현되는 버그라 여태 못 보고 지나갔던 거였다.
private void UpdateFurnitureBounds(RoomData roomData)
{
FurnitureBounds bounds = FindAnyObjectByType<FurnitureBounds>();
if (bounds != null)
bounds.SetRoomSize(roomData.width, roomData.depth);
}
EditorSceneLoader의 HandleNewProject(), HandleLoadProject() 양쪽 다 방 생성/복원 직후 이 메서드를 호출하도록 고쳤다.
참고로 SetRoomSize는 가로/세로만 받는다. IsInsideRoom()이 X/Z 평면(탑뷰 기준 발자국)만 검사하고 높이(Y)는 아예 체크 안 하기 때문 — 가구가 항상 바닥(Y=0)에 고정이라 지금까진 필요 없었다. 나중에 천장 높이 검사도 넣고 싶으면 그건 완전히 새로 추가해야 하는 부분이라 일단 추후 예정으로 남겨뒀다.
버그 2 — 3D 뷰에서 가구 드래그하면 카메라도 같이 돎
FreeView(3D 자유시점)에서 가구를 클릭+드래그해서 옮기면, 화면(카메라)도 같이 회전해버리는 문제가 있었다. CameraController가 좌클릭 시작할 때 EventSystem.IsPointerOverGameObject()로 UI 위 클릭인지만 체크하고 있었는데, 가구는 UI가 아니라 3D 오브젝트라 이 체크에 안 걸렸던 것. 그래서 가구를 클릭하면 FurnitureInteraction은 가구를 옮기고, 동시에 CameraController도 카메라 회전을 시작해버렸다.
private bool IsPointerOverFurniture()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
return Physics.Raycast(ray, 100f, furnitureLayer);
}
FurnitureInteraction의 선택 상태를 참조하는 대신, CameraController가 자체적으로 Raycast를 쏴서 확인하게 했다. 두 스크립트의 Update() 실행 순서가 보장 안 되기 때문에, 서로 상태를 참조하면 프레임에 따라 타이밍이 꼬일 수 있어서다.
가구 정보 패널 통합 + 회전 슬라이더
가구를 선택하면 뜨는 UI가 치수 표시 패널, 회전/삭제 버튼 패널로 따로 떨어져 있었는데 이번에 하나로 합쳤다. 화면 우측 중앙에 고정해두고, 이름/치수/위치 텍스트 + 카테고리 아이콘 + 회전 슬라이더 + 회전/삭제 버튼이 전부 한 패널에 뜨도록 만들었다.
절대각 회전 — 슬라이더로 0~360도 자유롭게
기존 Q/E 키는 45도씩 상대회전만 됐는데, 정밀하게 원하는 각도로 맞추고 싶을 때가 있어서 슬라이더를 추가했다. 상대회전(RotateBy)이랑 별개로 절대각을 지정하는 메서드가 필요했다.
public void SetRotationY(float angleY)
{
transform.rotation = Quaternion.Euler(0f, angleY, 0f);
}
public float GetRotationY()
{
return transform.eulerAngles.y;
}
슬라이더를 드래그하면 이 각도로 바로 회전시키고, 반대로 Q/E나 회전 버튼으로 돌렸을 때도 슬라이더가 그 각도를 따라가도록 매 프레임 동기화했다.
private void Update()
{
FurnitureObject selected =
furnitureInteraction != null ? furnitureInteraction.GetSelectedFurniture() : null;
bool hasSelection = selected != null;
panel.SetActive(hasSelection);
if (hasSelection)
{
UpdatePreview(selected);
rotationSlider.SetValueWithoutNotify(selected.GetRotationY());
}
}
SetValueWithoutNotify라서 무한루프(슬라이더→회전→슬라이더…) 걱정은 없다. 참고로 슬라이더를 360도 끝까지 밀면 핸들이 다시 0으로 스냅되는데, 이건 버그가 아니라 정상이다 — 360도랑 0도는 같은 방향이라 transform.eulerAngles.y가 항상 0~360 범위로 정규화돼서 그렇다.
삽질 기록
가구 선택 즉시 텍스트가 한 프레임 안 보임
치수 표시 패널을 회전/삭제 버튼 패널이랑 합치는 과정에서, 가구를 선택한 첫 프레임에 이름/치수/위치 텍스트가 안 보이는 현상이 있었다. 아이콘, 버튼, 슬라이더는 다 뜨는데 텍스트 줄만 사라진 것처럼 보였다.
원인은 Content Size Fitter 타이밍 문제였다. 텍스트를 담은 DimensionRow가 Content Size Fitter로 내용 길이에 맞춰 자동 크기 조절되는데, panel.SetActive(true)로 막 활성화된 그 프레임에는 아직 텍스트가 실제로 반영되기 전이라 크기가 0으로 계산돼버렸다. 그래서 첫 프레임엔 접혀서 안 보이고, 다음 프레임부터 정상 크기로 나왔던 것.
해결: 텍스트 설정 직후 LayoutRebuilder.ForceRebuildLayoutImmediate(panel.GetComponent<RectTransform>())를 호출해서 레이아웃을 그 자리에서 강제로 다시 계산시켰다.
다른 패널이랑 스타일이 안 맞음
회전/삭제 버튼 패널이 원래 배경 없는 빈 오브젝트였는데, 다른 팝업들(가구 생성 패널, 하단 툴바)은 다 어두운 배경 박스가 있어서 통일감이 없었다. Image 컴포넌트를 추가하고 색상/스프라이트를 다른 패널이랑 맞췄는데, 그러고 나니 내용물(텍스트+슬라이더+버튼)이 배경보다 커져서 잘리는 문제가 또 나왔다. Layout Group은 자기 크기를 안 키워준다는 그 교훈이 여기서도 그대로 적용됐다 — Content Size Fitter를 이 패널에도 추가하고 나서야 배경이 내용물 크기에 맞춰 자동으로 늘어났다.
정리
| 기능 | 핵심 API / 구조 |
|---|---|
| 방 크기 반영 버그 수정 | EditorSceneLoader.UpdateFurnitureBounds() — 방 생성/복원 직후 FurnitureBounds.SetRoomSize() 호출 |
| 카메라-가구 드래그 충돌 수정 | CameraController.IsPointerOverFurniture() — 가구 레이어 Raycast로 선체크 |
| 절대각 회전 | FurnitureObject.SetRotationY() / GetRotationY() |
| 회전 슬라이더 동기화 | Slider.SetValueWithoutNotify()로 양방향 동기화 |
| 가구 정보 패널 통합 | FurnitureToolsPanel 하나로 치수/미리보기/회전/삭제 통합, 화면 우측 중앙 고정 |
| 레이아웃 첫 프레임 버그 수정 | LayoutRebuilder.ForceRebuildLayoutImmediate() |
'1인 게임개발 활동 > 가구배치 시뮬레이터' 카테고리의 다른 글
| RoomCraft #15. 방 모양 프리셋 — 사각형 넘어 L자형까지 (0) | 2026.07.05 |
|---|---|
| RoomCraft #14. 방을 다각형으로 - 사각형을 넘어서기 위한 첫걸음 (0) | 2026.07.05 |
| RoomCraft #12. 룸/가구 툴바 분리 + 색상 피커 만들기 (0) | 2026.07.05 |
| RoomCraft #11. 에디터 툴바 — 키보드에서 버튼으로 (0) | 2026.07.02 |
| RoomCraft #10. 씬 분리 — 시작 화면 만들기 (0) | 2026.07.01 |