fixed editor pooling
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user