{"record":{"id":"9d1b04926fb8763f","repo":"Unity-Technologies/UnityCsReference","slug":"renderpickingcallback","errorCode":null,"errorMessage":"renderPickingCallback","messagePattern":"renderPickingCallback","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Editor/Mono/Handles/HandleUtility.cs","lineNumber":2235,"sourceCode":"        // Repaint the current view\n        public static void Repaint()\n        {\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)","sourceCodeStart":2217,"sourceCodeEnd":2253,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/Handles/HandleUtility.cs#L2217-L2253","documentation":"RegisterRenderPickingCallback throws ArgumentNullException when the supplied callback delegate is null. The callback is stored in a static list (s_RenderPickingCallbacks) and invoked during Scene view picking passes to determine which custom objects are pickable.","triggerScenarios":"Calling HandleUtility.RegisterRenderPickingCallback(null) or passing a callback variable that was never assigned.","commonSituations":"An editor tool that registers picking callbacks conditionally, passing a delegate field that is null when the condition was not met, or a partial initialization path.","solutions":["Pass a non-null RenderPickingCallback delegate.","Register the callback in OnEnable and unregister the same delegate instance in OnDisable."],"exampleFix":"// before\nHandleUtility.RegisterRenderPickingCallback(maybeNullCallback);\n// after\nif (myCallback != null)\n    HandleUtility.RegisterRenderPickingCallback(myCallback);","handlingStrategy":"validation","validationCode":"if (renderPickingCallback == null)\n    return;\nHandleUtility.RegisterRenderPickingCallback(renderPickingCallback);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Store the callback delegate in a field at initialization and pass the same field to both register and unregister.","Null-check before registering; never assume a conditional callback was assigned."],"tags":["picking","argument-validation","null-reference","unity-editor"],"backgroundTag":null,"analyzedSha":"225b0fbdb57cc17d094e8056b71f8314aba56f73","analyzedAt":"2026-08-13T19:07:19.849Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}