From f16df18a268edc045596a5c3125751a4228819ef Mon Sep 17 00:00:00 2001 From: CuongNV <> Date: Mon, 30 Mar 2026 16:04:51 +0700 Subject: [PATCH] fixed editor pooling --- .../Scripts/Chat/UI/ChatPanelUI.cs | 46 ++++++++++++++++--- Assets/Scripts/ChatInputHandler.cs | 4 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs index bb34b87847..70524f9aff 100644 --- a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs @@ -69,14 +69,22 @@ namespace BrewMonster.Scripts.ChatUI private void OnDestroy() { + EventBus.Unsubscribe(OnChatMessageClear); EventBus.Unsubscribe(OnChatMessageReceived); EventBus.Unsubscribe(OnChannelFilterChanged); + + if (_pool != null) + { + _pool.Clear(); + _pool.Dispose(); + } } private void OnChannelFilterChanged(ChatChannelFilterChangedEvent e) { + if (this == null) return; _currentFilterChannel = e.channel; - if (chatPanelUIGO.activeSelf) + if (chatPanelUIGO != null && chatPanelUIGO.activeSelf) { RefreshVisible(); } @@ -93,6 +101,7 @@ namespace BrewMonster.Scripts.ChatUI { ChatThreadDispatcher.Instance.Post(() => { + if (this == null) return; AddMessage(x.context, x.channel); }); } @@ -102,12 +111,14 @@ namespace BrewMonster.Scripts.ChatUI { ChatThreadDispatcher.Instance.Post(() => { + if (this == null) return; ClearChat(); }); } ChatMessageView CreateItem() { + if (messagePrefab == null || content == null) return null; var item = Instantiate(messagePrefab); item.transform.SetParent(content, false); return item; @@ -115,17 +126,20 @@ namespace BrewMonster.Scripts.ChatUI void OnGetItem(ChatMessageView item) { - item.gameObject.SetActive(true); + if (item != null) + item.gameObject.SetActive(true); } void OnReleaseItem(ChatMessageView item) { - item.gameObject.SetActive(false); + if (item != null) + item.gameObject.SetActive(false); } void OnDestroyItem(ChatMessageView item) { - Destroy(item.gameObject); + if (item != null) + Destroy(item.gameObject); } void OnScrollChanged(Vector2 pos) @@ -145,6 +159,8 @@ namespace BrewMonster.Scripts.ChatUI public void AddMessage(string msg, byte channel) { + if (this == null || chatPanelUIGO == null) return; + var data = new ChatMessageData { message = msg, channel = channel }; _messages.Add(data); @@ -165,7 +181,11 @@ namespace BrewMonster.Scripts.ChatUI void AddMessageView(ChatMessageData data) { + if (this == null) return; var view = _pool.Get(); + if (view == null) view = CreateItem(); + if (view == null) return; + view.transform.SetParent(content, false); view.transform.SetAsLastSibling(); @@ -178,7 +198,10 @@ namespace BrewMonster.Scripts.ChatUI { var old = _visibleViews[0]; _visibleViews.RemoveAt(0); - _pool.Release(old); + if (old != null) + { + _pool.Release(old); + } } Canvas.ForceUpdateCanvases(); @@ -187,7 +210,10 @@ namespace BrewMonster.Scripts.ChatUI void RefreshVisible() { foreach (var view in _visibleViews) - _pool.Release(view); + { + if (view != null) + _pool.Release(view); + } _visibleViews.Clear(); @@ -205,6 +231,9 @@ namespace BrewMonster.Scripts.ChatUI for (int i = start; i < _filteredMessagesCache.Count; i++) { var view = _pool.Get(); + if (view == null) view = CreateItem(); + if (view == null) continue; + view.transform.SetParent(content, false); view.transform.SetAsLastSibling(); @@ -229,7 +258,10 @@ namespace BrewMonster.Scripts.ChatUI public void ClearChat() { foreach (var view in _visibleViews) - _pool.Release(view); + { + if (view != null) + _pool.Release(view); + } _visibleViews.Clear(); _messages.Clear(); diff --git a/Assets/Scripts/ChatInputHandler.cs b/Assets/Scripts/ChatInputHandler.cs index af16faee9d..6be7cc4263 100644 --- a/Assets/Scripts/ChatInputHandler.cs +++ b/Assets/Scripts/ChatInputHandler.cs @@ -104,7 +104,7 @@ namespace BrewMonster.Scripts.ChatUI else { inputField.interactable = true; - + var config = chatSystem.channelIcons.Find(c => c.channel == channel); if (config.prefix != null) { @@ -376,7 +376,7 @@ namespace BrewMonster.Scripts.ChatUI UnityGameSession.Instance.GameSession.SendPrivateChatData(target, msg, 0, 0, pack, slot); // Server không echo whisper lại cho chính mình → hiện local echo - string localEcho = $"[Whisper] → {target}: {msg}"; + string localEcho = $"{target}: {msg}"; EventBus.Publish(new GameSession.ChatMessageEvent(localEcho, (byte)ChatChannel.GP_CHAT_WHISPER)); }