{"record":{"id":"6a0fd6ec2a8d1492","repo":"Unity-Technologies/UnityCsReference","slug":"build-platforms-are-not-initialized","errorCode":null,"errorMessage":"Build platforms are not initialized.","messagePattern":"Build platforms are not initialized\\.","errorType":"exception","errorClass":"System.Exception","httpStatus":null,"severity":"critical","filePath":"Editor/Mono/EditorUserBuildSettingsUtils.cs","lineNumber":29,"sourceCode":"        public static BuildTarget CalculateSelectedBuildTarget()\n        {\n            NamedBuildTarget namedBuildTarget = CalculateSelectedNamedBuildTarget();\n            return CalculateSelectedBuildTarget(namedBuildTarget);\n        }\n\n        internal static BuildTarget CalculateSelectedBuildTarget(NamedBuildTarget namedBuildTarget)\n        {\n            if (namedBuildTarget.ToBuildTargetGroup() == BuildTargetGroup.Standalone)\n            {\n                BuildTarget target = EditorUserBuildSettings.selectedStandaloneTarget;\n                if (target == BuildTarget.NoTarget)\n                    target = EditorUserBuildSettings.activeBuildTarget;\n                return DesktopStandaloneBuildWindowExtension.GetBestStandaloneTarget(target);\n            }\n            else\n            {\n                if (BuildPlatforms.instance == null)\n                    throw new System.Exception(\"Build platforms are not initialized.\");\n                BuildPlatform platform = BuildPlatforms.instance.BuildPlatformFromNamedBuildTarget(namedBuildTarget);\n                if (platform == null)\n                    throw new System.Exception(\"Could not find build platform for target group \" + namedBuildTarget.TargetName);\n                return platform.defaultTarget;\n            }\n        }\n\n        public static NamedBuildTarget CalculateSelectedNamedBuildTarget()\n        {\n            BuildTargetGroup targetGroup = EditorUserBuildSettings.selectedBuildTargetGroup;\n            if (targetGroup == BuildTargetGroup.Unknown)\n                targetGroup = EditorUserBuildSettings.activeBuildTargetGroup;\n\n            // TODO: Eventually NamedBuildTarget will replace completetly BuildTargetGroup, and we won't need this custom check\n            if (targetGroup == BuildTargetGroup.Standalone)\n            {\n                if (EditorUserBuildSettings.selectedStandaloneBuildSubtarget == StandaloneBuildSubtarget.Server)\n                    return NamedBuildTarget.Server;","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/EditorUserBuildSettingsUtils.cs#L11-L47","documentation":"Thrown by EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget when BuildPlatforms.instance is null for a non-Standalone build target. The build-platforms subsystem must be initialized before this helper can resolve a NamedBuildTarget to a BuildTarget; querying it too early (during editor boot, before the build window registers platforms) throws.","triggerScenarios":"Calling CalculateSelectedBuildTarget (directly or via build pipeline code) for a non-Standalone NamedBuildTarget during early editor initialization, before BuildPlatforms has been constructed by the build window/editor load sequence.","commonSituations":"An editor startup script or [InitializeOnLoad] method that queries the selected build target before the build subsystem is ready; headless editor runs where the build window was never opened; package code that calls build settings helpers at static-constructor time.","solutions":["Defer the call until after editor initialization (EditorApplication.update callback, deferred once).","Restrict to Standalone targets during early init, or short-circuit when BuildPlatforms.instance is null.","Guard with a null check on BuildPlatforms.instance and skip/log instead of forcing the call.","Move build-target queries out of [InitializeOnLoad] into a delayed initialization path."],"exampleFix":"// before\n[InitializeOnLoad]\nstatic class C {\n  static C() {\n    var t = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(namedTarget);\n  }\n}\n\n// after\n[InitializeOnLoad]\nstatic class C {\n  static C() {\n    EditorApplication.delayCall += () => {\n      if (BuildPlatforms.instance != null)\n        var t = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(namedTarget);\n    };\n  }\n}","handlingStrategy":"validation","validationCode":"if (BuildPlatforms.instance == null) { Debug.LogWarning(\"Build platforms not ready; deferring\"); return BuildTarget.NoTarget; }","typeGuard":"static bool AreBuildPlatformsReady => BuildPlatforms.instance != null;","tryCatchPattern":null,"preventionTips":["Never query build targets from [InitializeOnLoad] static constructors.","Defer build-target queries to EditorApplication.delayCall or the first update tick.","Guard with a BuildPlatforms.instance null check before resolving non-Standalone targets."],"tags":["csharp","unity-editor","build-pipeline","initialization","timing"],"backgroundTag":null,"analyzedSha":"225b0fbdb57cc17d094e8056b71f8314aba56f73","analyzedAt":"2026-08-13T19:07:19.849Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}