mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2025-02-16 12:58:27 +00:00
pool messages
This commit is contained in:
parent
7623b3ce29
commit
81df1bb651
1 changed files with 39 additions and 7 deletions
|
@ -1,5 +1,6 @@
|
|||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace SanAndreasUnity.Utilities
|
||||
{
|
||||
|
@ -16,6 +17,9 @@ namespace SanAndreasUnity.Utilities
|
|||
|
||||
public int messagePoolSize = 10;
|
||||
|
||||
private readonly Queue<OnScreenMessage> m_pooledOnScreenMessages = new Queue<OnScreenMessage>();
|
||||
public int NumPooledMessages => m_pooledOnScreenMessages.Count;
|
||||
|
||||
public static OnScreenMessageManager Instance { get; private set; }
|
||||
|
||||
|
||||
|
@ -28,15 +32,15 @@ namespace SanAndreasUnity.Utilities
|
|||
void Update()
|
||||
{
|
||||
|
||||
bool hasDeadMessages = false;
|
||||
bool hasMessagesToRemove = false;
|
||||
|
||||
for (int i = 0; i < m_onScreenMessages.Count; i++)
|
||||
{
|
||||
var msg = m_onScreenMessages[i];
|
||||
|
||||
if (null == msg)
|
||||
if (null == msg || !msg.gameObject.activeSelf)
|
||||
{
|
||||
hasDeadMessages = true;
|
||||
hasMessagesToRemove = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -46,21 +50,49 @@ namespace SanAndreasUnity.Utilities
|
|||
msg.timeLeft -= Time.deltaTime;
|
||||
if (msg.timeLeft <= 0)
|
||||
{
|
||||
Object.Destroy(msg.gameObject);
|
||||
// try to pool this message
|
||||
if (m_pooledOnScreenMessages.Count >= this.messagePoolSize)
|
||||
{
|
||||
// can't pool => destroy it
|
||||
Object.Destroy(msg.gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
hasMessagesToRemove = true;
|
||||
msg.gameObject.SetActive(false);
|
||||
m_pooledOnScreenMessages.Enqueue(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (hasDeadMessages)
|
||||
if (hasMessagesToRemove)
|
||||
{
|
||||
// only remove dead objects if there are any, because this method allocates memory
|
||||
m_onScreenMessages.RemoveDeadObjects();
|
||||
m_onScreenMessages.RemoveAll(msg => null == msg || !msg.gameObject.activeSelf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public OnScreenMessage CreateMessage()
|
||||
{
|
||||
messagePrefab.GetComponentOrThrow<OnScreenMessage>();
|
||||
var originalMessage = messagePrefab.GetComponentOrThrow<OnScreenMessage>();
|
||||
|
||||
if (m_pooledOnScreenMessages.Count > 0)
|
||||
{
|
||||
var originalTextComponent = originalMessage.GetComponentInChildren<Text>();
|
||||
OnScreenMessage pooledMessage = m_pooledOnScreenMessages.Dequeue();
|
||||
pooledMessage.gameObject.SetActive(true);
|
||||
// reset parameters
|
||||
pooledMessage.ScreenPos = originalMessage.ScreenPos;
|
||||
pooledMessage.SizeOnScreen = originalMessage.SizeOnScreen;
|
||||
pooledMessage.Text = originalTextComponent.text;
|
||||
pooledMessage.TextColor = originalTextComponent.color;
|
||||
pooledMessage.velocity = originalMessage.velocity;
|
||||
pooledMessage.timeLeft = originalMessage.timeLeft;
|
||||
|
||||
m_onScreenMessages.Add(pooledMessage);
|
||||
return pooledMessage;
|
||||
}
|
||||
|
||||
GameObject messageGo = Object.Instantiate(messagePrefab);
|
||||
messageGo.transform.SetParent(messagesContainer, false);
|
||||
|
|
Loading…
Add table
Reference in a new issue