public static bool IsSelected(this BuildPlatform buildPlatform) { // This is the special case for Editor target selected in the UI if (EditorUserBuildSettings.selectedBuildTargetGroup == BuildTargetGroup.Unknown) { return(buildPlatform.namedBuildTarget == NamedBuildTarget.FromBuildTargetGroup(BuildTargetGroup.Unknown)); } return(buildPlatform.namedBuildTarget == CalculateSelectedNamedBuildTarget()); }
static string GetBuildNumber(BuildTargetGroup targetGroup) { if (_getBuildNumber == null) { return(null); } #if UNITY_2021_2_OR_NEWER var targetName = NamedBuildTarget.FromBuildTargetGroup(targetGroup).TargetName; return((string)_getBuildNumber.Invoke(null, new object[] { targetName })); #else return((string)_getBuildNumber.Invoke(null, new object[] { targetGroup })); #endif }
static void SetBuildNumber(BuildTargetGroup targetGroup, string buildNumber) { if (_setBuildNumber == null) { return; } #if UNITY_2021_2_OR_NEWER var targetName = NamedBuildTarget.FromBuildTargetGroup(targetGroup).TargetName; _setBuildNumber.Invoke(null, new object[] { targetName, buildNumber }); #else _setBuildNumber.Invoke(null, new object[] { targetGroup, buildNumber }); #endif }
void SetIconsForPlatform(BuildTargetGroup targetGroup, PlatformIcon[] icons, PlatformIconKind kind, ref BuildTargetIcons[] allIcons) { var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(targetGroup); var platformIconProvider = PlayerSettings.GetPlatformIconProvider(namedBuildTarget); if (platformIconProvider == null) { return; } if (m_RequiredIcons == null) { m_RequiredIcons = new Dictionary <PlatformIconKind, PlatformIcon[]>(); } if (!m_RequiredIcons.ContainsKey(kind)) { var requiredIcons = platformIconProvider.GetRequiredPlatformIcons(); foreach (var requiredIcon in requiredIcons) { if (!m_RequiredIcons.ContainsKey(requiredIcon.Key)) { m_RequiredIcons.Add(requiredIcon.Key, requiredIcon.Value); } } } var requiredIconCount = PlatformIcon.GetRequiredPlatformIconsByType(platformIconProvider, kind, m_RequiredIcons).Length; PlatformIconStruct[] iconStructs; if (icons == null) { iconStructs = new PlatformIconStruct[0]; } else if (requiredIconCount != icons.Length) { throw new InvalidOperationException($"Attempting to set an incorrect number of icons for {namedBuildTarget} {kind} kind, it requires {requiredIconCount} icons but trying to assign {icons.Length}."); } else { iconStructs = icons.Select( i => i.GetPlatformIconStruct() ).ToArray <PlatformIconStruct>(); } allIcons = PlayerSettings.SetIconsForPlatformForTargetIcons(namedBuildTarget.TargetName, iconStructs, kind.kind, allIcons); }
internal PlatformIcon[] GetPlatformIcons(BuildTargetGroup platform, PlatformIconKind kind, ref BuildTargetIcons[] allIcons) { var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(platform); var serializedIcons = PlayerSettings.GetPlatformIconsFromTargetIcons(namedBuildTarget.TargetName, kind.kind, allIcons); var provider = PlayerSettings.GetPlatformIconProvider(namedBuildTarget); if (m_RequiredIcons == null) { m_RequiredIcons = new Dictionary <PlatformIconKind, PlatformIcon[]>(); } if (!m_RequiredIcons.ContainsKey(kind)) { var requiredIcons = provider.GetRequiredPlatformIcons(); foreach (var requiredIcon in requiredIcons) { if (!m_RequiredIcons.ContainsKey(requiredIcon.Key)) { m_RequiredIcons.Add(requiredIcon.Key, requiredIcon.Value); } } } var icons = PlatformIcon.GetRequiredPlatformIconsByType(provider, kind, m_RequiredIcons); if (serializedIcons.Length <= 0) { // Map legacy icons to required icons ImportLegacyIcons(namedBuildTarget.TargetName, kind, icons, m_AllLegacyIcons); // Serialize required icons SetPlatformIcons(platform, kind, icons, ref allIcons); foreach (var icon in icons) { if (icon.IsEmpty()) { icon.SetTextures(null); } } } else { // Map serialized icons to required icons icons = PlayerSettings.GetPlatformIconsFromStruct(icons, kind, serializedIcons.ToArray()); } return(icons); }
public static NamedBuildTarget CalculateActiveNamedBuildTarget() { BuildTargetGroup targetGroup = EditorUserBuildSettings.activeBuildTargetGroup; // TODO: Eventually NamedBuildTarget will replace completetly BuildTargetGroup, and we won't need this custom check if (targetGroup == BuildTargetGroup.Standalone) { if (EditorUserBuildSettings.standaloneBuildSubtarget == StandaloneBuildSubtarget.Server) { return(NamedBuildTarget.Server); } return(NamedBuildTarget.Standalone); } return(NamedBuildTarget.FromBuildTargetGroup(targetGroup)); }
IEnumerable <BuildTargetGroup> GetSharedTargets(BuildNumberSharing sharing) { var targets = new HashSet <BuildTargetGroup>(); if (sharing == BuildNumberSharing.InProject) { foreach (BuildTargetGroup targetGroup in System.Enum.GetValues(typeof(BuildTargetGroup))) { if (targetGroup == BuildTargetGroup.Unknown) { continue; } #if UNITY_2021_2_OR_NEWER try { var namedTarget = NamedBuildTarget.FromBuildTargetGroup(targetGroup); targets.Add(targetGroup); } catch { // ignore } #else targets.Add(targetGroup); #endif } } else if (sharing == BuildNumberSharing.InProfile) { foreach (var profileTarget in EditorProfile.BuildTargets) { targets.Add(BuildPipeline.GetBuildTargetGroup(profileTarget)); } } else { throw new System.Exception($"GetSharedTargets: Unexpected sharing value: {sharing}"); } return(targets); }
internal void ShowPlatformIconsByKind(PlatformIconFieldGroup iconFieldGroup, bool foldByKind, bool foldBySubkind) { // All icons that are displayed here are serialized into a single map // So in the preset we can only exclude/include all icons using (var vertical = new EditorGUILayout.VerticalScope()) using (new EditorGUI.PropertyScope(vertical.rect, GUIContent.none, m_PlatformIcons)) { int labelHeight = 20; foreach (var kind in PlayerSettings.GetSupportedIconKinds(NamedBuildTarget.FromBuildTargetGroup(iconFieldGroup.targetGroup))) { iconFieldGroup.SetPlatformIcons(GetPlatformIcons(iconFieldGroup.targetGroup, kind, ref m_AllIcons), kind); } foreach (var kindGroup in iconFieldGroup.m_IconsFields) { EditorGUI.BeginChangeCheck(); var key = kindGroup.Key; if (foldByKind) { GUIContent kindName = new GUIContent( string.Format("{0} icons ({1}/{2})", key.m_Label, kindGroup.Key.m_SetIconSlots, kindGroup.Key.m_IconSlotCount), key.m_KindDescription ); Rect rectKindLabel = GUILayoutUtility.GetRect(kSlotSize, labelHeight); rectKindLabel.x += 2; key.m_State = EditorGUI.Foldout(rectKindLabel, key.m_State, kindName, true, EditorStyles.foldout); } else { key.m_State = true; } if (key.m_State) { kindGroup.Key.m_SetIconSlots = 0; foreach (var subKindGroup in kindGroup.Value) { subKindGroup.Key.m_SetIconSlots = PlayerSettings.GetNonEmptyPlatformIconCount(subKindGroup.Value.Select(x => x.platformIcon) .ToArray()); kindGroup.Key.m_SetIconSlots += subKindGroup.Key.m_SetIconSlots; if (foldBySubkind) { string subKindName = string.Format("{0} icons ({1}/{2})", subKindGroup.Key.m_Label, subKindGroup.Key.m_SetIconSlots, subKindGroup.Value.Length); Rect rectSubKindLabel = GUILayoutUtility.GetRect(kSlotSize, labelHeight); rectSubKindLabel.x += 8; subKindGroup.Key.m_State = EditorGUI.Foldout(rectSubKindLabel, subKindGroup.Key.m_State, subKindName, true, EditorStyles.foldout); } else { subKindGroup.Key.m_State = true; } if (subKindGroup.Key.m_State || !foldBySubkind) { foreach (var iconField in subKindGroup.Value) { SetPreviewTextures(iconField.platformIcon); iconField.DrawAt(); } } } } if (EditorGUI.EndChangeCheck()) { SetPlatformIcons(iconFieldGroup.targetGroup, key.m_Kind, iconFieldGroup.m_PlatformIconsByKind[key.m_Kind], ref m_AllIcons); } } } }
private void ConvertPlayerDlltoCpp(Il2CppBuildPipelineData data) { var arguments = new List <string>(); arguments.Add("--convert-to-cpp"); if (m_PlatformProvider.emitNullChecks) { arguments.Add("--emit-null-checks"); } if (m_PlatformProvider.enableStackTraces) { arguments.Add("--enable-stacktrace"); } if (m_PlatformProvider.enableArrayBoundsCheck) { arguments.Add("--enable-array-bounds-check"); } if (m_PlatformProvider.enableDivideByZeroCheck) { arguments.Add("--enable-divide-by-zero-check"); } if (m_PlatformProvider.development && m_PlatformProvider.enableDeepProfilingSupport) { arguments.Add("--enable-deep-profiler"); } if (m_BuildForMonoRuntime) { arguments.Add("--mono-runtime"); } var buildTargetGroup = BuildPipeline.GetBuildTargetGroup(m_PlatformProvider.target); var apiCompatibilityLevel = PlayerSettings.GetApiCompatibilityLevel(buildTargetGroup); arguments.Add(string.Format("--dotnetprofile=\"{0}\"", IL2CPPUtils.ApiCompatibilityLevelToDotNetProfileArgument(apiCompatibilityLevel, m_PlatformProvider.target))); var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup); var il2cppCodeGeneration = PlayerSettings.GetIl2CppCodeGeneration(namedBuildTarget); if (il2cppCodeGeneration == Il2CppCodeGeneration.OptimizeSize) { arguments.Add("--generics-option=EnableFullSharing"); } var il2CppNativeCodeBuilder = m_PlatformProvider.CreateIl2CppNativeCodeBuilder(); if (il2CppNativeCodeBuilder != null) { var buildCacheNativeOutputFile = Path.Combine(GetNativeOutputRelativeDirectory(m_PlatformProvider.il2cppBuildCacheDirectory), m_PlatformProvider.nativeLibraryFileName); var compilerConfiguration = PlayerSettings.GetIl2CppCompilerConfiguration(buildTargetGroup); Il2CppNativeCodeBuilderUtils.ClearAndPrepareCacheDirectory(il2CppNativeCodeBuilder); arguments.AddRange(Il2CppNativeCodeBuilderUtils.AddBuilderArguments(il2CppNativeCodeBuilder, buildCacheNativeOutputFile, m_PlatformProvider.includePaths, m_PlatformProvider.libraryPaths, compilerConfiguration)); } else { arguments.Add($"--cachedirectory={CommandLineFormatter.PrepareFileName(GetShortPathName(Path.GetFullPath(m_PlatformProvider.il2cppBuildCacheDirectory)))}"); } // Additional files can take any form, depending on platform, so pass anything in the additional files directory foreach (var additionalCppFile in Directory.GetFiles(GetAdditionalCppFilesDirectory(m_PlatformProvider.il2cppBuildCacheDirectory))) { arguments.Add($"--additional-cpp={CommandLineFormatter.PrepareFileName(GetShortPathName(Path.GetFullPath(additionalCppFile)))}"); } arguments.AddRange(IL2CPPUtils.GetDebuggerIL2CPPArguments(m_PlatformProvider, buildTargetGroup)); foreach (var buildingArgument in IL2CPPUtils.GetBuildingIL2CPPArguments(m_PlatformProvider, buildTargetGroup)) { if (!arguments.Contains(buildingArgument)) { arguments.Add(buildingArgument); } } if (CrashReportingSettings.enabled) { arguments.Add($"--emit-source-mapping"); } var additionalArgs = IL2CPPUtils.GetAdditionalArguments(); if (!string.IsNullOrEmpty(additionalArgs)) { arguments.Add(additionalArgs); } arguments.Add($"--directory={CommandLineFormatter.PrepareFileName(GetShortPathName(Path.GetFullPath(data.inputDirectory)))}"); arguments.Add($"--generatedcppdir={CommandLineFormatter.PrepareFileName(GetCppOutputDirectory(m_PlatformProvider.il2cppBuildCacheDirectory))}"); // NOTE: any arguments added here that affect how generated code is built need // to also be added to PlatformDependent\Win\Extensions\Managed\VisualStudioProjectHelpers.cs // as that file generated project files that invoke back into IL2CPP in order to build // generated code string progressMessage = "Converting managed assemblies to C++"; if (il2CppNativeCodeBuilder != null) { progressMessage = "Building native binary with IL2CPP..."; } if (EditorUtility.DisplayCancelableProgressBar("Building Player", progressMessage, 0.3f)) { throw new OperationCanceledException(); } Action <ProcessStartInfo> setupStartInfo = null; if (il2CppNativeCodeBuilder != null) { setupStartInfo = il2CppNativeCodeBuilder.SetupStartInfo; } if (PlayerBuildInterface.ExtraTypesProvider != null) { var extraTypes = new HashSet <string>(); foreach (var extraType in PlayerBuildInterface.ExtraTypesProvider()) { extraTypes.Add(extraType); } var tempFile = Path.GetFullPath(Path.Combine(m_TempFolder, "extra-types.txt")); File.WriteAllLines(tempFile, extraTypes.ToArray()); arguments.Add($"--extra-types-file={CommandLineFormatter.PrepareFileName(tempFile)}"); } RunIl2CppWithArguments(arguments, setupStartInfo); }