private void DrawDefineConstraintListElement(Rect rect, int index, bool isactive, bool isfocused) { var list = m_DefineConstraints.serializedProperty; var defineConstraint = list.GetArrayElementAtIndex(index).FindPropertyRelative("name"); rect.height -= EditorGUIUtility.standardVerticalSpacing; var textFieldRect = new Rect(rect.x, rect.y + 1, rect.width - ReorderableList.Defaults.dragHandleWidth, rect.height); var validRect = new Rect(rect.width + ReorderableList.Defaults.dragHandleWidth + 1, rect.y + 1, ReorderableList.Defaults.dragHandleWidth, rect.height); string noValue = L10n.Tr("(Missing)"); var label = string.IsNullOrEmpty(defineConstraint.stringValue) ? noValue : defineConstraint.stringValue; bool mixed = defineConstraint.hasMultipleDifferentValues; EditorGUI.showMixedValue = mixed; var textFieldValue = EditorGUI.TextField(textFieldRect, mixed ? L10n.Tr("(Multiple Values)") : label); EditorGUI.showMixedValue = false; if (m_Defines != null) { EditorGUI.BeginDisabled(true); EditorGUI.Toggle(validRect, DefineConstraintsHelper.IsDefineConstraintValid(m_Defines, defineConstraint.stringValue)); EditorGUI.EndDisabled(); } if (!string.IsNullOrEmpty(textFieldValue) && textFieldValue != noValue) { defineConstraint.stringValue = textFieldValue; } }
public override bool IsSupportedFor(CSharpProgramConfiguration config) { //UNITY_DOTS_ENTRYPOINT is actually a fake define constraint we use to signal the buildsystem, // so don't impose it as a constraint return(DefineConstraintsHelper.IsDefineConstraintsCompatible(Defines.For(config).Append("UNITY_DOTS_ENTRYPOINT").ToArray(), AsmDefDescription.DefineConstraints) && base.IsSupportedFor(config)); }
private static bool IsPluginCompatible(PluginImporter pluginImporter, string buildTargetName, string[] defines) { var defineConstraints = pluginImporter.DefineConstraints; var isCompatibleWithPlatform = pluginImporter.GetCompatibleWithPlatformOrAnyPlatformBuildTarget(buildTargetName); return(isCompatibleWithPlatform && DefineConstraintsHelper.IsDefineConstraintsCompatible(defines, defineConstraints)); }
private void DrawDefineConstraintListElement(Rect rect, int index, bool isactive, bool isfocused) { var list = m_DefineConstraints.list; var defineConstraint = list[index] as DefineConstraint; rect.height -= EditorGUIUtility.standardVerticalSpacing; var textFieldRect = new Rect(rect.x, rect.y + Styles.kCenterHeightOffset, rect.width - ReorderableList.Defaults.dragHandleWidth, rect.height); string noValue = L10n.Tr("(Missing)"); var label = string.IsNullOrEmpty(defineConstraint.name) ? noValue : defineConstraint.name; bool mixed = defineConstraint.displayValue == Compatibility.Mixed; EditorGUI.showMixedValue = mixed; var textFieldValue = EditorGUI.TextField(textFieldRect, mixed ? L10n.Tr("(Multiple Values)") : label); EditorGUI.showMixedValue = false; var defines = InternalEditorUtility.GetCompilationDefines(EditorScriptCompilationOptions.BuildingForEditor, EditorUserBuildSettings.activeBuildTargetGroup, EditorUserBuildSettings.activeBuildTarget); if (defines != null) { var status = DefineConstraintsHelper.GetDefineConstraintCompatibility(defines, defineConstraint.name); var image = status == DefineConstraintsHelper.DefineConstraintStatus.Compatible ? Styles.validDefineConstraint : Styles.invalidDefineConstraint; var content = new GUIContent(image, Styles.GetIndividualTooltipFromDefineConstraintStatus(status)); var constraintValidityRect = new Rect(rect.width + ReorderableList.Defaults.dragHandleWidth + Styles.kValidityIconWidth / 4, rect.y + Styles.kCenterHeightOffset, Styles.kValidityIconWidth, Styles.kValidityIconHeight); EditorGUI.LabelField(constraintValidityRect, content); } if (!string.IsNullOrEmpty(textFieldValue) && textFieldValue != noValue && defineConstraint.name != textFieldValue) { m_HasModified = true; defineConstraint.name = textFieldValue; } }
private void DrawDefineConstraintListElement(Rect rect, int index, bool isactive, bool isfocused) { var list = m_DefineConstraints.serializedProperty; var defineConstraint = list.GetArrayElementAtIndex(index).FindPropertyRelative("name"); rect.height -= EditorGUIUtility.standardVerticalSpacing; var textFieldRect = new Rect(rect.x, rect.y + 1, rect.width - ReorderableList.Defaults.dragHandleWidth + 1, rect.height); string noValue = L10n.Tr("(Missing)"); var label = string.IsNullOrEmpty(defineConstraint.stringValue) ? noValue : defineConstraint.stringValue; bool mixed = defineConstraint.hasMultipleDifferentValues; EditorGUI.showMixedValue = mixed; var textFieldValue = EditorGUI.TextField(textFieldRect, mixed ? L10n.Tr("(Multiple Values)") : label); EditorGUI.showMixedValue = false; var defines = CompilationPipeline.GetDefinesFromAssemblyName(m_AssemblyName.stringValue); if (defines != null) { var status = DefineConstraintsHelper.GetDefineConstraintCompatibility(defines, defineConstraint.stringValue); var image = status == DefineConstraintsHelper.DefineConstraintStatus.Compatible ? Styles.validDefineConstraint : Styles.invalidDefineConstraint; var content = new GUIContent(image, Styles.GetIndividualTooltipFromDefineConstraintStatus(status)); var constraintValidityRect = new Rect(rect.width + ReorderableList.Defaults.dragHandleWidth + ReorderableList.Defaults.dragHandleWidth / 2f - Styles.kValidityIconWidth / 2f + 1, rect.y, Styles.kValidityIconWidth, Styles.kValidityIconHeight); EditorGUI.LabelField(constraintValidityRect, content); } if (!string.IsNullOrEmpty(textFieldValue) && textFieldValue != noValue) { defineConstraint.stringValue = textFieldValue; } }
public override void OnInspectorGUI() { if (initializeException != null) { ShowLoadErrorExceptionGUI(initializeException); ApplyRevertGUI(); return; } extraDataSerializedObject.Update(); var platforms = CompilationPipeline.GetAssemblyDefinitionPlatforms(); using (new EditorGUI.DisabledScope(false)) { if (targets.Length > 1) { using (new EditorGUI.DisabledScope(true)) { var value = string.Join(", ", extraDataTargets.Select(t => t.name).ToArray()); EditorGUILayout.TextField(Styles.name, value, EditorStyles.textField); } } else { EditorGUILayout.PropertyField(m_AssemblyName, Styles.name); } GUILayout.Label(Styles.generalOptions, EditorStyles.boldLabel); EditorGUILayout.BeginVertical(GUI.skin.box); EditorGUILayout.PropertyField(m_AllowUnsafeCode, Styles.allowUnsafeCode); EditorGUILayout.PropertyField(m_AutoReferenced, Styles.autoReferenced); EditorGUILayout.PropertyField(m_OverrideReferences, Styles.overrideReferences); EditorGUILayout.PropertyField(m_NoEngineReferences, Styles.noEngineReferences); EditorGUILayout.EndVertical(); GUILayout.Space(10f); GUILayout.Label(Styles.defineConstraints, EditorStyles.boldLabel); if (m_DefineConstraints.serializedProperty.arraySize > 0) { var defineConstraintsValid = true; for (var i = 0; i < m_DefineConstraints.serializedProperty.arraySize && defineConstraintsValid; ++i) { var defineConstraint = m_DefineConstraints.serializedProperty.GetArrayElementAtIndex(i).FindPropertyRelative("name").stringValue; if (!DefineConstraintsHelper.IsDefineConstraintValid(m_Defines, defineConstraint)) { defineConstraintsValid = false; } } var constraintValidityRect = new Rect(GUILayoutUtility.GetLastRect()); constraintValidityRect.x += constraintValidityRect.width - 23; if (defineConstraintsValid) { constraintValidityRect.width = Styles.validDefineConstraint.image.width; constraintValidityRect.height = Styles.validDefineConstraint.image.height; EditorGUI.LabelField(constraintValidityRect, Styles.validDefineConstraint); } else { constraintValidityRect.width = Styles.invalidDefineConstraint.image.width; constraintValidityRect.height = Styles.invalidDefineConstraint.image.height; EditorGUI.LabelField(constraintValidityRect, Styles.invalidDefineConstraint); } } m_DefineConstraints.DoLayoutList(); GUILayout.Label(Styles.references, EditorStyles.boldLabel); EditorGUILayout.BeginVertical(GUI.skin.box); EditorGUILayout.PropertyField(m_UseGUIDs, Styles.useGUIDs); EditorGUILayout.EndVertical(); m_ReferencesList.DoLayoutList(); if (extraDataTargets.Any(data => ((AssemblyDefinitionState)data).references != null && ((AssemblyDefinitionState)data).references.Any(x => x.asset == null))) { EditorGUILayout.HelpBox("The grayed out assembly references are missing and will not be referenced during compilation.", MessageType.Info); } if (m_OverrideReferences.boolValue && !m_OverrideReferences.hasMultipleDifferentValues) { GUILayout.Label(Styles.precompiledReferences, EditorStyles.boldLabel); UpdatePrecompiledReferenceListEntry(); m_PrecompiledReferencesList.DoLayoutList(); if (extraDataTargets.Any(data => ((AssemblyDefinitionState)data).precompiledReferences.Any(x => string.IsNullOrEmpty(x.path) && !string.IsNullOrEmpty(x.name)))) { EditorGUILayout.HelpBox("The grayed out assembly references are missing and will not be referenced during compilation.", MessageType.Info); } } GUILayout.Label(Styles.platforms, EditorStyles.boldLabel); EditorGUILayout.BeginVertical(GUI.skin.box); using (var change = new EditorGUI.ChangeCheckScope()) { EditorGUILayout.PropertyField(m_CompatibleWithAnyPlatform, Styles.anyPlatform); if (change.changed) { // Invert state include/exclude compatibility of states that have the opposite compatibility, // so all states are either include or exclude. var compatibleWithAny = m_CompatibleWithAnyPlatform.boolValue; var needToSwap = extraDataTargets.Cast <AssemblyDefinitionState>().Where(p => p.compatibleWithAnyPlatform != compatibleWithAny).ToList(); extraDataSerializedObject.ApplyModifiedProperties(); foreach (var state in needToSwap) { InversePlatformCompatibility(state); } extraDataSerializedObject.Update(); } } if (!m_CompatibleWithAnyPlatform.hasMultipleDifferentValues) { GUILayout.Label(m_CompatibleWithAnyPlatform.boolValue ? Styles.excludePlatforms : Styles.includePlatforms, EditorStyles.boldLabel); for (int i = 0; i < platforms.Length; ++i) { SerializedProperty property; if (i >= m_PlatformCompatibility.arraySize) { m_PlatformCompatibility.arraySize++; property = m_PlatformCompatibility.GetArrayElementAtIndex(i); property.boolValue = false; } else { property = m_PlatformCompatibility.GetArrayElementAtIndex(i); } EditorGUILayout.PropertyField(property, new GUIContent(platforms[i].DisplayName)); } EditorGUILayout.Space(); GUILayout.BeginHorizontal(); if (GUILayout.Button(Styles.selectAll)) { var prop = m_PlatformCompatibility.GetArrayElementAtIndex(0); var end = m_PlatformCompatibility.GetEndProperty(); do { prop.boolValue = true; }while (prop.Next(false) && !SerializedProperty.EqualContents(prop, end)); } if (GUILayout.Button(Styles.deselectAll)) { var prop = m_PlatformCompatibility.GetArrayElementAtIndex(0); var end = m_PlatformCompatibility.GetEndProperty(); do { prop.boolValue = false; }while (prop.Next(false) && !SerializedProperty.EqualContents(prop, end)); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); GUILayout.Space(10f); EditorGUILayout.BeginVertical(GUI.skin.box); GUILayout.Label(Styles.versionDefines, EditorStyles.boldLabel); m_VersionDefineList.DoLayoutList(); EditorGUILayout.EndVertical(); } extraDataSerializedObject.ApplyModifiedProperties(); ApplyRevertGUI(); }
public static bool IsDefineConstraintsCompatible(string[] defines, string[] defineConstraints) { return(DefineConstraintsHelper.IsDefineConstraintsCompatible(defines, defineConstraints)); }
private static bool IsPluginDefinesCompatible(PluginImporter pluginImporter, string buildTargetName, string[] defines) { var defineConstraints = pluginImporter.DefineConstraints; return(DefineConstraintsHelper.IsDefineConstraintsCompatible(defines, defineConstraints)); }
public override void OnInspectorGUI() { serializedObject.Update(); using (new EditorGUI.DisabledScope(false)) { var isManagedPlugin = importers.All(x => x.dllType == DllType.ManagedNET35 || x.dllType == DllType.ManagedNET40); if (isManagedPlugin) { ShowReferenceOptions(); GUILayout.Space(10f); } GUILayout.Label(Styles.kPluginPlatforms, EditorStyles.boldLabel); EditorGUILayout.BeginVertical(GUI.skin.box); ShowGeneralOptions(); EditorGUILayout.EndVertical(); GUILayout.Space(10f); if (IsEditingPlatformSettingsSupported()) { ShowPlatformSettings(); } if (isManagedPlugin) { GUILayout.Label(Styles.kDefineConstraints, EditorStyles.boldLabel); if (m_DefineConstraints.list.Count > 0) { var defines = InternalEditorUtility.GetCompilationDefines(EditorScriptCompilationOptions.BuildingForEditor, EditorUserBuildSettings.activeBuildTargetGroup, EditorUserBuildSettings.activeBuildTarget); var defineConstraintsCompatible = true; if (defines != null) { for (var i = 0; i < m_DefineConstraints.list.Count && defineConstraintsCompatible; ++i) { var defineConstraint = ((DefineConstraint)m_DefineConstraints.list[i]).name; if (DefineConstraintsHelper.GetDefineConstraintCompatibility(defines, defineConstraint) != DefineConstraintsHelper.DefineConstraintStatus.Compatible) { defineConstraintsCompatible = false; } } var constraintValidityRect = new Rect(GUILayoutUtility.GetLastRect()); constraintValidityRect.x = constraintValidityRect.width - Styles.kValidityIconWidth / 4; var image = defineConstraintsCompatible ? Styles.validDefineConstraint : Styles.invalidDefineConstraint; var tooltip = Styles.GetTitleTooltipFromDefineConstraintCompatibility(defineConstraintsCompatible); var content = new GUIContent(image, tooltip); constraintValidityRect.width = Styles.kValidityIconWidth; constraintValidityRect.height = Styles.kValidityIconHeight; EditorGUI.LabelField(constraintValidityRect, content); } } m_DefineConstraints.DoLayoutList(); } if (importers.All(imp => imp.isNativePlugin)) { GUILayout.Space(10f); GUILayout.Label(Styles.kLoadSettings, EditorStyles.boldLabel); ShowLoadSettings(); } } serializedObject.ApplyModifiedProperties(); ApplyRevertGUI(); // Don't output additional information if we have multiple plugins selected if (targets.Length > 1) { return; } GUILayout.Label(Styles.kInformation, EditorStyles.boldLabel); m_InformationScrollPosition = EditorGUILayout.BeginVerticalScrollView(m_InformationScrollPosition); foreach (var prop in m_PluginInformation) { GUILayout.BeginHorizontal(); GUILayout.Label(prop.Key, GUILayout.Width(85)); EditorGUILayout.SelectableLabel(prop.Value, GUILayout.Height(EditorGUI.kSingleLineHeight)); GUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); GUILayout.FlexibleSpace(); // Warning for Case 648027 // Once Mono loads a native plugin, it never releases a handle, thus plugin is never unloaded. if (importer.isNativePlugin) { EditorGUILayout.HelpBox("Once a native plugin is loaded from script, it's never unloaded. If you deselect a native plugin and it's already loaded, please restart Unity.", MessageType.Warning); } }
public override void DiscardChanges() { base.DiscardChanges(); m_HasModified = false; m_DefineConstraintState.Clear(); // making sure we apply any serialized changes to the targets so accessing pluginImporter.DefineConstraints will have the updated values serializedObject.ApplyModifiedProperties(); var minSizeOfDefines = importers.Min(x => x.DefineConstraints.Length); string[] baseImporterDefineConstraints = importer.DefineConstraints; foreach (var pluginImporter in importers) { var importerDefineConstraints = pluginImporter.DefineConstraints.Take(minSizeOfDefines).ToList(); for (var i = 0; i < importerDefineConstraints.Count; i++) { var importerDefineConstraint = importerDefineConstraints[i]; var symbolName = importerDefineConstraint.StartsWith(DefineConstraintsHelper.Not) ? importerDefineConstraint.Substring(1) : importerDefineConstraint; Compatibility mixedValue = importerDefineConstraints[i] != baseImporterDefineConstraints[i] ? Compatibility.Mixed : Compatibility.Compatible; m_DefineConstraintState.Add(new DefineConstraint { name = importerDefineConstraint, displayValue = mixedValue }); if (!DefineConstraintsHelper.IsDefineConstraintValid(symbolName)) { m_HasModified = true; Debug.LogError($"Invalid define constraint {symbolName} in plugin {pluginImporter.assetPath}"); } } } ResetCompatability(ref m_CompatibleWithAnyPlatform, (imp => imp.GetCompatibleWithAnyPlatform())); ResetCompatability(ref m_CompatibleWithEditor, (imp => imp.GetCompatibleWithEditor())); ResetCompatability(ref m_AutoReferenced, (imp => !imp.IsExplicitlyReferenced)); ResetCompatability(ref m_ValidateReferences, (imp => imp.ValidateReferences)); // If Any Platform is selected, initialize m_Compatible* variables using compatability function // If Any Platform is unselected, initialize m_Compatible* variables using exclude function // This gives correct initialization in case when plugin is imported for the first time, and only "Any Platform" is selected if (m_CompatibleWithAnyPlatform < Compatibility.Compatible) { ResetCompatability(ref m_CompatibleWithEditor, (imp => imp.GetCompatibleWithEditor("", ""))); foreach (BuildTarget platform in GetValidBuildTargets()) { ResetCompatability(ref m_CompatibleWithPlatform[(int)platform], (imp => imp.GetCompatibleWithPlatform(platform))); } } else { ResetCompatability(ref m_CompatibleWithEditor, (imp => !imp.GetExcludeEditorFromAnyPlatform())); foreach (BuildTarget platform in GetValidBuildTargets()) { ResetCompatability(ref m_CompatibleWithPlatform[(int)platform], (imp => !imp.GetExcludeFromAnyPlatform(platform))); } } ResetCompatability(ref m_Preload, (imp => imp.isPreloaded)); if (!IsEditingPlatformSettingsSupported()) { return; } foreach (var extension in additionalExtensions) { extension.ResetValues(this); } foreach (BuildTarget platform in GetValidBuildTargets()) { IPluginImporterExtension extension = ModuleManager.GetPluginImporterExtension(platform); if (extension != null) { extension.ResetValues(this); } } }