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,13 +27,12 @@ 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 ( TryParseDefinedBuildTarget ( name , out target ) )
32+ {
3333 return true ;
34+ }
35+
3436 target = default ;
3537 return false ;
3638 }
@@ -50,10 +52,14 @@ public static BuildTargetGroup GetTargetGroup(BuildTarget target)
5052 case BuildTarget . WebGL : return BuildTargetGroup . WebGL ;
5153 case BuildTarget . WSAPlayer : return BuildTargetGroup . WSA ;
5254 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 ;
55+ default :
56+ if ( IsVisionOSTarget ( target )
57+ && Enum . TryParse ( VisionOSName , true , out BuildTargetGroup visionOSGroup ) )
58+ {
59+ return visionOSGroup ;
60+ }
61+
62+ return BuildTargetGroup . Unknown ;
5763 }
5864 }
5965
@@ -67,12 +73,61 @@ public static string TryResolveNamedBuildTarget(string name, out NamedBuildTarge
6773 if ( ! TryResolveBuildTarget ( name , out var buildTarget ) )
6874 {
6975 namedTarget = default ;
70- return $ "Unknown build target: '{ name } '. Valid targets: windows64, osx, linux64, android, ios, webgl, uwp, tvos, visionos";
76+ return GetUnknownBuildTargetMessage ( name ) ;
77+ }
78+
79+ var targetGroup = GetTargetGroup ( buildTarget ) ;
80+ if ( targetGroup == BuildTargetGroup . Unknown )
81+ {
82+ namedTarget = default ;
83+ return IsVisionOSTarget ( buildTarget )
84+ ? "VisionOS build target is available, but its BuildTargetGroup is not exposed by this Unity editor installation."
85+ : $ "Build target group could not be resolved for target '{ buildTarget } '.";
7186 }
72- namedTarget = GetNamedBuildTarget ( buildTarget ) ;
87+
88+ namedTarget = NamedBuildTarget . FromBuildTargetGroup ( targetGroup ) ;
7389 return null ;
7490 }
7591
92+ public static string GetUnknownBuildTargetMessage ( string name )
93+ {
94+ if ( string . Equals ( name , "visionos" , StringComparison . OrdinalIgnoreCase ) )
95+ {
96+ return "VisionOS build target is not available in this Unity editor installation. "
97+ + "Install the visionOS build support module or use a Unity version/configuration that exposes BuildTarget.VisionOS." ;
98+ }
99+
100+ return $ "Unknown build target: '{ name } '. Valid targets: { GetValidTargetsList ( ) } .";
101+ }
102+
103+ private static string GetValidTargetsList ( )
104+ {
105+ string validTargets = "windows64, osx, linux64, android, ios, webgl, uwp, tvos" ;
106+ if ( TryParseDefinedBuildTarget ( VisionOSName , out _ ) )
107+ {
108+ validTargets += ", visionos" ;
109+ }
110+
111+ return validTargets ;
112+ }
113+
114+ private static bool IsVisionOSTarget ( BuildTarget target )
115+ {
116+ return string . Equals ( target . ToString ( ) , VisionOSName , StringComparison . OrdinalIgnoreCase ) ;
117+ }
118+
119+ private static bool TryParseDefinedBuildTarget ( string name , out BuildTarget target )
120+ {
121+ target = default ;
122+ if ( int . TryParse ( name , out _ ) )
123+ {
124+ return false ;
125+ }
126+
127+ return Enum . TryParse ( name , true , out target )
128+ && Enum . IsDefined ( typeof ( BuildTarget ) , target ) ;
129+ }
130+
76131 public static string GetDefaultOutputPath ( BuildTarget target , string productName )
77132 {
78133 string basePath = $ "Builds/{ target } ";
0 commit comments