From 02971cbb0827af0c49619c91cc1950d95db80d98 Mon Sep 17 00:00:00 2001 From: CuongNV <> Date: Thu, 7 May 2026 17:29:15 +0700 Subject: [PATCH] fix reset camera show face when logout --- .../Scripts/UI/HostPlayerPortraitCapture.cs | 35 +++++++++++++++++++ .../Scripts/UI/Login/LoginScreenUI.cs | 1 + Assets/Scripts/SelecScreenCharacter.cs | 8 +++++ 3 files changed, 44 insertions(+) diff --git a/Assets/PerfectWorld/Scripts/UI/HostPlayerPortraitCapture.cs b/Assets/PerfectWorld/Scripts/UI/HostPlayerPortraitCapture.cs index c14e8747fa..479cd09743 100644 --- a/Assets/PerfectWorld/Scripts/UI/HostPlayerPortraitCapture.cs +++ b/Assets/PerfectWorld/Scripts/UI/HostPlayerPortraitCapture.cs @@ -74,6 +74,7 @@ namespace BrewMonster private readonly List _portraitMaterialInstances = new(); private readonly List _previewMaterialRestore = new(); + private readonly List _previewLayerRestore = new(); // Stored while waiting for async model load; -1 means no pending request private int _pendingRoleId = -1; @@ -84,6 +85,12 @@ namespace BrewMonster public Material[] SharedMaterials; } + private struct TransformLayerSnapshot + { + public Transform Transform; + public int Layer; + } + public RenderTexture OutputTexture => outputTexture; // ────────────────────────────────────────────────────────────────────────────── @@ -122,6 +129,7 @@ namespace BrewMonster { UnsubscribeModelReady(); RestorePreviewMaterials(); + RestorePreviewLayers(); DetachCamera(); if (PlayerModelPreview.Instance == null) @@ -144,6 +152,7 @@ namespace BrewMonster public void SetHostPlayer(Transform hostPlayerRoot) { RestorePreviewMaterials(); + RestorePreviewLayers(); DetachCamera(); if (hostPlayerRoot == null) return; _modelTransform = hostPlayerRoot; @@ -158,6 +167,7 @@ namespace BrewMonster { UnsubscribeModelReady(); RestorePreviewMaterials(); + RestorePreviewLayers(); DetachCamera(); _modelTransform = null; _headBone = null; @@ -258,6 +268,7 @@ namespace BrewMonster } // Move model to portrait layer so the dedicated camera can render it + CaptureLayersForRestore(_modelTransform.gameObject); PortraitCaptureUtils.SetLayerRecursive(_modelTransform.gameObject, portraitLayer); // Find head bone — primary target for camera attachment @@ -312,6 +323,30 @@ namespace BrewMonster } } + private void CaptureLayersForRestore(GameObject root) + { + if (root == null) return; + + var transforms = root.GetComponentsInChildren(true); + for (int i = 0; i < transforms.Length; i++) + { + var t = transforms[i]; + if (t == null) continue; + _previewLayerRestore.Add(new TransformLayerSnapshot { Transform = t, Layer = t.gameObject.layer }); + } + } + + private void RestorePreviewLayers() + { + for (int i = 0; i < _previewLayerRestore.Count; i++) + { + var snap = _previewLayerRestore[i]; + if (snap.Transform != null) + snap.Transform.gameObject.layer = snap.Layer; + } + _previewLayerRestore.Clear(); + } + /// /// Parents the portrait camera to "Bip01 Head" and sets its initial position /// directly in front of the face. diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs index c6e873bc5c..ecfa569367 100644 --- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs +++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs @@ -56,6 +56,7 @@ namespace BrewMonster.UI { Tech3CSDKWrapper.Instance.SetLoginCallback(OnLoginCallback); Tech3CSDKWrapper.Instance.SetLogoutCallback(OnLogoutCallback); + HostPlayerPortraitCapture.Instance?.ClearPortrait(); if(PlayerModelPreview.Instance != null) { diff --git a/Assets/Scripts/SelecScreenCharacter.cs b/Assets/Scripts/SelecScreenCharacter.cs index 3a2ee8006d..c2d5f588ac 100644 --- a/Assets/Scripts/SelecScreenCharacter.cs +++ b/Assets/Scripts/SelecScreenCharacter.cs @@ -53,6 +53,13 @@ namespace BrewMonster.UI private void OnDisable() { _btnEnterGame.onClick.RemoveListener(OnClickedEnterGame); + if (_showModelReadyCoroutine != null) + { + StopCoroutine(_showModelReadyCoroutine); + _showModelReadyCoroutine = null; + } + _pendingShowModelRoleId = -1; + HostPlayerPortraitCapture.Instance?.ClearPortrait(); _selectingCharacterItemUI = null; } @@ -242,6 +249,7 @@ namespace BrewMonster.UI private void OnClickedExit() { + HostPlayerPortraitCapture.Instance?.ClearPortrait(); _onExit?.Invoke(); gameObject.SetActive(false);