コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }