1+ using System ;
12using UnityEditor ;
23using UnityEditor . Build ;
34
45namespace MCPForUnity . Editor . Tools . Build
56{
67 public static class BuildTargetMapping
78 {
9+ private const string VisionOSName = "VisionOS" ;
10+
811 public static bool TryResolveBuildTarget ( string name , out BuildTarget target )
912 {
1013 if ( string . IsNullOrEmpty ( name ) )
@@ -24,12 +27,8 @@ public static bool TryResolveBuildTarget(string name, out BuildTarget target)
2427 case "webgl" : target = BuildTarget . WebGL ; return true ;
2528 case "uwp" : target = BuildTarget . WSAPlayer ; return true ;
2629 case "tvos" : target = BuildTarget . tvOS ; return true ;
27- // BuildTarget.VisionOS exists only in Unity 2023.2+ and late 2022.3 patches
28- #if UNITY_2023_2_OR_NEWER
29- case "visionos" : target = BuildTarget . VisionOS ; return true ;
30- #endif
3130 default :
32- if ( System . Enum . TryParse ( name , true , out target ) )
31+ if ( Enum . TryParse ( name , true , out target ) )
3332 return true ;
3433 target = default ;
3534 return false ;
@@ -50,10 +49,14 @@ public static BuildTargetGroup GetTargetGroup(BuildTarget target)
5049 case BuildTarget . WebGL : return BuildTargetGroup . WebGL ;
5150 case BuildTarget . WSAPlayer : return BuildTargetGroup . WSA ;
5251 case BuildTarget . tvOS : return BuildTargetGroup . tvOS ;
53- #if UNITY_2023_2_OR_NEWER
54- case BuildTarget . VisionOS: return BuildTargetGroup . VisionOS ;
55- #endif
56- default : return BuildTargetGroup . Unknown ;
52+ default :
53+ if ( IsVisionOSTarget ( target )
54+ && Enum . TryParse ( VisionOSName , true , out BuildTargetGroup visionOSGroup ) )
55+ {
56+ return visionOSGroup ;
57+ }
58+
59+ return BuildTargetGroup . Unknown ;
5760 }
5861 }
5962
@@ -67,12 +70,49 @@ public static string TryResolveNamedBuildTarget(string name, out NamedBuildTarge
6770 if ( ! TryResolveBuildTarget ( name , out var buildTarget ) )
6871 {
6972 namedTarget = default ;
70- return $ "Unknown build target: '{ name } '. Valid targets: windows64, osx, linux64, android, ios, webgl, uwp, tvos, visionos";
73+ return GetUnknownBuildTargetMessage ( name ) ;
74+ }
75+
76+ var targetGroup = GetTargetGroup ( buildTarget ) ;
77+ if ( targetGroup == BuildTargetGroup . Unknown )
78+ {
79+ namedTarget = default ;
80+ return IsVisionOSTarget ( buildTarget )
81+ ? "VisionOS build target is available, but its BuildTargetGroup is not exposed by this Unity editor installation."
82+ : $ "Build target group could not be resolved for target '{ buildTarget } '.";
7183 }
72- namedTarget = GetNamedBuildTarget ( buildTarget ) ;
84+
85+ namedTarget = NamedBuildTarget . FromBuildTargetGroup ( targetGroup ) ;
7386 return null ;
7487 }
7588
89+ public static string GetUnknownBuildTargetMessage ( string name )
90+ {
91+ if ( string . Equals ( name , "visionos" , StringComparison . OrdinalIgnoreCase ) )
92+ {
93+ return "VisionOS build target is not available in this Unity editor installation. "
94+ + "Install the visionOS build support module or use a Unity version/configuration that exposes BuildTarget.VisionOS." ;
95+ }
96+
97+ return $ "Unknown build target: '{ name } '. Valid targets: { GetValidTargetsList ( ) } .";
98+ }
99+
100+ private static string GetValidTargetsList ( )
101+ {
102+ string validTargets = "windows64, osx, linux64, android, ios, webgl, uwp, tvos" ;
103+ if ( Enum . TryParse ( VisionOSName , true , out BuildTarget _ ) )
104+ {
105+ validTargets += ", visionos" ;
106+ }
107+
108+ return validTargets ;
109+ }
110+
111+ private static bool IsVisionOSTarget ( BuildTarget target )
112+ {
113+ return string . Equals ( target . ToString ( ) , VisionOSName , StringComparison . OrdinalIgnoreCase ) ;
114+ }
115+
76116 public static string GetDefaultOutputPath ( BuildTarget target , string productName )
77117 {
78118 string basePath = $ "Builds/{ target } ";
0 commit comments