using System.Collections; using System.Collections.Generic; using UnityEngine; using DamageNumbersPro; namespace DamageNumbersPro.Internal { public class DNPUpdater : MonoBehaviour { // Dicitonary static Dictionary unscaledUpdaters; static Dictionary scaledUpdaters; // Static public static Vector3 upVector; public static Vector3 rightVector; public static bool vectorsNeedUpdate; public static Quaternion cameraRotation; // Settings public bool isUnscaled = false; public float updateDelay = 0.0125f; public HashSet activePopups; public HashSet removedPopups; // Internal float lastUpdateTime = 0; float delta = 0; float time = 0; void Start() { StartCoroutine(UpdatePopups()); } IEnumerator UpdatePopups() { // Delay WaitForSecondsRealtime delay = new WaitForSecondsRealtime(updateDelay); while(true) { // Vector Update vectorsNeedUpdate = true; // Update foreach (DamageNumber popup in activePopups) { if(popup != null) { popup.UpdateDamageNumber(delta, time); } else { removedPopups.Add(popup); } } // Clean Up if(removedPopups.Count > 0) { foreach (DamageNumber removed in removedPopups) { activePopups.Remove(removed); } removedPopups = new HashSet(); } // Wait if (isUnscaled) { lastUpdateTime = Time.unscaledTime; yield return delay; time = Time.unscaledTime; delta = time - lastUpdateTime; } else { lastUpdateTime = Time.time; yield return delay; time = Time.time; delta = time - lastUpdateTime; } } } public static void RegisterPopup(bool unscaledTime, float updateDelay, DamageNumber popup) { ref Dictionary updaters = ref unscaledTime ? ref unscaledUpdaters : ref scaledUpdaters; if (updaters == null) { updaters = new Dictionary(); } bool containsKey = updaters.ContainsKey(updateDelay); if (containsKey && updaters[updateDelay] != null) { updaters[updateDelay].activePopups.Add(popup); } else { if(containsKey) { updaters.Remove(updateDelay); } GameObject newUpdater = new GameObject(""); newUpdater.hideFlags = HideFlags.HideInHierarchy; DNPUpdater dnpUpdater = newUpdater.AddComponent(); dnpUpdater.activePopups = new HashSet(); dnpUpdater.removedPopups = new HashSet(); dnpUpdater.isUnscaled = unscaledTime; dnpUpdater.updateDelay = updateDelay; DontDestroyOnLoad(newUpdater); updaters.Add(updateDelay, dnpUpdater); dnpUpdater.activePopups.Add(popup); } } public static void UnregisterPopup(bool unscaledTime, float updateDelay, DamageNumber popup) { Dictionary updaters = unscaledTime ? unscaledUpdaters : scaledUpdaters; if (updaters != null && updaters.ContainsKey(updateDelay) && updaters[updateDelay].activePopups.Contains(popup)) { updaters[updateDelay].removedPopups.Add(popup); } } public static void UpdateVectors(Transform popup) { vectorsNeedUpdate = false; upVector = popup.up; rightVector = popup.right; } } }