Unity-Technologies/UnityCsReference · critical · System.Exception
Build platforms are not initialized.
Error message
Build platforms are not initialized.
What it means
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.
Source
Thrown at Editor/Mono/EditorUserBuildSettingsUtils.cs:29
public static BuildTarget CalculateSelectedBuildTarget()
{
NamedBuildTarget namedBuildTarget = CalculateSelectedNamedBuildTarget();
return CalculateSelectedBuildTarget(namedBuildTarget);
}
internal static BuildTarget CalculateSelectedBuildTarget(NamedBuildTarget namedBuildTarget)
{
if (namedBuildTarget.ToBuildTargetGroup() == BuildTargetGroup.Standalone)
{
BuildTarget target = EditorUserBuildSettings.selectedStandaloneTarget;
if (target == BuildTarget.NoTarget)
target = EditorUserBuildSettings.activeBuildTarget;
return DesktopStandaloneBuildWindowExtension.GetBestStandaloneTarget(target);
}
else
{
if (BuildPlatforms.instance == null)
throw new System.Exception("Build platforms are not initialized.");
BuildPlatform platform = BuildPlatforms.instance.BuildPlatformFromNamedBuildTarget(namedBuildTarget);
if (platform == null)
throw new System.Exception("Could not find build platform for target group " + namedBuildTarget.TargetName);
return platform.defaultTarget;
}
}
public static NamedBuildTarget CalculateSelectedNamedBuildTarget()
{
BuildTargetGroup targetGroup = EditorUserBuildSettings.selectedBuildTargetGroup;
if (targetGroup == BuildTargetGroup.Unknown)
targetGroup = EditorUserBuildSettings.activeBuildTargetGroup;
// TODO: Eventually NamedBuildTarget will replace completetly BuildTargetGroup, and we won't need this custom check
if (targetGroup == BuildTargetGroup.Standalone)
{
if (EditorUserBuildSettings.selectedStandaloneBuildSubtarget == StandaloneBuildSubtarget.Server)
return NamedBuildTarget.Server;View on GitHub (pinned to 225b0fbdb5)
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.
Example fix
// before
[InitializeOnLoad]
static class C {
static C() {
var t = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(namedTarget);
}
}
// after
[InitializeOnLoad]
static class C {
static C() {
EditorApplication.delayCall += () => {
if (BuildPlatforms.instance != null)
var t = EditorUserBuildSettingsUtils.CalculateSelectedBuildTarget(namedTarget);
};
}
} Defensive patterns
Strategy: validation
Validate before calling
if (BuildPlatforms.instance == null) { Debug.LogWarning("Build platforms not ready; deferring"); return BuildTarget.NoTarget; } Type guard
static bool AreBuildPlatformsReady => BuildPlatforms.instance != null;
Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Could not find build platform for target group ${namedBuildT
- Could not map typename 'GameManager' to type info (initializ
- No valid types in required type list
- Parameter selected must be of type System.Enum
- Parameter enumValue must be of type System.Enum
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/6a0fd6ec2a8d1492.
Report an issue: GitHub.