From 36655c2ca7cbb6b50424740fcc3c09d8d41bfdfd Mon Sep 17 00:00:00 2001 From: swrring Date: Sat, 12 Sep 2026 17:33:19 +0900 Subject: [PATCH] =?UTF-8?q?[WL-814g]=20=EB=8F=84=ED=8A=B8=20=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=EC=A0=84=ED=99=98=20MissingReferenceException(2):?= =?UTF-8?q?=20=EC=9D=B4=EC=A0=84=20=EB=A6=AC=EA=B7=B8=EB=A5=BC=20=ED=8C=8C?= =?UTF-8?q?=EA=B4=B4=20=EC=A0=84=EC=97=90=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=E2=80=94=20Critter=20=EC=9D=98=20FindAnyObjectByTy?= =?UTF-8?q?pe=20=EA=B0=80=20=EC=A3=BD=EC=9D=84=20=EC=98=A4=EB=B8=8C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=EB=A5=BC=20=EC=9E=A1=EB=8D=98=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20(#814)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PixelCameraManager.viewCamera/upscaledCanvas 는 [SerializeField] 가 아니라 프리팹에 저장되지 않아 인스턴스마다 항상 null → Initialize() 가 항상 FindAnyObjectByType 로 찾는다. Object.Destroy 는 프레임 끝 처리이므로 모드 전환(Teardown→Assemble 동일 프레임)에서 새 매니저가 아직 살아 있는 이전 리그의 뷰 카메라를 잡았고, 프레임 끝에 그것이 파괴되며 CanvasViewCamera.get_Aspect 에서 매 프레임 예외가 났다(PD 실측 200건). FindAnyObjectByType 는 비활성 오브젝트를 제외하므로 파괴 전에 SetActive(false). Co-Authored-By: Claude Opus 5 --- Assets/WL/PixelCamera/PixelCameraRig.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Assets/WL/PixelCamera/PixelCameraRig.cs b/Assets/WL/PixelCamera/PixelCameraRig.cs index 12d42b3af..902c040e9 100644 --- a/Assets/WL/PixelCamera/PixelCameraRig.cs +++ b/Assets/WL/PixelCamera/PixelCameraRig.cs @@ -423,6 +423,17 @@ namespace WL.PixelArt if (s_gameCam != null) s_gameCam.enabled = false; if (s_viewCam != null) s_viewCam.enabled = false; + // 🔴 WL-814g — 그리고 리그를 **즉시 비활성**으로 내린다. + // Critter `PixelCameraManager.Initialize()`(PixelCameraManager.cs:123·132)는 + // `viewCamera`/`upscaledCanvas` 를 **`FindAnyObjectByType` 로 찾는다**(두 필드는 + // `[SerializeField]` 가 아니라 프리팹에 저장되지 않아 인스턴스마다 항상 null → 항상 Find). + // `Object.Destroy` 는 프레임 끝 처리라, 모드 전환에서 새 리그를 `Instantiate` 하는 순간 + // **아직 살아 있는 이전 리그**의 뷰 카메라/캔버스를 새 매니저가 잡아 버리고, + // 프레임 끝에 그것들이 파괴되면서 `CanvasViewCamera.get_Aspect` 에서 + // `MissingReferenceException` 이 매 프레임 터졌다(PD 실측 200건). + // `FindAnyObjectByType` 는 **비활성 오브젝트를 제외**하므로 여기서 내려두면 충돌이 사라진다. + if (s_rigRoot != null) s_rigRoot.SetActive(false); + // 원본 카메라 복원 — 스택에서 뷰 카메라부터 뺀다. if (s_src != null) { @@ -475,7 +486,9 @@ namespace WL.PixelArt if (all[i] == null) continue; var root = all[i].transform.parent != null ? all[i].transform.parent.gameObject : all[i].gameObject; if (root == s_rigRoot) continue; - if (root.name == RigName) DestroyObj(root); + // 🔴 WL-814g — 파괴는 프레임 끝이라, 먼저 비활성으로 내려 새 리그의 + // `FindAnyObjectByType` 가 이 잔재를 잡지 못하게 한다(위 Teardown 주석 참조). + if (root.name == RigName) { root.SetActive(false); DestroyObj(root); } } // 프록시(원본 카메라의 자식)도 이름으로 정리