2025. 12. 18. 21:23ㆍ본 캠프

RawImage를 통해 Inspection Camera 가 비추는 모델링을 UI형태로 바꿔 2D 화면으로 출력하는 기능을 어제 구현했었다.
추가적인 구현으로 이제 해당 모델링을 돌려보면서 차이점을 발견해서 제거하는 기능이 필요한데
구현하기 위해서는 게임에서 마우스 클릭이 Ray를 해당 방향으로 발사하게 만들어야 했다.
마우스 클릭 -> RawImage -> 좌표변환 -> 실제 InspectionCamera 앞의 오브젝트에게 Ray 출력을 구현해야 했기에
꽤나 골치아팠다.

클릭한 위치를 RawImage 위인지 먼저 판별하고 외부의 클릭은 무시한다.
Screen 좌표를 RawImage 중심 기준 좌표로 변환하고(RawImage 텍스처 상의 어느지점을 클릭했는지를 구한다)
이후 여기서 얻은 u와 v 값을 InspectionCamera의 화면좌표라고 가정하고 Ray를 쏜다.
RawImage를 출력하는 신은 UiScene으로 Additive Scene 형태라서 서로 참조형태가 아닌 EventBus형태로 신호를 교환해야하는데 단순히 ScreenViewPoint를 활용하는 걸 넘어서서 서로 강하게 얽혀있지 않게 고려도 했어야 했다.

이를 위해 별도의 이벤트를 새로 3개를 만들었다. RawImage의 Rect 데이터를 보내기위한 Event와
해당 요청/없을 때의 이벤트를 구분했다.
이 과정에서 WeakReference의 치명적인 부분을 하나 발견했는데
디버깅을 하던 도중 Ray가 계속 안나가는 상황이 있었다. 초기화 순서에도 문제가 없었고 왜 이벤트의 구독에만 문제가 있는거지 라고 생각하면서 시간을 계속 보냈는데
기존에 EventBus를 활용을 안했던 기능이었다보니 이걸 사용했을 때 구독쪽에서 강한참조 형태로 이벤트를 필드로 저장해서 사용해야 한다는 걸 잊고 있었다.
그래서 GC가 계속 이벤트를 수거해가서 아무리 디버깅을 해도 관련된 정보가 없어서 애먼 수정만 엄청나게 했었다.
WeakReference를 사용할거면 이 구조에 대한 이해가 꼭 있어야 한다는 걸 몸소 깨달았다..

WeakReference를 활용할 때 구독자 클래스 내부에 꼭 이벤트를 강한참조 형태로 저장하자..

이후 InspectionTarget 컴포넌트를 갖고 있는 오브젝트에 Ray를 맞추게 되면 해당 오브젝트가 사라지게 된다.
하지만 아직 처리해야 될 부분은 '상세보기 모델링' 상으로만 해당 오브젝트가 사라졌지, 원본인 월드 오브젝트에는 해당 정보가 반영이 안되어 있어서 연결 처리를 해야한다.
그리고 그 과정에 Ray를 클릭할 때만 쏠지 마우스 위치에 따라 계속 쏘면서 Outline을 보여줘서 UX적인 경험도를 높여줄지에 대한 선택도 고민해봐야 한다.
'본 캠프' 카테고리의 다른 글
| [내일배움캠프 본 캠프 60일차] 같은 오브젝트, 다른 상태 (0) | 2025.12.22 |
|---|---|
| [내일배움캠프 본 캠프 59일차] 사물을 확대해서 돌려보기_2 (0) | 2025.12.19 |
| [내일배움캠프 본 캠프 57일차] UI작업_RawImage (0) | 2025.12.17 |
| [내일배움캠프 본 캠프 56일차] UI작업_Additive Scene (0) | 2025.12.16 |
| [내일배움캠프 본 캠프 55일차] UI 작업_ Event Bus 연결 (0) | 2025.12.15 |