{"record":{"id":"72e92be5b915f79c","repo":"Unity-Technologies/UnityCsReference","slug":"registerrenderpickingcallback-cannot-be-called-d","errorCode":null,"errorMessage":"{RegisterRenderPickingCallback} 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":2237,"sourceCode":"        {\n            Internal_Repaint();\n        }\n\n        public delegate UnityObject ResolvePickingCallback(int localPickingIndex);\n        public delegate UnityObject ResolvePickingWithWorldPositionCallback(int localPickingIndex, Vector3 worldPos, float depth);\n        public delegate RenderPickingResult RenderPickingCallback(in RenderPickingArgs args);\n\n        [AutoStaticsCleanupOnCodeReload]\n        private static readonly List<RenderPickingCallback> s_RenderPickingCallbacks = new();\n        [AutoStaticsCleanupOnCodeReload]\n        private static readonly List<(int PickingIndexBegin, int PickingIndexEnd, ResolvePickingCallback Resolver, ResolvePickingWithWorldPositionCallback ResolverWithWorldPos)> s_RenderPickingResults = new();\n\n        public static bool RegisterRenderPickingCallback(RenderPickingCallback renderPickingCallback)\n        {\n            if (renderPickingCallback == null)\n                throw new ArgumentNullException(nameof(renderPickingCallback));\n            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","sourceCodeStart":2219,"sourceCodeEnd":2255,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/Handles/HandleUtility.cs#L2219-L2255","documentation":"RegisterRenderPickingCallback throws InvalidOperationException when called while a picking render pass is in progress (s_InPickingRendering is true). This guard prevents the static callback list from being modified mid-iteration, which would cause collection corruption or skipped callbacks.","triggerScenarios":"Calling RegisterRenderPickingCallback from inside another RenderPickingCallback, or from any code path that executes during the picking render loop.","commonSituations":"An editor tool that dynamically registers sub-callbacks from within its own picking callback, creating a re-entrant registration; or SceneGUI code that registers during repaint.","solutions":["Move callback registration to OnEnable, OnSceneGui (before repaint), or another non-rendering lifecycle hook.","If dynamic registration is needed during rendering, defer it with EditorApplication.delayCall until the render pass completes."],"exampleFix":"// before\nRenderPickingResult OnRenderPicking(in RenderPickingArgs args)\n{\n    HandleUtility.RegisterRenderPickingCallback(ExtraPicking);\n    ...\n}\n// after\nRenderPickingResult OnRenderPicking(in RenderPickingArgs args)\n{\n    EditorApplication.delayCall += () => HandleUtility.RegisterRenderPickingCallback(ExtraPicking);\n    ...\n}","handlingStrategy":"validation","validationCode":"// s_InPickingRendering is private and cannot be checked directly.\n// Instead, ensure registration happens only outside render passes:\nvoid OnEnable() {\n    HandleUtility.RegisterRenderPickingCallback(OnRenderPicking);\n}","typeGuard":null,"tryCatchPattern":"try { HandleUtility.RegisterRenderPickingCallback(cb); }\ncatch (InvalidOperationException) {\n    EditorApplication.delayCall += () => HandleUtility.RegisterRenderPickingCallback(cb);\n}","preventionTips":["Register callbacks in OnEnable, never inside a render-picking callback body.","If deferred registration is unavoidable, use EditorApplication.delayCall to push it outside the render pass."],"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"}