fixed editor pooling

This commit is contained in:
CuongNV
2026-03-30 16:04:51 +07:00
parent 6b3910a7cc
commit f16df18a26
2 changed files with 41 additions and 9 deletions
@@ -69,14 +69,22 @@ namespace BrewMonster.Scripts.ChatUI
private void OnDestroy()
{
EventBus.Unsubscribe<OnEventClearChat>(OnChatMessageClear);
EventBus.Unsubscribe<GameSession.ChatMessageEvent>(OnChatMessageReceived);
EventBus.Unsubscribe<ChatChannelFilterChangedEvent>(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();
+2 -2
View File
@@ -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 = $"<color=#0065FE>[Whisper] → {target}: {msg}</color>";
string localEcho = $"<color=#0065FE>{target}: {msg}</color>";
EventBus.Publish(new GameSession.ChatMessageEvent(localEcho, (byte)ChatChannel.GP_CHAT_WHISPER));
}