{"record":{"id":"2a1bd6d091d84384","repo":"Unity-Technologies/UnityCsReference","slug":"unregisterrenderpickingcallback-cannot-be-called","errorCode":null,"errorMessage":"{UnregisterRenderPickingCallback} cannot be called during picking rendering","messagePattern":"(.+?) cannot be called during picking rendering","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Editor/Mono/Handles/HandleUtility.cs","lineNumber":2254,"sourceCode":"            if (s_InPickingRendering)\n                throw new InvalidOperationException($\"{nameof(RegisterRenderPickingCallback)} cannot be called during picking rendering\");\n\n            foreach (var registered in s_RenderPickingCallbacks)\n            {\n                if (registered == renderPickingCallback)\n                    return false;\n            }\n\n            s_RenderPickingCallbacks.Add(renderPickingCallback);\n            return true;\n        }\n\n        public static bool UnregisterRenderPickingCallback(RenderPickingCallback renderPickingCallback)\n        {\n            if (renderPickingCallback == null)\n                throw new ArgumentNullException(nameof(renderPickingCallback));\n            if (s_InPickingRendering)\n                throw new InvalidOperationException($\"{nameof(UnregisterRenderPickingCallback)} cannot be called during picking rendering\");\n\n            for (int i = 0; i < s_RenderPickingCallbacks.Count; ++i)\n            {\n                var registered = s_RenderPickingCallbacks[i];\n                if (registered == renderPickingCallback)\n                {\n                    s_RenderPickingCallbacks.RemoveAt(i);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        // Changed to Object to support VisualElements and other non-GameObject pickable objects\n        // todo refactor picking code to remove all the static collections that ferry around include/exclude lists\n        [AutoStaticsCleanupOnCodeReload]\n        static readonly HashSet<UnityObject> s_PickingIncludeSet = new();","sourceCodeStart":2236,"sourceCodeEnd":2272,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/Handles/HandleUtility.cs#L2236-L2272","documentation":"UnregisterRenderPickingCallback throws InvalidOperationException when called during an active picking render pass (s_InPickingRendering is true). This prevents the callback list from being modified while it is being iterated, which would corrupt the picking pass.","triggerScenarios":"Calling UnregisterRenderPickingCallback from inside a RenderPickingCallback, or from code that runs during the picking render loop.","commonSituations":"An editor tool that self-unregisters from within its own picking callback after a one-shot render, or OnSceneGui teardown code that fires during picking.","solutions":["Move callback unregistration to OnDisable or another lifecycle hook outside the picking render pass.","If deferred unregistration is needed during rendering, use EditorApplication.delayCall."],"exampleFix":"// before\nRenderPickingResult OnRenderPicking(in RenderPickingArgs args)\n{\n    HandleUtility.UnregisterRenderPickingCallback(OnRenderPicking);\n    ...\n}\n// after\nRenderPickingResult OnRenderPicking(in RenderPickingArgs args)\n{\n    EditorApplication.delayCall += () => HandleUtility.UnregisterRenderPickingCallback(OnRenderPicking);\n    ...\n}","handlingStrategy":"validation","validationCode":"// s_InPickingRendering is private and cannot be checked directly.\n// Move unregistration to a lifecycle hook outside the render pass:\nvoid OnDisable() {\n    HandleUtility.UnregisterRenderPickingCallback(OnRenderPicking);\n}","typeGuard":null,"tryCatchPattern":"try { HandleUtility.UnregisterRenderPickingCallback(cb); }\ncatch (InvalidOperationException) {\n    EditorApplication.delayCall += () => HandleUtility.UnregisterRenderPickingCallback(cb);\n}","preventionTips":["Unregister callbacks in OnDisable, never inside a render-picking callback body.","If deferred unregistration is needed during rendering, defer with EditorApplication.delayCall."],"tags":["picking","lifecycle","reentrancy","unity-editor"],"backgroundTag":null,"analyzedSha":"225b0fbdb57cc17d094e8056b71f8314aba56f73","analyzedAt":"2026-08-13T19:07:19.849Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}