private static void AddCallbackInternal(Dictionary <CallbackType, CallbackCollection> collection, CallbackType type, Func <bool> callback) { if (!collection.ContainsKey(type)) { collection.Add(type, new CallbackCollection()); } NamedFunc namedFunc = new NamedFunc(); // We do PHASED_DEBUG instead of UNITY_EDITOR in case we connect profiler in debug build #if PHASED_DEBUG namedFunc.Name = callback.Target != null? callback.Target.GetType().ToString() + "." + callback.Method.ToString() : callback.Method.ToString(); #endif namedFunc.Func = callback; CallbackCollection callbackCollection = collection[type]; if (callbackCollection.FunctionsDictionary.ContainsKey(callback)) { Debug.LogErrorFormat("Failed to add callback '{0}' to CallbackEvent '{1}' because it is already added.", namedFunc.Name, type.ToString()); return; } callbackCollection.FunctionsList.Add(namedFunc); callbackCollection.FunctionsDictionary.Add(callback, namedFunc); }
private void ProcessCallbacks(CallbackCollection collection) { List <NamedFunc> callbackList = collection.FunctionsList; int startCount = callbackList.Count; int count = startCount; for (int i = count - 1; i >= 0; --i) { NamedFunc namedFunc = callbackList[i]; Func <bool> callback = namedFunc.Func; if (namedFunc.WaitingForRemove) { NamedFunc last = callbackList[count - 1]; callbackList[count - 1] = namedFunc; callbackList[i] = last; count--; continue; } Profiler.BeginSample(namedFunc.Name); try { if (!callback()) { RemoveCallbackInternal(collection, callback); } } catch (Exception e) { // Catch the exception so it does not break flow of all callbacks // But still log it to Unity console so we know something happened Debug.LogException(e); } Profiler.EndSample(); } callbackList.RemoveRange(count, startCount - count); }