diff --git a/.editorconfig b/.editorconfig
index 01de2e0..0f71814 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,227 +1,206 @@
-# EditorConfig helps developers define and maintain consistent
-# coding styles between different editors and IDEs
-# editorconfig.org
+# EditorConfig is awesome: https://EditorConfig.org
+# top-most EditorConfig file
root = true
-
+# Don't use tabs for indentation.
[*]
-
-# Change these settings to your own preference
indent_style = space
-indent_size = 4
+# (Please don't specify an indent_size here; that has too many unintended consequences.)
-# We recommend you to keep these unchanged
+# Defaults
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
+# Documentation files
[*.md]
-indent_style = tab
+indent_size = 2
trim_trailing_whitespace = false
+# Package manifests
[{manifest.json,package.json}]
indent_style = space
indent_size = 2
-# Solution Files
-[*.sln]
-indent_style = tab
-
-# XML Project Files
-[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
-indent_size = 2
-
-# C# files
+# Dotnet Code Style Settings
+# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
+# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
[*.cs]
-#### .NET Coding Conventions ####
-
# Organize usings
-dotnet_separate_import_directive_groups = false
-dotnet_sort_system_directives_first = false
-file_header_template = unset
-
-# this. and Me. preferences
-dotnet_style_qualification_for_event = false:silent
+dotnet_sort_system_directives_first = true:warning
+# this. preferences
dotnet_style_qualification_for_field = false:silent
-dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_property = false:silent
-
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_event = false:silent
# Language keywords vs BCL types preferences
-dotnet_style_predefined_type_for_locals_parameters_members = true:silent
-dotnet_style_predefined_type_for_member_access = true:silent
-
+dotnet_style_predefined_type_for_locals_parameters_members = true:warning
+dotnet_style_predefined_type_for_member_access = true:warning
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
-dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
-
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
-
+dotnet_style_readonly_field = true:suggestion
# Expression-level preferences
-dotnet_style_coalesce_expression = true:suggestion
-dotnet_style_collection_initializer = true:suggestion
-dotnet_style_explicit_tuple_names = true:suggestion
-dotnet_style_null_propagation = true:suggestion
-dotnet_style_object_initializer = true:suggestion
-dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
-dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
-dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
-dotnet_style_prefer_inferred_tuple_names = true:suggestion
-dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
-dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
-dotnet_style_prefer_simplified_interpolation = true:suggestion
-
-# Field preferences
-dotnet_style_readonly_field = true:suggestion
-
-# Parameter preferences
-dotnet_code_quality_unused_parameters = all:suggestion
-
-# Suppression preferences
-dotnet_remove_unnecessary_suppression_exclusions = none
-
-#### C# Coding Conventions ####
-
-# var preferences
-csharp_style_var_elsewhere = false:silent
-csharp_style_var_for_built_in_types = false:silent
-csharp_style_var_when_type_is_apparent = false:silent
-
-# Expression-bodied members
-csharp_style_expression_bodied_accessors = true:silent
-csharp_style_expression_bodied_constructors = false:silent
-csharp_style_expression_bodied_indexers = true:silent
-csharp_style_expression_bodied_lambdas = true:silent
-csharp_style_expression_bodied_local_functions = false:silent
-csharp_style_expression_bodied_methods = false:silent
-csharp_style_expression_bodied_operators = false:silent
-csharp_style_expression_bodied_properties = true:silent
-
-# Pattern matching preferences
-csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
-csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
-csharp_style_prefer_not_pattern = true:suggestion
-csharp_style_prefer_pattern_matching = true:silent
-csharp_style_prefer_switch_expression = true:suggestion
-
-# Null-checking preferences
-csharp_style_conditional_delegate_call = true:suggestion
-
-# Modifier preferences
-csharp_prefer_static_local_function = true:suggestion
-csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent
-
-# Code-block preferences
-csharp_prefer_braces = true:silent
-csharp_prefer_simple_using_statement = true:suggestion
-
-# Expression-level preferences
-csharp_prefer_simple_default_expression = true:suggestion
-csharp_style_deconstructed_variable_declaration = true:suggestion
-csharp_style_inlined_variable_declaration = true:suggestion
-csharp_style_pattern_local_over_anonymous_function = true:suggestion
-csharp_style_prefer_index_operator = true:suggestion
-csharp_style_prefer_range_operator = true:suggestion
-csharp_style_throw_expression = true:suggestion
-csharp_style_unused_value_assignment_preference = discard_variable:suggestion
-csharp_style_unused_value_expression_statement_preference = discard_variable:silent
-
-# 'using' directive preferences
-csharp_using_directive_placement = inside_namespace:silent
-
-#### C# Formatting Rules ####
-
-# New line preferences
-csharp_new_line_before_catch = true
-csharp_new_line_before_else = true
-csharp_new_line_before_finally = true
-csharp_new_line_before_members_in_anonymous_types = true
-csharp_new_line_before_members_in_object_initializers = true
-csharp_new_line_before_open_brace = all
-csharp_new_line_between_query_expression_clauses = true
-
-# Indentation preferences
-csharp_indent_block_contents = true
-csharp_indent_braces = false
-csharp_indent_case_contents = true
-csharp_indent_case_contents_when_block = true
-csharp_indent_labels = one_less_than_current
-csharp_indent_switch_labels = true
-
-# Space preferences
-csharp_space_after_cast = false
-csharp_space_after_colon_in_inheritance_clause = true
-csharp_space_after_comma = true
-csharp_space_after_dot = false
-csharp_space_after_keywords_in_control_flow_statements = true
-csharp_space_after_semicolon_in_for_statement = true
-csharp_space_around_binary_operators = before_and_after
-csharp_space_around_declaration_statements = false
-csharp_space_before_colon_in_inheritance_clause = true
-csharp_space_before_comma = false
-csharp_space_before_dot = false
-csharp_space_before_open_square_brackets = false
-csharp_space_before_semicolon_in_for_statement = false
-csharp_space_between_empty_square_brackets = false
-csharp_space_between_method_call_empty_parameter_list_parentheses = false
-csharp_space_between_method_call_name_and_opening_parenthesis = false
-csharp_space_between_method_call_parameter_list_parentheses = false
-csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
-csharp_space_between_method_declaration_name_and_open_parenthesis = false
-csharp_space_between_method_declaration_parameter_list_parentheses = false
-csharp_space_between_parentheses = false
-csharp_space_between_square_brackets = false
-
-# Wrapping preferences
-csharp_preserve_single_line_blocks = true
-csharp_preserve_single_line_statements = true
-
-#### Naming styles ####
-
-# Naming rules
-
-dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
-dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
-dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
-
-dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.types_should_be_pascal_case.symbols = types
-dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
-
-dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
-dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
-
-# Symbol specifications
-
-dotnet_naming_symbols.interface.applicable_kinds = interface
-dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.interface.required_modifiers =
-
-dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
-dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.types.required_modifiers =
-
-dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
-dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
-dotnet_naming_symbols.non_field_members.required_modifiers =
-
-# Naming styles
-
-dotnet_naming_style.pascal_case.required_prefix =
-dotnet_naming_style.pascal_case.required_suffix =
-dotnet_naming_style.pascal_case.word_separator =
+dotnet_style_coalesce_expression = true:warning
+dotnet_style_collection_initializer = true:warning
+dotnet_style_explicit_tuple_names = true:warning
+dotnet_style_null_propagation = true:warning
+dotnet_style_object_initializer = true:warning
+
+# Naming Symbols
+# constant_fields - Define constant fields
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+# non_private_readonly_fields - Define public, internal and protected readonly fields
+dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, internal, protected
+dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly
+# static_readonly_fields - Define static and readonly fields
+dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.static_readonly_fields.required_modifiers = static, readonly
+# private_readonly_fields - Define private readonly fields
+dotnet_naming_symbols.private_readonly_fields.applicable_accessibilities = private
+dotnet_naming_symbols.private_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.private_readonly_fields.required_modifiers = readonly
+# public_internal_fields - Define public and internal fields
+dotnet_naming_symbols.public_internal_fields.applicable_accessibilities = public, internal
+dotnet_naming_symbols.public_internal_fields.applicable_kinds = field
+# private_protected_fields - Define private and protected fields
+dotnet_naming_symbols.private_protected_fields.applicable_accessibilities = private, protected
+dotnet_naming_symbols.private_protected_fields.applicable_kinds = field
+# public_symbols - Define any public symbol
+dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, internal, protected, protected_internal
+dotnet_naming_symbols.public_symbols.applicable_kinds = method, property, event, delegate
+# parameters - Defines any parameter
+dotnet_naming_symbols.parameters.applicable_kinds = parameter
+# non_interface_types - Defines class, struct, enum and delegate types
+dotnet_naming_symbols.non_interface_types.applicable_kinds = class, struct, enum, delegate
+# interface_types - Defines interfaces
+dotnet_naming_symbols.interface_types.applicable_kinds = interface
+
+# Naming Styles
+# camel_case - Define the camelCase style
+dotnet_naming_style.camel_case.capitalization = camel_case
+# pascal_case - Define the Pascal_case style
dotnet_naming_style.pascal_case.capitalization = pascal_case
-
-dotnet_naming_style.begins_with_i.required_prefix = I
-dotnet_naming_style.begins_with_i.required_suffix =
-dotnet_naming_style.begins_with_i.word_separator =
-dotnet_naming_style.begins_with_i.capitalization = pascal_case
\ No newline at end of file
+# first_upper - The first character must start with an upper-case character
+dotnet_naming_style.first_upper.capitalization = first_word_upper
+# prefix_interface_interface_with_i - Interfaces must be PascalCase and the first character of an interface must be an 'I'
+dotnet_naming_style.prefix_interface_interface_with_i.capitalization = pascal_case
+dotnet_naming_style.prefix_interface_interface_with_i.required_prefix = I
+
+# Naming Rules
+# Constant fields must be PascalCase
+dotnet_naming_rule.constant_fields_must_be_pascal_case.severity = warning
+dotnet_naming_rule.constant_fields_must_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_must_be_pascal_case.style = pascal_case
+# Public, internal and protected readonly fields must be PascalCase
+dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.severity = warning
+dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.symbols = non_private_readonly_fields
+dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.style = pascal_case
+# Static readonly fields must be PascalCase
+dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.severity = warning
+dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.symbols = static_readonly_fields
+dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.style = pascal_case
+# Private readonly fields must be camelCase
+dotnet_naming_rule.private_readonly_fields_must_be_camel_case.severity = warning
+dotnet_naming_rule.private_readonly_fields_must_be_camel_case.symbols = private_readonly_fields
+dotnet_naming_rule.private_readonly_fields_must_be_camel_case.style = camel_case
+# Public and internal fields must be PascalCase
+dotnet_naming_rule.public_internal_fields_must_be_pascal_case.severity = warning
+dotnet_naming_rule.public_internal_fields_must_be_pascal_case.symbols = public_internal_fields
+dotnet_naming_rule.public_internal_fields_must_be_pascal_case.style = pascal_case
+# Private and protected fields must be camelCase
+dotnet_naming_rule.private_protected_fields_must_be_camel_case.severity = warning
+dotnet_naming_rule.private_protected_fields_must_be_camel_case.symbols = private_protected_fields
+dotnet_naming_rule.private_protected_fields_must_be_camel_case.style = camel_case
+# Public members must be capitalized
+dotnet_naming_rule.public_members_must_be_capitalized.severity = warning
+dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols
+dotnet_naming_rule.public_members_must_be_capitalized.style = first_upper
+# Parameters must be camelCase
+dotnet_naming_rule.parameters_must_be_camel_case.severity = warning
+dotnet_naming_rule.parameters_must_be_camel_case.symbols = parameters
+dotnet_naming_rule.parameters_must_be_camel_case.style = camel_case
+# Class, struct, enum and delegates must be PascalCase
+dotnet_naming_rule.non_interface_types_must_be_pascal_case.severity = warning
+dotnet_naming_rule.non_interface_types_must_be_pascal_case.symbols = non_interface_types
+dotnet_naming_rule.non_interface_types_must_be_pascal_case.style = pascal_case
+# Interfaces must be PascalCase and start with an 'I'
+dotnet_naming_rule.interface_types_must_be_prefixed_with_i.severity = warning
+dotnet_naming_rule.interface_types_must_be_prefixed_with_i.symbols = interface_types
+dotnet_naming_rule.interface_types_must_be_prefixed_with_i.style = prefix_interface_interface_with_i
+
+# C# Code Style Settings
+# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
+# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
+[*.cs,csx,cake]
+# Indentation Options
+csharp_indent_block_contents = true:warning
+csharp_indent_braces = false:warning
+csharp_indent_case_contents = true:warning
+csharp_indent_labels = no_change:warning
+csharp_indent_switch_labels = true:warning
+# Style Options
+csharp_style_conditional_delegate_call = true:warning
+csharp_style_expression_bodied_accessors = true:warning
+csharp_style_expression_bodied_constructors = true:warning
+csharp_style_expression_bodied_indexers = true:warning
+csharp_style_expression_bodied_methods = true:warning
+csharp_style_expression_bodied_operators = true:warning
+csharp_style_expression_bodied_properties = true:warning
+csharp_style_inlined_variable_declaration = true:warning
+csharp_style_pattern_matching_over_as_with_null_check = true:warning
+csharp_style_pattern_matching_over_is_with_cast_check = true:warning
+csharp_style_throw_expression = true:warning
+csharp_style_var_elsewhere = false:warning
+csharp_style_var_for_built_in_types = false:warning
+csharp_style_var_when_type_is_apparent = false:warning
+# New Line Options
+csharp_new_line_before_catch = true:warning
+csharp_new_line_before_else = true:warning
+csharp_new_line_before_finally = true:warning
+csharp_new_line_before_members_in_anonymous_types = true:warning
+csharp_new_line_before_members_in_object_initializers = true:warning
+# BUG: Warning level cannot be set https://github.com/dotnet/roslyn/issues/18010
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true:warning
+# Spacing Options
+csharp_space_after_cast = false:warning
+csharp_space_after_colon_in_inheritance_clause = true:warning
+csharp_space_after_comma = true:warning
+csharp_space_after_dot = false:warning
+csharp_space_between_method_call_parameter_list_parentheses = true:warning
+csharp_space_after_semicolon_in_for_statement = true:warning
+csharp_space_around_binary_operators = before_and_after:warning
+csharp_space_around_declaration_statements = do_not_ignore:warning
+csharp_space_before_colon_in_inheritance_clause = true:warning
+csharp_space_before_comma = false:warning
+csharp_space_before_dot = false:warning
+csharp_space_before_semicolon_in_for_statement = false:warning
+csharp_space_before_open_square_brackets = false:warning
+csharp_space_between_empty_square_brackets = false:warning
+csharp_space_between_method_declaration_name_and_open_parenthesis = false:warning
+csharp_space_between_method_declaration_parameter_list_parentheses = false:warning
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false:warning
+csharp_space_between_method_call_name_and_opening_parenthesis = false:warning
+csharp_space_between_method_call_parameter_list_parentheses = false:warning
+csharp_space_between_method_call_empty_parameter_list_parentheses = false:warning
+csharp_space_between_parentheses = expressions:warning
+csharp_space_between_square_brackets = false:warning
+# Wrapping Options
+csharp_preserve_single_line_blocks = true:warning
+csharp_preserve_single_line_statements = false:warning
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cb48fcd..648f180 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,202 +5,209 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [Unreleased]
+
+
+## [8.0.0-pre.1] - 2025-01-07
### Added
-- Added `BuildConstants.buildCounter` constant (by [@magicjar](https://github.com/magicjar))
+- Added `BuildConstants.buildCounter` constant (by [@magicjar](https://github.com/magicjar))
+- Added Dedicated Server support for Windows, Mac and Linux. (with contribution from [@firdiar-mita](https://github.com/firdiar-mita))
+- Added support for building for ARM64 on Windows in Unity 2023.1+
+- Added support for `BuildPlatform`s to draw additional option properties in `BuildPlatformListDrawer`
### Changed
-- **Breaking change:** Solution for setting Android API levels that `UnityEditor.AndroidSdkVersions` does not include, which was preventing building Meta Quest Store-compatible apps in certain Unity versions.
+- **Breaking change:** Solution for setting Android API levels that `UnityEditor.AndroidSdkVersions` does not include, which was preventing building Meta Quest Store-compatible apps in certain Unity versions.
+- **Breaking change:** Raised minimum supported Unity version to Unity 2021.3 LTS.
+- **Breaking change:** Refactored `BuildPlatform`s and renamed `BuildPC` to `BuildWindows` and `BuildOSX` to `BuildMac` to match Unity platform naming conventions.
### Fixed
-- Fix `$DAYSSINCE` build version template token being mangled by `$DAY` token.
-- Fix `$NOUN` and `$ADJECTIVE` build version template tokens not working since conversion to UPM package.
-- Fix 'Error building Player: Incompatible color space with graphics API' when building for Linear color space on Android. (by [@MatthieuG9](https://github.com/MatthieuG9))
-- Fix Android split APK setting usage in Unity 2023.1 (by [@Brian-Jiang](https://github.com/Brian-Jiang))
-- Fix build scripting defines not being culture-agnostic (by [@hilminamli](https://github.com/hilminamli))
+- Fix `$DAYSSINCE` build version template token being mangled by `$DAY` token.
+- Fix `$NOUN` and `$ADJECTIVE` build version template tokens not working since conversion to UPM package.
+- Fix 'Error building Player: Incompatible color space with graphics API' when building for Linear color space on Android. (by [@MatthieuG9](https://github.com/MatthieuG9))
+- Fix Android split APK setting usage in Unity 2023.1 (by [@Brian-Jiang](https://github.com/Brian-Jiang))
+- Fix build scripting defines not being culture-agnostic (by [@hilminamli](https://github.com/hilminamli))
## [7.0.0] - 2023-10-03
### Added
-- Double-click settings assets to assign them as the active settings in the SuperUnityBuild window. (by [@RobProductions](https://github.com/RobProductions))
-- Customize app build name. (by [@RobProductions](https://github.com/RobProductions))
-- Customize `BuildConstants` file path. (by [@RobProductions](https://github.com/RobProductions))
+- Double-click settings assets to assign them as the active settings in the SuperUnityBuild window. (by [@RobProductions](https://github.com/RobProductions))
+- Customize app build name. (by [@RobProductions](https://github.com/RobProductions))
+- Customize `BuildConstants` file path. (by [@RobProductions](https://github.com/RobProductions))
### Changed
-- **Breaking change:** Namespaced generated `BuildConstants` class and enums, added `BuildConstants.scriptingBackend` constant.
-- Remove redundant `dataDirNameFormat` variable from Build Platforms.
-- Renamed 'Per-Platform' Build Action type to 'Per-Build' to reflect when they are run.
-- Enhanced support for string token usage in Build Action configurations. Per-Build actions have gained support for `$BASEPATH` and `$BUILDPATH`, whilst Single Run actions can now use `$VERSION`, `$BUILD`, `$YEAR`, `$MONTH`, `$DAY` and `$TIME`, with the time-based tokens corresponding to the time at which the action was run.
-- Scene list UI overhaul. (by [@RobProductions](https://github.com/RobProductions))
-- Release list UI overhaul. (by [@RobProductions](https://github.com/RobProductions))
-- Streamline UI colors. (by [@RobProductions](https://github.com/RobProductions))
-- Replaced the 'Open SuperUnityBuild' button shown in the Inspector for settings assets with new 'Open in SuperUnityBuild' button to assign them as the active settings in the SuperUnityBuild window. (by [@RobProductions](https://github.com/RobProductions))
+- **Breaking change:** Namespaced generated `BuildConstants` class and enums, added `BuildConstants.scriptingBackend` constant.
+- Remove redundant `dataDirNameFormat` variable from Build Platforms.
+- Renamed 'Per-Platform' Build Action type to 'Per-Build' to reflect when they are run.
+- Enhanced support for string token usage in Build Action configurations. Per-Build actions have gained support for `$BASEPATH` and `$BUILDPATH`, whilst Single Run actions can now use `$VERSION`, `$BUILD`, `$YEAR`, `$MONTH`, `$DAY` and `$TIME`, with the time-based tokens corresponding to the time at which the action was run.
+- Scene list UI overhaul. (by [@RobProductions](https://github.com/RobProductions))
+- Release list UI overhaul. (by [@RobProductions](https://github.com/RobProductions))
+- Streamline UI colors. (by [@RobProductions](https://github.com/RobProductions))
+- Replaced the 'Open SuperUnityBuild' button shown in the Inspector for settings assets with new 'Open in SuperUnityBuild' button to assign them as the active settings in the SuperUnityBuild window. (by [@RobProductions](https://github.com/RobProductions))
### Fixed
-- Remove dependency on .NET Standard 2.1. (by [@RobProductions](https://github.com/RobProductions))
-- Fix scripting backend not being restored after build. (by [@RobProductions](https://github.com/RobProductions))
+- Remove dependency on .NET Standard 2.1. (by [@RobProductions](https://github.com/RobProductions))
+- Fix scripting backend not being restored after build. (by [@RobProductions](https://github.com/RobProductions))
## [6.0.1] - 2023-05-26
### Fixed
-- Fix help button text wrapping in certain situations.
-- Fix regression in 6.0.0 that broke macOS builds in Unity 2022.1+.
+- Fix help button text wrapping in certain situations.
+- Fix regression in 6.0.0 that broke macOS builds in Unity 2022.1+.
## [6.0.0] - 2023-05-16
### Added
-- Support for configuring `symbols.zip` generation on Android platform.
-- **Breaking change:** Added support for selecting scripting backend per platform. (by [@RobProductions](https://github.com/RobProductions))
-- Added documentation, changelog and license URLs to package manifest.
-- Support for selecting multiple device type values on Android platform. (by [@MatthieuG9](https://github.com/MatthieuG9))
+- Support for configuring `symbols.zip` generation on Android platform.
+- **Breaking change:** Added support for selecting scripting backend per platform. (by [@RobProductions](https://github.com/RobProductions))
+- Added documentation, changelog and license URLs to package manifest.
+- Support for selecting multiple device type values on Android platform. (by [@MatthieuG9](https://github.com/MatthieuG9))
### Changed
-- Code refactoring for improved developer experience.
-- **Breaking change:** Drop support for versions of Unity older than 2020.3 LTS.
-- Only open build output folder if at least one build has succeeded.
+- Code refactoring for improved developer experience.
+- **Breaking change:** Drop support for versions of Unity older than 2020.3 LTS.
+- Only open build output folder if at least one build has succeeded.
### Fixed
-- Correctly handle inconsistent behaviour of different Unity Editor versions when deleting elements in Inspector lists.
-- Fixed macOS Xcode project output path.
-- Fixed Build Platform names not being set before serialization.
-- iOSBuildType obsolete in U2021.2+ (by [@nickfourtimes](https://github.com/nickfourtimes))
-- Open build folder fails w/bad slashes (by [@nickfourtimes](https://github.com/nickfourtimes))
+- Correctly handle inconsistent behaviour of different Unity Editor versions when deleting elements in Inspector lists.
+- Fixed macOS Xcode project output path.
+- Fixed Build Platform names not being set before serialization.
+- iOSBuildType obsolete in U2021.2+ (by [@nickfourtimes](https://github.com/nickfourtimes))
+- Open build folder fails w/bad slashes (by [@nickfourtimes](https://github.com/nickfourtimes))
## [5.0.4] - 2022-02-03
### Fixed
-- Properly check output folder is valid before trying to open it after a build.
+- Properly check output folder is valid before trying to open it after a build.
## [5.0.3] - 2022-02-03
### Fixed
-- Fixed distribution names not displaying in build configuration list.
-- Check output folder is valid before trying to open it after a build.
+- Fixed distribution names not displaying in build configuration list.
+- Check output folder is valid before trying to open it after a build.
## [5.0.2] - 2022-01-04
### Fixed
-- Fixed incorrect label length calculation.
-- Fixed default user Build Actions path for new installations (should be `Assets/SuperUnityBuild/Editor/BuildActions`).
+- Fixed incorrect label length calculation.
+- Fixed default user Build Actions path for new installations (should be `Assets/SuperUnityBuild/Editor/BuildActions`).
## [5.0.1] - 2021-11-25
### Changed
-- Improved appearance of long UI button labels.
+- Improved appearance of long UI button labels.
## [5.0.0] - 2021-11-24
### Added
-- **Breaking change:** Added support for building Gradle projects for Android.
+- **Breaking change:** Added support for building Gradle projects for Android.
## [4.0.1] - 2021-11-24
### Fixed
-- Fixed Android target SDK version not being set.
+- Fixed Android target SDK version not being set.
## [4.0.0] - 2021-11-19
### Added
-- Added support for Split App Binary (generates APK + OBB/AAB + asset packs when enabled) for Android.
-- Added support for building Xcode projects for macOS.
-- Added support for building Visual Studio Solutions for PC.
-- Added new $VARIANTS build path token to give greater control over build path generation.
-- Added support for setting Android target SDK version.
+- Added support for Split App Binary (generates APK + OBB/AAB + asset packs when enabled) for Android.
+- Added support for building Xcode projects for macOS.
+- Added support for building Visual Studio Solutions for PC.
+- Added new $VARIANTS build path token to give greater control over build path generation.
+- Added support for setting Android target SDK version.
### Changed
-- More sensible default build path.
-- Show notes in Build Actions list view.
-- Show selected architectures and varients in Build Platforms list view.
-- **Breaking change:** Simplified $ARCHITECTURE build path token by removing variants list.
-- Remove empty build tokens from build path, rather than substituting 'None'.
-- Allow BuildConstants.cs to be moved from default location.
+- More sensible default build path.
+- Show notes in Build Actions list view.
+- Show selected architectures and varients in Build Platforms list view.
+- **Breaking change:** Simplified $ARCHITECTURE build path token by removing variants list.
+- Remove empty build tokens from build path, rather than substituting 'None'.
+- Allow BuildConstants.cs to be moved from default location.
## [3.0.0] - 2021-10-19
### Added
-- Added ability to choose between APK, split APK or Android App Bundle output for Android builds.
+- Added ability to choose between APK, split APK or Android App Bundle output for Android builds.
### Changed
-- **Breaking change:** Removed standalone 'split APKs' variant for Android in favour of new build output type variant.
-- **Breaking change:** Removed 'build system' variant for Android now that Gradle is the only supported build system.
-- Set Android architecture binary name according to build output type variant being built.
-- Stop using deprecated `BuildPipeline.BuildPlayer` overload.
+- **Breaking change:** Removed standalone 'split APKs' variant for Android in favour of new build output type variant.
+- **Breaking change:** Removed 'build system' variant for Android now that Gradle is the only supported build system.
+- Set Android architecture binary name according to build output type variant being built.
+- Stop using deprecated `BuildPipeline.BuildPlayer` overload.
## [2.2.0] - 2021-10-07
### Added
-- Added UWP platform.
+- Added UWP platform.
### Changed
-- Don't create extra output directory for iOS builds.
+- Don't create extra output directory for iOS builds.
## [2.1.0] - 2021-08-24
### Added
-- Allow certain pre-build per-platform actions to optionally configure Editor.
+- Allow certain pre-build per-platform actions to optionally configure Editor.
### Changed
-- Removed pre-Unity 2019.1 code.
+- Removed pre-Unity 2019.1 code.
## [2.0.0] - 2021-05-13
### Changed
-- Increased minimum supported Unity version to 2019.1.
+- Increased minimum supported Unity version to 2019.1.
## [1.3.0] - 2021-05-11
### Fixed
-- Fixed compilation errors on Unity 2018.1 - 2018.3. [Issue #74](https://github.com/superunitybuild/buildtool/issues/74)
+- Fixed compilation errors on Unity 2018.1 - 2018.3. [Issue #74](https://github.com/superunitybuild/buildtool/issues/74)
## [1.2.0] - 2021-05-10
### Changed
-- Revised Product Parameters UI to better denote how the various options for setting a build version work and interact with each other.
-- Deprecated `BuildSettings.productParameters.lastGeneratedVersion` property. BuildActions that previously referenced this should now use `BuildSettings.productParameters.buildVersion` instead.
-- Deprecated `BuildSettings.productParameters.version` property. This has been replaced by `BuildSettings.productParameters.versionTemplate`.
+- Revised Product Parameters UI to better denote how the various options for setting a build version work and interact with each other.
+- Deprecated `BuildSettings.productParameters.lastGeneratedVersion` property. BuildActions that previously referenced this should now use `BuildSettings.productParameters.buildVersion` instead.
+- Deprecated `BuildSettings.productParameters.version` property. This has been replaced by `BuildSettings.productParameters.versionTemplate`.
### Fixed
-- Fixed correct build version string not being available for BuildActions to use when 'Sync Version with Player Settings' option was enabled. [Issue #73](https://github.com/superunitybuild/buildtool/issues/73)
+- Fixed correct build version string not being available for BuildActions to use when 'Sync Version with Player Settings' option was enabled. [Issue #73](https://github.com/superunitybuild/buildtool/issues/73)
## [1.1.0] - 2021-04-29
### Added
-- Increment build numbers for supported platforms when generating version string. [Issue #71](https://github.com/superunitybuild/buildtool/issues/71)
-- Allow BuildActions to draw custom serialized property fields
+- Increment build numbers for supported platforms when generating version string. [Issue #71](https://github.com/superunitybuild/buildtool/issues/71)
+- Allow BuildActions to draw custom serialized property fields
### Changed
-- Use `EditorGUILayout.DropdownButton` for UI dropdown buttons
+- Use `EditorGUILayout.DropdownButton` for UI dropdown buttons
## [1.0.0] - 2021-04-15
@@ -208,74 +215,75 @@ This release includes all changes from 1.0.0 pre-releases ([1.0.0-pre.1](#100-pr
### Changed
-- No longer uneccessarily update Editor Build Settings scene list during build (behaviour introduced in 1.0.0-pre.2).
+- No longer uneccessarily update Editor Build Settings scene list during build (behaviour introduced in 1.0.0-pre.2).
## [1.0.0-pre.2] - 2021-04-13
### Added
-- Added 'macOS Architecture' variant on Unity 2020.2+ to support building for Apple Silicon. [Issue #70](https://github.com/superunitybuild/buildtool/issues/70)
-- Added ability to set release type scene list from Build Settings. [Issue #27](https://github.com/superunitybuild/buildtool/issues/27)
-- Set Build Settings scene list from release type when 'Refresh BuildConstants and Apply Defines' is clicked. [Issue #16](https://github.com/superunitybuild/buildtool/issues/16)
+- Added 'macOS Architecture' variant on Unity 2020.2+ to support building for Apple Silicon. [Issue #70](https://github.com/superunitybuild/buildtool/issues/70)
+- Added ability to set release type scene list from Build Settings. [Issue #27](https://github.com/superunitybuild/buildtool/issues/27)
+- Set Build Settings scene list from release type when 'Refresh BuildConstants and Apply Defines' is clicked. [Issue #16](https://github.com/superunitybuild/buildtool/issues/16)
### Changed
-- Made $ARCHITECTURE build path token more human-readable.
-- 'Refresh BuildConstants...' button now configures Editor environment settings in an identical way to performing a build, so you can match your Editor settings to a given build configuration.
-- **Breaking change:** Improved generation of build variant values from enum names.
-- **Breaking change:** Renamed 'OSX' build platform to 'macOS'.
-- Removed pre-Unity 2018.1 code.
+- Made $ARCHITECTURE build path token more human-readable.
+- 'Refresh BuildConstants...' button now configures Editor environment settings in an identical way to performing a build, so you can match your Editor settings to a given build configuration.
+- **Breaking change:** Improved generation of build variant values from enum names.
+- **Breaking change:** Renamed 'OSX' build platform to 'macOS'.
+- Removed pre-Unity 2018.1 code.
### Fixed
-- Only enable Android split APK variant on supported Unity versions.
-- Fixed Build Action filter UI shown for 'Single Run' actions. [Issue #69](https://github.com/superunitybuild/buildtool/issues/69)
+- Only enable Android split APK variant on supported Unity versions.
+- Fixed Build Action filter UI shown for 'Single Run' actions. [Issue #69](https://github.com/superunitybuild/buildtool/issues/69)
## [1.0.0-pre.1] - 2021-04-09
### Added
-- Added product icon.
-- Added UPM support. [PR #65](https://github.com/superunitybuild/buildtool/pull/65/commits/6b90791566a771bf189ed6272d3005b4d1933ca1)
-- Added support for setting iOS device type and SDK version. [Issue #61](https://github.com/superunitybuild/buildtool/issues/61)
-- Added support for setting Android min SDK version.
-- Added ability to select which BuildSettings to use. [PR #60](https://github.com/superunitybuild/buildtool/pull/60)
-- Added support for Android ARM64 architecture. [PR #56](https://github.com/superunitybuild/buildtool/pull/56)
-- Added support for APK splitting in Android. [PR #58](https://github.com/superunitybuild/buildtool/pull/58/commits/30c8959cd670bb68c3cd70a6728644df25055fc5)
-- Added option to sync version with PlayerSettings. [PR #53](https://github.com/superunitybuild/buildtool/pull/53)
+- Added product icon.
+- Added UPM support. [PR #65](https://github.com/superunitybuild/buildtool/pull/65/commits/6b90791566a771bf189ed6272d3005b4d1933ca1)
+- Added support for setting iOS device type and SDK version. [Issue #61](https://github.com/superunitybuild/buildtool/issues/61)
+- Added support for setting Android min SDK version.
+- Added ability to select which BuildSettings to use. [PR #60](https://github.com/superunitybuild/buildtool/pull/60)
+- Added support for Android ARM64 architecture. [PR #56](https://github.com/superunitybuild/buildtool/pull/56)
+- Added support for APK splitting in Android. [PR #58](https://github.com/superunitybuild/buildtool/pull/58/commits/30c8959cd670bb68c3cd70a6728644df25055fc5)
+- Added option to sync version with PlayerSettings. [PR #53](https://github.com/superunitybuild/buildtool/pull/53)
### Changed
-- Changed default build version format.
-- Changed default build folder and output path options. The new default build folder name `"Builds"` follows the convention documented in the _de facto_ standard [GitHub Unity .gitignore](https://github.com/github/gitignore/blob/master/Unity.gitignore).
-- Standardised code style.
-- Minor UI tweaks to improve layout and better match Editor style.
-- Improved default assets management.
-- **Breaking change:** Updated namespace.
-- Prefill company name and bundle identifier when creating new Release Types.
-- Improve handling of build options. [PR #65](https://github.com/superunitybuild/buildtool/pull/65/commits/e7cfee053255e5248784a6da96a36e89506ccf9f).
-- Updated to iOS build platform work by [@chloethompson](https://github.com/chloethompson) to support changes. [PR #52](https://github.com/superunitybuild/buildtool/pull/52)
+- Changed default build version format.
+- Changed default build folder and output path options. The new default build folder name `"Builds"` follows the convention documented in the _de facto_ standard [GitHub Unity .gitignore](https://github.com/github/gitignore/blob/master/Unity.gitignore).
+- Standardised code style.
+- Minor UI tweaks to improve layout and better match Editor style.
+- Improved default assets management.
+- **Breaking change:** Updated namespace.
+- Prefill company name and bundle identifier when creating new Release Types.
+- Improve handling of build options. [PR #65](https://github.com/superunitybuild/buildtool/pull/65/commits/e7cfee053255e5248784a6da96a36e89506ccf9f).
+- Updated to iOS build platform work by [@chloethompson](https://github.com/chloethompson) to support changes. [PR #52](https://github.com/superunitybuild/buildtool/pull/52)
### Removed
-- Removed support for Unity versions older than 2018.1.
-- Removed obsolete code in `BuildProject` and `BuildReleaseTypeDrawer`.
-- Removed obsolete Linux build architectures on Unity 2019.2+. [PR #50](https://github.com/superunitybuild/buildtool/pull/50)
+- Removed support for Unity versions older than 2018.1.
+- Removed obsolete code in `BuildProject` and `BuildReleaseTypeDrawer`.
+- Removed obsolete Linux build architectures on Unity 2019.2+. [PR #50](https://github.com/superunitybuild/buildtool/pull/50)
### Fixed
-- `BuildPlatformListDrawer` performance improvement. [Issue #66](https://github.com/superunitybuild/buildtool/issues/66)
-- **Breaking change:** Fixed platform instances not calling overridden ApplyVariant methods on build. [Issue #62](https://github.com/superunitybuild/buildtool/issues/62)
-- Fixed iOS build variant options not being applied. [Issue #61](https://github.com/superunitybuild/buildtool/issues/61)
-- Fixed typos [PR #59](https://github.com/superunitybuild/buildtool/pull/59)
-- Fixed Android device type setting being ignored. [PR #58](https://github.com/superunitybuild/buildtool/pull/58/commits/15b96e9e9777ef500b6bfa6d9db800a17dab9273)
-- Updated BuildActions wiki link. [PR #51](https://github.com/superunitybuild/buildtool/pull/51)
-- Restored pre-build player settings after build has finished. [PR #49](https://github.com/superunitybuild/buildtool/pull/49)
-- Fixed UI spacing for Unity 2019.3x [Issue #43](https://github.com/superunitybuild/buildtool/issues/43)
-- Fixed issue in Linux build name moving `binaryName` to `BuildArchitecture`. [PR #41](https://github.com/superunitybuild/buildtool/pull/41)
-- Fixed an issue where custom defines were overwrite when build was finished. [Issue #36](https://github.com/superunitybuild/buildtool/issues/36)
-
-[unreleased]: https://github.com/superunitybuild/buildtool/compare/v7.0.0...HEAD
+- `BuildPlatformListDrawer` performance improvement. [Issue #66](https://github.com/superunitybuild/buildtool/issues/66)
+- **Breaking change:** Fixed platform instances not calling overridden ApplyVariant methods on build. [Issue #62](https://github.com/superunitybuild/buildtool/issues/62)
+- Fixed iOS build variant options not being applied. [Issue #61](https://github.com/superunitybuild/buildtool/issues/61)
+- Fixed typos [PR #59](https://github.com/superunitybuild/buildtool/pull/59)
+- Fixed Android device type setting being ignored. [PR #58](https://github.com/superunitybuild/buildtool/pull/58/commits/15b96e9e9777ef500b6bfa6d9db800a17dab9273)
+- Updated BuildActions wiki link. [PR #51](https://github.com/superunitybuild/buildtool/pull/51)
+- Restored pre-build player settings after build has finished. [PR #49](https://github.com/superunitybuild/buildtool/pull/49)
+- Fixed UI spacing for Unity 2019.3x [Issue #43](https://github.com/superunitybuild/buildtool/issues/43)
+- Fixed issue in Linux build name moving `binaryName` to `BuildArchitecture`. [PR #41](https://github.com/superunitybuild/buildtool/pull/41)
+- Fixed an issue where custom defines were overwrite when build was finished. [Issue #36](https://github.com/superunitybuild/buildtool/issues/36)
+
+[unreleased]: https://github.com/superunitybuild/buildtool/compare/v8.0.0-pre.1...HEAD
+[8.0.0-pre.1]: https://github.com/superunitybuild/buildtool/compare/v8.0.0...v8.0.0-pre.1
[7.0.0]: https://github.com/superunitybuild/buildtool/compare/v6.0.1...v7.0.0
[6.0.1]: https://github.com/superunitybuild/buildtool/compare/v6.0.0...v6.0.1
[6.0.0]: https://github.com/superunitybuild/buildtool/compare/v5.0.4...v6.0.0
diff --git a/Editor/Build/Action/BuildAction.cs b/Editor/Build/Action/BuildAction.cs
index ad305e6..7a6ff7d 100644
--- a/Editor/Build/Action/BuildAction.cs
+++ b/Editor/Build/Action/BuildAction.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using UnityEditor;
using UnityEngine;
@@ -18,7 +18,7 @@ public enum ActionType
public string note = string.Empty;
public bool actionEnabled = true;
[Tooltip("BuildAction should run when 'Configure Editor Environment' button is clicked")] public bool configureEditor = false;
- public BuildFilter filter = new BuildFilter();
+ public BuildFilter filter = new();
///
/// This will be exectued once before/after all players are built.
@@ -33,7 +33,7 @@ public virtual void Execute()
public virtual void PerBuildExecute(
BuildReleaseType releaseType,
BuildPlatform platform,
- BuildArchitecture architecture,
+ BuildTarget target,
BuildScriptingBackend scriptingBackend,
BuildDistribution distribution,
DateTime buildTime, ref BuildOptions options, string configKey, string buildPath)
@@ -50,10 +50,10 @@ public static string ResolveExecuteTokens(string prototype)
return prototype;
}
- public static string ResolvePerBuildExecuteTokens(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture, BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime buildTime, string buildPath)
+ public static string ResolvePerBuildExecuteTokens(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target, BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime buildTime, string buildPath)
{
prototype = TokensUtility.ResolveBuildOutputTokens(prototype, buildPath);
- prototype = TokensUtility.ResolveBuildConfigurationTokens(prototype, releaseType, platform, architecture, scriptingBackend, distribution, buildTime);
+ prototype = TokensUtility.ResolveBuildConfigurationTokens(prototype, releaseType, platform, target, scriptingBackend, distribution, buildTime);
return prototype;
}
@@ -81,15 +81,15 @@ public void Draw(SerializedObject obj)
actionType = (ActionType)EditorGUILayout.EnumPopup("Action Type", actionType);
if (isPreBuildActionCanConfigureEditor)
- EditorGUILayout.PropertyField(obj.FindProperty("configureEditor"));
+ _ = EditorGUILayout.PropertyField(obj.FindProperty("configureEditor"));
- EditorGUILayout.PropertyField(obj.FindProperty("note"));
+ _ = EditorGUILayout.PropertyField(obj.FindProperty("note"));
// Only Per-Build actions can be filtered
if (actionType == ActionType.PerBuild)
- EditorGUILayout.PropertyField(obj.FindProperty("filter"), GUILayout.Height(0));
+ _ = EditorGUILayout.PropertyField(obj.FindProperty("filter"), GUILayout.Height(0));
- obj.ApplyModifiedProperties();
+ _ = obj.ApplyModifiedProperties();
}
public override string ToString()
@@ -109,12 +109,12 @@ protected virtual void DrawProperties(SerializedObject obj)
while (!done && prop != null)
{
- if (prop.name == "actionName" ||
- prop.name == "actionType" ||
- prop.name == "note" ||
- prop.name == "actionEnabled" ||
- prop.name == "filter" ||
- prop.name == "configureEditor")
+ if (prop.name is "actionName" or
+ "actionType" or
+ "note" or
+ "actionEnabled" or
+ "filter" or
+ "configureEditor")
{
// Already drawn these. Go to next, don't enter into object.
done = !prop.NextVisible(false);
@@ -134,7 +134,7 @@ protected virtual void DrawProperties(SerializedObject obj)
protected virtual void DrawProperty(SerializedProperty prop)
{
- EditorGUILayout.PropertyField(prop);
+ _ = EditorGUILayout.PropertyField(prop);
}
}
}
diff --git a/Editor/Build/Action/BuildFilter.cs b/Editor/Build/Action/BuildFilter.cs
index a06f47c..be17e61 100644
--- a/Editor/Build/Action/BuildFilter.cs
+++ b/Editor/Build/Action/BuildFilter.cs
@@ -1,4 +1,4 @@
-
+
using System;
namespace SuperUnityBuild.BuildTool
@@ -20,7 +20,7 @@ public enum FilterType
{
ReleaseType,
Platform,
- Architecture,
+ Target,
Distribution,
FullConfigurationKey
}
@@ -38,15 +38,15 @@ public enum FilterComparison
public FilterCondition condition;
public FilterClause[] clauses;
- public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture, BuildDistribution distribution, string configKeychain)
+ public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target, BuildDistribution distribution, string configKeychain)
{
if (clauses == null || clauses.Length == 0)
return true;
// Set default state for success based on condition type.
bool success = true;
- if (condition == FilterCondition.Any ||
- condition == FilterCondition.ExactlyOne)
+ if (condition is FilterCondition.Any or
+ FilterCondition.ExactlyOne)
{
success = false;
}
@@ -56,28 +56,28 @@ public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, Build
if (condition == FilterCondition.Any)
{
// Succeed as soon as any test evaluates true.
- success |= clauses[i].Evaluate(releaseType, platform, architecture, distribution, configKeychain);
+ success |= clauses[i].Evaluate(releaseType, platform, target, distribution, configKeychain);
if (success)
break;
}
else if (condition == FilterCondition.All)
{
// Succeed only if all tests evaluate true.
- success &= clauses[i].Evaluate(releaseType, platform, architecture, distribution, configKeychain);
+ success &= clauses[i].Evaluate(releaseType, platform, target, distribution, configKeychain);
if (!success)
break;
}
else if (condition == FilterCondition.None)
{
// Succeed only if all tests fail.
- success &= !(clauses[i].Evaluate(releaseType, platform, architecture, distribution, configKeychain));
+ success &= !clauses[i].Evaluate(releaseType, platform, target, distribution, configKeychain);
if (!success)
break;
}
else if (condition == FilterCondition.ExactlyOne)
{
// Succeed only if exactly one test evaluates true.
- if (clauses[i].Evaluate(releaseType, platform, architecture, distribution, configKeychain))
+ if (clauses[i].Evaluate(releaseType, platform, target, distribution, configKeychain))
{
if (success)
{
@@ -103,7 +103,7 @@ public class FilterClause
public FilterComparison comparison;
public string test;
- public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture, BuildDistribution distribution, string configKeychain)
+ public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target, BuildDistribution distribution, string configKeychain)
{
bool success = false;
@@ -117,8 +117,8 @@ public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, Build
case FilterType.Platform:
success = PerformTest(platform.platformName);
break;
- case FilterType.Architecture:
- success = PerformTest(architecture.name);
+ case FilterType.Target:
+ success = PerformTest(target.name);
break;
case FilterType.Distribution:
success = PerformTest(distribution.distributionName);
@@ -133,19 +133,14 @@ public bool Evaluate(BuildReleaseType releaseType, BuildPlatform platform, Build
private bool PerformTest(string targetString)
{
- switch (comparison)
+ return comparison switch
{
- case FilterComparison.Equals:
- return targetString.Equals(test, StringComparison.OrdinalIgnoreCase);
- case FilterComparison.NotEqual:
- return !(targetString.Equals(test, StringComparison.OrdinalIgnoreCase));
- case FilterComparison.Contains:
- return targetString.ToUpperInvariant().Contains(test);
- case FilterComparison.DoesNotContain:
- return !(targetString.ToUpperInvariant().Contains(test));
- default:
- return false;
- }
+ FilterComparison.Equals => targetString.Equals(test, StringComparison.OrdinalIgnoreCase),
+ FilterComparison.NotEqual => !targetString.Equals(test, StringComparison.OrdinalIgnoreCase),
+ FilterComparison.Contains => targetString.ToUpperInvariant().Contains(test),
+ FilterComparison.DoesNotContain => !targetString.ToUpperInvariant().Contains(test),
+ _ => false,
+ };
}
}
}
diff --git a/Editor/Build/BuildProject.cs b/Editor/Build/BuildProject.cs
index 408ef98..7283d6c 100644
--- a/Editor/Build/BuildProject.cs
+++ b/Editor/Build/BuildProject.cs
@@ -4,7 +4,6 @@
using System.Linq;
using System.Reflection;
using System.Text;
-using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
@@ -17,7 +16,7 @@ public static class BuildProject
private const string BUILD_TYPE = "BUILD_TYPE_";
private const string BUILD_PLATFORM = "BUILD_PLATFORM_";
- private const string BUILD_ARCH = "BUILD_ARCH_";
+ private const string BUILD_TARGET = "BUILD_TARGET_";
private const string BUILD_BACKEND = "BUILD_BACKEND_";
private const string BUILD_DIST = "BUILD_DIST_";
@@ -58,12 +57,12 @@ public static void ConfigureEditor(string configKey, BuildOptions options = Buil
true, null));
// Parse build config
- BuildSettings.projectConfigurations.ParseKeychain(configKey, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildArchitecture architecture,
+ _ = BuildSettings.projectConfigurations.ParseKeychain(configKey, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildTarget target,
out BuildScriptingBackend scriptingBackend, out BuildDistribution distribution);
string constantsFileLocation = BuildSettings.basicSettings.constantsFileLocation;
// Configure environment
- ConfigureEnvironment(releaseType, platform, architecture, scriptingBackend, distribution, configureTime, constantsFileLocation);
+ ConfigureEnvironment(releaseType, platform, target, scriptingBackend, distribution, configureTime, constantsFileLocation);
// Run pre-build actions that have opted in to configuring the Editor
BuildAction[] buildActions = BuildSettings.preBuildActions.buildActions.Where(item => item.configureEditor).ToArray();
@@ -71,17 +70,17 @@ public static void ConfigureEditor(string configKey, BuildOptions options = Buil
PerformBuildActions(
releaseType,
platform,
- architecture,
+ target,
scriptingBackend,
distribution,
configureTime, ref options, configKey, null, buildActions, "'Configure Editor' Pre-"
);
}
- public static string GenerateDefaultDefines(BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture arch,
- BuildScriptingBackend scriptingBackend, BuildDistribution dist)
+ public static string GenerateDefaultDefines(BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target,
+ BuildScriptingBackend scriptingBackend, BuildDistribution distribution)
{
- List defines = new List();
+ List defines = new();
if (releaseType != null)
defines.Add($"{BUILD_TYPE}{releaseType.typeName.SanitizeDefine()}");
@@ -89,14 +88,14 @@ public static string GenerateDefaultDefines(BuildReleaseType releaseType, BuildP
if (platform != null)
defines.Add($"{BUILD_PLATFORM}{platform.platformName.SanitizeDefine()}");
- if (arch != null)
- defines.Add($"{BUILD_ARCH}{arch.name.SanitizeDefine()}");
+ if (target != null)
+ defines.Add($"{BUILD_TARGET}{target.name.SanitizeDefine()}");
if (scriptingBackend != null)
defines.Add($"{BUILD_BACKEND}{scriptingBackend.name.SanitizeDefine()}");
- if (dist != null)
- defines.Add($"{BUILD_DIST}{dist.distributionName.SanitizeDefine()}");
+ if (distribution != null)
+ defines.Add($"{BUILD_DIST}{distribution.distributionName.SanitizeDefine()}");
if (releaseType != null && !string.IsNullOrEmpty(releaseType.customDefines))
{
@@ -124,8 +123,8 @@ public static string MergeDefines(string currentDefines, string unityBuildDefine
public static string StripBuildDefines(string defineString)
{
- List defines = new List(defineString.Split(';'));
- List releaseTypes = new List(BuildSettings.releaseTypeList.releaseTypes);
+ List defines = new(defineString.Split(';'));
+ List releaseTypes = new(BuildSettings.releaseTypeList.releaseTypes);
for (int i = 0; i < defines.Count; i++)
{
@@ -134,7 +133,7 @@ public static string StripBuildDefines(string defineString)
// Check for default define strings.
if (testString.StartsWith(BUILD_TYPE) ||
testString.StartsWith(BUILD_PLATFORM) ||
- testString.StartsWith(BUILD_ARCH) ||
+ testString.StartsWith(BUILD_TARGET) ||
testString.StartsWith(BUILD_BACKEND) ||
testString.StartsWith(BUILD_DIST))
{
@@ -144,7 +143,7 @@ public static string StripBuildDefines(string defineString)
}
// Check for custom define strings.
- foreach (var rt in releaseTypes)
+ foreach (BuildReleaseType rt in releaseTypes)
{
if (rt.customDefines.Contains(testString))
{
@@ -175,17 +174,17 @@ public static string GenerateVersionString(ProductParameters productParameters,
PlayerSettings.bundleVersion = version;
// Increment build numbers for supported platforms
- PlayerSettings.Android.bundleVersionCode = PlayerSettings.Android.bundleVersionCode + 1;
+ PlayerSettings.Android.bundleVersionCode++;
PlayerSettings.iOS.buildNumber = $"{int.Parse(PlayerSettings.iOS.buildNumber) + 1}";
PlayerSettings.macOS.buildNumber = $"{int.Parse(PlayerSettings.macOS.buildNumber) + 1}";
return version;
}
- public static string GenerateBuildPath(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture arch,
- BuildScriptingBackend scriptingBackend, BuildDistribution dist, DateTime buildTime)
+ public static string GenerateBuildPath(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target,
+ BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime buildTime)
{
- string resolvedPath = TokensUtility.ResolveBuildConfigurationTokens(prototype, releaseType, platform, arch, scriptingBackend, dist, buildTime);
+ string resolvedPath = TokensUtility.ResolveBuildConfigurationTokens(prototype, releaseType, platform, target, scriptingBackend, distribution, buildTime);
string buildPath = Path.Combine(BuildSettings.basicSettings.baseBuildFolder, resolvedPath);
buildPath = Path.GetFullPath(buildPath).TrimEnd('\\').TrimEnd('/');
@@ -195,12 +194,12 @@ public static string GenerateBuildPath(string prototype, BuildReleaseType releas
public static void SetEditorBuildSettingsScenes(BuildReleaseType releaseType)
{
// Create EditorBuildSettingsScene instances from release type scene list
- List editorBuildSettingsScenes = new List();
+ List editorBuildSettingsScenes = new();
- var releaseScenes = releaseType.sceneList.releaseScenes;
+ List releaseScenes = releaseType.sceneList.releaseScenes;
for (int i = 0; i < releaseScenes.Count; i++)
{
- var thisScene = releaseScenes[i];
+ SceneList.Scene thisScene = releaseScenes[i];
editorBuildSettingsScenes.Add(
new EditorBuildSettingsScene(releaseType.sceneList.SceneGUIDToPath(thisScene.fileGUID),
thisScene.sceneActive));
@@ -214,18 +213,22 @@ public static void SetEditorBuildSettingsScenes(BuildReleaseType releaseType)
#region Private Methods
- private static void ConfigureEnvironment(BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture,
+ private static void ConfigureEnvironment(BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target,
BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime buildTime, string constantsFileLocation)
{
// Switch to target build platform
- EditorUserBuildSettings.SwitchActiveBuildTarget(platform.targetGroup, architecture.target);
+ _ = EditorUserBuildSettings.SwitchActiveBuildTarget(platform.targetGroup, target.type);
+
+ // Apply standalone build subtarget, if necessary
+ if (target.isStandalone)
+ EditorUserBuildSettings.standaloneBuildSubtarget = (StandaloneBuildSubtarget)target.subtarget;
// Adjust scripting backend
PlayerSettings.SetScriptingBackend(platform.targetGroup, scriptingBackend.scriptingImplementation);
// Apply defines
string preBuildDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(platform.targetGroup);
- string buildDefines = GenerateDefaultDefines(releaseType, platform, architecture, scriptingBackend, distribution);
+ string buildDefines = GenerateDefaultDefines(releaseType, platform, target, scriptingBackend, distribution);
buildDefines = MergeDefines(preBuildDefines, buildDefines);
PlayerSettings.SetScriptingDefineSymbolsForGroup(platform.targetGroup, buildDefines);
@@ -242,7 +245,7 @@ private static void ConfigureEnvironment(BuildReleaseType releaseType, BuildPlat
// Generate BuildConstants
BuildConstantsGenerator.Generate(buildTime, constantsFileLocation, BuildSettings.productParameters.buildVersion,
- BuildSettings.productParameters.buildCounter, releaseType, platform, scriptingBackend, architecture, distribution);
+ BuildSettings.productParameters.buildCounter, releaseType, platform, scriptingBackend, target, distribution);
// Refresh scene list to make sure nothing has been deleted or moved
releaseType.sceneList.Refresh();
@@ -271,9 +274,9 @@ private static void PerformBuild(string[] buildConfigs, BuildOptions options = B
// Parse build config and perform build.
string notification = string.Format("Building ({0}/{1}): ", i + 1, buildConfigs.Length);
string constantsFileLocation = BuildSettings.basicSettings.constantsFileLocation;
- BuildSettings.projectConfigurations.ParseKeychain(configKey, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildArchitecture arch,
- out BuildScriptingBackend scriptingBackend, out BuildDistribution dist);
- bool success = BuildPlayer(notification, releaseType, platform, arch, scriptingBackend, dist, buildTime, options,
+ _ = BuildSettings.projectConfigurations.ParseKeychain(configKey, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildTarget target,
+ out BuildScriptingBackend scriptingBackend, out BuildDistribution distribution);
+ bool success = BuildPlayer(notification, releaseType, platform, target, scriptingBackend, distribution, buildTime, options,
constantsFileLocation, configKey);
if (success)
@@ -292,24 +295,17 @@ private static void PerformBuild(string[] buildConfigs, BuildOptions options = B
}
// Report success/failure.
- StringBuilder sb = new StringBuilder();
-
- if (failCount == 0)
- {
- sb.AppendFormat("{0} successful build{1}. No failures. ✔️",
- successCount, successCount > 1 ? "s" : "");
- }
- else if (successCount == 0)
- {
- sb.AppendFormat("No successful builds. {0} failure{1}. ✖️",
- failCount, failCount > 1 ? "s" : "");
- }
- else
- {
- sb.AppendFormat("{0} successful build{1}. {2} failure{3}.",
- successCount, successCount > 1 ? "s" : "",
- failCount, failCount > 1 ? "s" : "");
- }
+ StringBuilder sb = new();
+
+ _ = failCount == 0
+ ? sb.AppendFormat("{0} successful build{1}. No failures. ✔️",
+ successCount, successCount > 1 ? "s" : "")
+ : successCount == 0
+ ? sb.AppendFormat("No successful builds. {0} failure{1}. ✖️",
+ failCount, failCount > 1 ? "s" : "")
+ : sb.AppendFormat("{0} successful build{1}. {2} failure{3}.",
+ successCount, successCount > 1 ? "s" : "",
+ failCount, failCount > 1 ? "s" : "");
BuildNotificationList.instance.AddNotification(new BuildNotification(
BuildNotification.Category.Notification,
@@ -323,7 +319,7 @@ private static void PerformBuild(string[] buildConfigs, BuildOptions options = B
try
{
- System.Diagnostics.Process.Start(outputFolder);
+ _ = System.Diagnostics.Process.Start(outputFolder);
}
catch
{
@@ -332,7 +328,7 @@ private static void PerformBuild(string[] buildConfigs, BuildOptions options = B
}
}
- private static bool BuildPlayer(string notification, BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture,
+ private static bool BuildPlayer(string notification, BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target,
BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime buildTime, BuildOptions options,
string constantsFileLocation, string configKey)
{
@@ -351,19 +347,19 @@ private static bool BuildPlayer(string notification, BuildReleaseType releaseTyp
ScriptingImplementation preBuildImplementation = PlayerSettings.GetScriptingBackend(platform.targetGroup);
// Configure environment settings to match the build configuration
- ConfigureEnvironment(releaseType, platform, architecture, scriptingBackend, distribution, buildTime, constantsFileLocation);
+ ConfigureEnvironment(releaseType, platform, target, scriptingBackend, distribution, buildTime, constantsFileLocation);
// Generate build path
- string buildPath = GenerateBuildPath(BuildSettings.basicSettings.buildPath, releaseType, platform, architecture, scriptingBackend, distribution, buildTime);
+ string buildPath = GenerateBuildPath(BuildSettings.basicSettings.buildPath, releaseType, platform, target, scriptingBackend, distribution, buildTime);
string finalBuildName = releaseType.productName;
- if(!releaseType.syncAppNameWithProduct)
+ if (!releaseType.syncAppNameWithProduct)
{
finalBuildName = releaseType.appBuildName;
}
- string binName = string.Format(architecture.binaryNameFormat, finalBuildName.SanitizeFileName());
+ string binName = string.Format(target.binaryNameFormat, finalBuildName.SanitizeFileName());
// Pre-build actions
- PerformPreBuild(releaseType, platform, architecture, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
+ PerformPreBuild(releaseType, platform, target, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
// Report build starting
BuildNotificationList.instance.AddNotification(new BuildNotification(
@@ -375,17 +371,22 @@ private static bool BuildPlayer(string notification, BuildReleaseType releaseTyp
AssetDatabase.SaveAssets();
// Build player
- FileUtil.DeleteFileOrDirectory(buildPath);
+ _ = FileUtil.DeleteFileOrDirectory(buildPath);
string error = "";
-
- BuildReport buildReport = BuildPipeline.BuildPlayer(new BuildPlayerOptions
+ BuildPlayerOptions playerOptions = new()
{
locationPathName = Path.Combine(buildPath, binName),
options = options,
scenes = releaseType.sceneList.GetActiveSceneFileList(),
- target = architecture.target
- });
+ target = target.type
+ };
+
+ // Apply standalone build subtarget, if necessary
+ if (target.isStandalone)
+ playerOptions.subtarget = target.subtarget;
+
+ BuildReport buildReport = BuildPipeline.BuildPlayer(playerOptions);
if (buildReport.summary.result == BuildResult.Failed)
{
@@ -403,7 +404,7 @@ private static bool BuildPlayer(string notification, BuildReleaseType releaseTyp
}
// Post-build actions
- PerformPostBuild(releaseType, platform, architecture, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
+ PerformPostBuild(releaseType, platform, target, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
// Restore pre-build environment settings
PlayerSettings.SetScriptingDefineSymbolsForGroup(platform.targetGroup, preBuildDefines);
@@ -425,7 +426,7 @@ private static void PerformPreBuild(out DateTime buildTime)
// Generate version string.
if (BuildSettings.productParameters.autoGenerate)
{
- GenerateVersionString(BuildSettings.productParameters, buildTime);
+ _ = GenerateVersionString(BuildSettings.productParameters, buildTime);
}
// Run pre-build actions.
@@ -435,7 +436,7 @@ private static void PerformPreBuild(out DateTime buildTime)
private static void PerformPreBuild(
BuildReleaseType releaseType,
BuildPlatform platform,
- BuildArchitecture architecture,
+ BuildTarget target,
BuildScriptingBackend scriptingBackend,
BuildDistribution distribution,
DateTime buildTime, ref BuildOptions options, string configKey, string buildPath)
@@ -443,7 +444,7 @@ private static void PerformPreBuild(
PerformBuildActions(
releaseType,
platform,
- architecture,
+ target,
scriptingBackend,
distribution,
buildTime, ref options, configKey, buildPath, BuildSettings.preBuildActions.buildActions, "Pre-"
@@ -458,7 +459,7 @@ private static void PerformPostBuild()
private static void PerformPostBuild(
BuildReleaseType releaseType,
BuildPlatform platform,
- BuildArchitecture architecture,
+ BuildTarget target,
BuildScriptingBackend scriptingBackend,
BuildDistribution distribution,
DateTime buildTime, ref BuildOptions options, string configKey, string buildPath)
@@ -466,7 +467,7 @@ private static void PerformPostBuild(
PerformBuildActions(
releaseType,
platform,
- architecture,
+ target,
scriptingBackend,
distribution,
buildTime, ref options, configKey, buildPath, BuildSettings.postBuildActions.buildActions, "Post-"
@@ -510,7 +511,7 @@ private static void PerformBuildActions(BuildAction[] buildActions, string notif
private static void PerformBuildActions(
BuildReleaseType releaseType,
BuildPlatform platform,
- BuildArchitecture architecture,
+ BuildTarget target,
BuildScriptingBackend scriptingBackend,
BuildDistribution distribution,
DateTime buildTime, ref BuildOptions options, string configKey, string buildPath, BuildAction[] buildActions, string notificationLabel)
@@ -527,14 +528,14 @@ private static void PerformBuildActions(
if (m.GetBaseDefinition().DeclaringType != m.DeclaringType && action.actionType == BuildAction.ActionType.PerBuild)
{
// Check build filter and execute if true.
- if (action.filter == null || action.filter.Evaluate(releaseType, platform, architecture, distribution, configKey) && action.actionEnabled)
+ if (action.filter == null || (action.filter.Evaluate(releaseType, platform, target, distribution, configKey) && action.actionEnabled))
{
BuildNotificationList.instance.AddNotification(new BuildNotification(
BuildNotification.Category.Notification,
string.Format("Performing {0}Build Action ({1}/{2}):", notificationLabel, i + 1, buildActions.Length), string.Format("{0}: {1}", action, configKey),
true, null));
- action.PerBuildExecute(releaseType, platform, architecture, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
+ action.PerBuildExecute(releaseType, platform, target, scriptingBackend, distribution, buildTime, ref options, configKey, buildPath);
}
else
{
diff --git a/Editor/Build/Platform/BuildAndroid.cs b/Editor/Build/Platform/BuildAndroid.cs
index 8e607d4..88d2f3a 100644
--- a/Editor/Build/Platform/BuildAndroid.cs
+++ b/Editor/Build/Platform/BuildAndroid.cs
@@ -11,7 +11,8 @@ public class BuildAndroid : BuildPlatform
#region Constants
private const string _name = "Android";
- private readonly Dictionary _binaryNameFormats = new Dictionary{
+ private readonly Dictionary _binaryNameFormats = new()
+ {
{BinaryType.APK, "{0}.apk"},
{BinaryType.SplitAPK, "{0}"},
{BinaryType.AAB, "{0}.aab"},
@@ -19,10 +20,8 @@ public class BuildAndroid : BuildPlatform
private const BuildTargetGroup _targetGroup = BuildTargetGroup.Android;
private const string _apkExpansionFilesTypeVariantId = "APK Expansion Type";
- private const string _buildOutputTypeVariantId = "Build Output";
private const string _binaryTypeVariantId = "Binary Type";
private const string _createSymbolsVariantId = "Create symbols.zip";
- private const string _deviceTypeVariantId = "Device Type";
private const string _textureCompressionVariantId = "Texture Compression";
private const string _minSdkVersionVariantId = "Min SDK Version";
private const string _targetSdkVersionVariantId = "Target SDK Version";
@@ -61,10 +60,10 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.Android, "Android", true, _binaryNameFormats[0])
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.Android, PlayerName, true, _binaryNameFormats[0])
};
}
@@ -72,8 +71,8 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.Mono2x, false),
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, true),
+ new(ScriptingImplementation.Mono2x, false),
+ new(ScriptingImplementation.IL2CPP, true),
};
}
@@ -83,33 +82,28 @@ public override void Init()
.Select(i => i.Replace(_androidApiLevelEnumPrefix, ""))
.ToArray();
- string[] createSymbolsOptions =
-#if UNITY_2021_1_OR_NEWER
- EnumNamesToArray().ToArray();
-#else
- new string[] { "Disabled", "Enabled" };
-#endif
+ string[] createSymbolsOptions = EnumNamesToArray().ToArray();
variants = new BuildVariant[] {
- new BuildVariant(_deviceTypeVariantId, EnumNamesToArray()
+ new(ArchitectureVariantKey, EnumNamesToArray()
.Skip(1)
.SkipLast()
.ToArray(),
- 0, true),
- new BuildVariant(_textureCompressionVariantId, EnumNamesToArray(), 0),
- new BuildVariant(_buildOutputTypeVariantId, EnumNamesToArray(true), 0),
- new BuildVariant(_binaryTypeVariantId, EnumNamesToArray(true), 0),
- new BuildVariant(_apkExpansionFilesTypeVariantId, EnumNamesToArray(true), 0),
- new BuildVariant(_minSdkVersionVariantId, androidSdkVersionStrings, 0),
- new BuildVariant(_targetSdkVersionVariantId, androidSdkVersionStrings, 0),
- new BuildVariant(_createSymbolsVariantId, createSymbolsOptions, 0),
+ 3, true),
+ new(_textureCompressionVariantId, EnumNamesToArray(), 0),
+ new(BuildOutputVariantKey, EnumNamesToArray(true), 0),
+ new(_binaryTypeVariantId, EnumNamesToArray(true), 0),
+ new(_apkExpansionFilesTypeVariantId, EnumNamesToArray(true), 0),
+ new(_minSdkVersionVariantId, androidSdkVersionStrings, 0),
+ new(_targetSdkVersionVariantId, androidSdkVersionStrings, 0),
+ new(_createSymbolsVariantId, createSymbolsOptions, 0),
};
}
}
public override void ApplyVariant()
{
- foreach (var variantOption in variants)
+ foreach (BuildVariant variantOption in variants)
{
string key = variantOption.variantKey;
@@ -118,18 +112,18 @@ public override void ApplyVariant()
case _apkExpansionFilesTypeVariantId:
SetApkExpansionFilesType(key);
break;
+ case ArchitectureVariantKey:
+ SetArchitecture(key);
+ break;
case _binaryTypeVariantId:
SetBinaryType(key);
break;
- case _buildOutputTypeVariantId:
- SetBuildOutputType(key);
+ case BuildOutputVariantKey:
+ SetBuildOutput(key);
break;
case _createSymbolsVariantId:
SetCreateSymbols(key);
break;
- case _deviceTypeVariantId:
- SetDeviceType(key);
- break;
case _textureCompressionVariantId:
SetTextureCompression(key);
break;
@@ -159,6 +153,11 @@ private void SetApkExpansionFilesType(string key)
#endif
}
+ private void SetArchitecture(string key)
+ {
+ PlayerSettings.Android.targetArchitectures = EnumFlagValueFromKey(key);
+ }
+
private void SetBinaryType(string key)
{
BinaryType binaryType = EnumValueFromKey(key);
@@ -169,10 +168,10 @@ private void SetBinaryType(string key)
EditorUserBuildSettings.buildAppBundle = buildAppBundle;
PlayerSettings.Android.buildApkPerCpuArchitecture = splitAPK && !buildAppBundle;
- architectures[0].binaryNameFormat = _binaryNameFormats[binaryType];
+ targets[0].binaryNameFormat = _binaryNameFormats[binaryType];
}
- private void SetBuildOutputType(string key)
+ private void SetBuildOutput(string key)
{
BuildOutputType outputType = EnumValueFromKey(key);
@@ -182,21 +181,12 @@ private void SetBuildOutputType(string key)
// Override binary name format set by Binary Type variant if exporting Gradle project
if (exportProject)
- architectures[0].binaryNameFormat = "{0}";
+ targets[0].binaryNameFormat = "{0}";
}
private void SetCreateSymbols(string key)
{
-#if UNITY_2021_1_OR_NEWER
EditorUserBuildSettings.androidCreateSymbols = EnumValueFromKey(key);
-#else
- EditorUserBuildSettings.androidCreateSymbolsZip = key != "Disabled";
-#endif
- }
-
- private void SetDeviceType(string key)
- {
- PlayerSettings.Android.targetArchitectures = EnumFlagValueFromKey(key);
}
private void SetMinSdkVersion(string key)
diff --git a/Editor/Build/Platform/BuildArchitecture.cs b/Editor/Build/Platform/BuildArchitecture.cs
deleted file mode 100644
index 85cd6c3..0000000
--- a/Editor/Build/Platform/BuildArchitecture.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using UnityEditor;
-
-namespace SuperUnityBuild.BuildTool
-{
- [Serializable]
- public class BuildArchitecture
- {
- public BuildTarget target;
- public string name;
- public bool enabled;
- public string binaryNameFormat;
-
- public BuildArchitecture(BuildTarget target, string name, bool enabled, string binaryNameFormat)
- {
- this.target = target;
- this.name = name;
- this.enabled = enabled;
- this.binaryNameFormat = binaryNameFormat;
- }
-
- public override string ToString()
- {
- return name;
- }
- }
-}
diff --git a/Editor/Build/Platform/BuildArchitecture.cs.meta b/Editor/Build/Platform/BuildArchitecture.cs.meta
deleted file mode 100644
index 801f8fa..0000000
--- a/Editor/Build/Platform/BuildArchitecture.cs.meta
+++ /dev/null
@@ -1,12 +0,0 @@
-fileFormatVersion: 2
-guid: 6fd48d943b085a04788425235928448d
-timeCreated: 1463225904
-licenseType: Pro
-MonoImporter:
- serializedVersion: 2
- defaultReferences: []
- executionOrder: 0
- icon: {instanceID: 0}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Editor/Build/Platform/BuildIOS.cs b/Editor/Build/Platform/BuildIOS.cs
index 316446e..5caa6fe 100644
--- a/Editor/Build/Platform/BuildIOS.cs
+++ b/Editor/Build/Platform/BuildIOS.cs
@@ -14,7 +14,6 @@ public class BuildIOS : BuildPlatform
private const string _deviceTypeVariantId = "Device Type";
private const string _sdkVersionVariantId = "Target SDK";
- private const string _buildConfigTypeVariantId = "Build Type";
#endregion
@@ -29,10 +28,10 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.iOS, "iOS", true, _binaryNameFormat)
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.iOS, PlayerName, true, _binaryNameFormat)
};
}
@@ -40,34 +39,30 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, true),
+ new(ScriptingImplementation.IL2CPP, true),
};
}
if (variants == null || variants.Length == 0)
{
variants = new BuildVariant[] {
- new BuildVariant(_deviceTypeVariantId, EnumNamesToArray(), 0),
- new BuildVariant(_sdkVersionVariantId, EnumNamesToArray(true), 0),
- #if UNITY_2021_2_OR_NEWER
- new BuildVariant(_buildConfigTypeVariantId, EnumNamesToArray(), 0),
- #else
- new BuildVariant(_buildConfigTypeVariantId, EnumNamesToArray(), 0),
- #endif
+ new(_deviceTypeVariantId, EnumNamesToArray(), 0),
+ new(_sdkVersionVariantId, EnumNamesToArray(true), 0),
+ new(BuildTypeVariantKey, EnumNamesToArray(), 0),
};
}
}
public override void ApplyVariant()
{
- foreach (var variantOption in variants)
+ foreach (BuildVariant variantOption in variants)
{
string key = variantOption.variantKey;
switch (variantOption.variantName)
{
- case _buildConfigTypeVariantId:
- SetBuildConfigType(key);
+ case BuildTypeVariantKey:
+ SetBuildType(key);
break;
case _deviceTypeVariantId:
SetDeviceType(key);
@@ -79,13 +74,9 @@ public override void ApplyVariant()
}
}
- private void SetBuildConfigType(string key)
+ private void SetBuildType(string key)
{
-#if UNITY_2021_2_OR_NEWER
EditorUserBuildSettings.iOSXcodeBuildConfig = EnumValueFromKey(key);
-#else
- EditorUserBuildSettings.iOSBuildConfigType = EnumValueFromKey(key);
-#endif
}
private void SetDeviceType(string key)
diff --git a/Editor/Build/Platform/BuildLinux.cs b/Editor/Build/Platform/BuildLinux.cs
index 42acdc1..27df465 100644
--- a/Editor/Build/Platform/BuildLinux.cs
+++ b/Editor/Build/Platform/BuildLinux.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using UnityEditor;
namespace SuperUnityBuild.BuildTool
@@ -9,10 +9,12 @@ public class BuildLinux : BuildPlatform
#region Constants
private const string _name = "Linux";
+ private readonly string _binaryNameFormat = "{0}.x86_64";
private const BuildTargetGroup _targetGroup = BuildTargetGroup.Standalone;
#endregion
+
public BuildLinux()
{
enabled = false;
@@ -24,10 +26,11 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.StandaloneLinux64, "Linux x64", true, "{0}.x86_64")
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.StandaloneLinux64, PlayerName, true, _binaryNameFormat),
+ new(UnityEditor.BuildTarget.StandaloneLinux64, ServerName, false, _binaryNameFormat, (int)StandaloneBuildSubtarget.Server),
};
}
@@ -35,8 +38,8 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.Mono2x, true),
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, false),
+ new(ScriptingImplementation.Mono2x, true),
+ new(ScriptingImplementation.IL2CPP, false),
};
}
diff --git a/Editor/Build/Platform/BuildOSX.cs b/Editor/Build/Platform/BuildMac.cs
similarity index 54%
rename from Editor/Build/Platform/BuildOSX.cs
rename to Editor/Build/Platform/BuildMac.cs
index 2979d83..bdc5818 100644
--- a/Editor/Build/Platform/BuildOSX.cs
+++ b/Editor/Build/Platform/BuildMac.cs
@@ -5,19 +5,21 @@
namespace SuperUnityBuild.BuildTool
{
[Serializable]
- public class BuildOSX : BuildPlatform
+ public class BuildMac : BuildPlatform
{
#region Constants
private const string _name = "macOS";
- private Dictionary _binaryNameFormats = new Dictionary{
+ private readonly Dictionary _binaryNameFormats = new()
+ {
{BuildOutputType.App, "{0}.app"},
{BuildOutputType.XcodeProject, "{0}"},
};
private const BuildTargetGroup _targetGroup = BuildTargetGroup.Standalone;
- private const string _buildOutputTypeVariantId = "Build Output";
- private const string _macOSArchitectureVariantId = "macOS Architecture";
+ private const string ArchitectureIntel64BitId = "Intel 64-bit";
+ private const string ArchitectureAppleSiliconId = "Apple silicon";
+ private const string ArchitectureUniversalId = "Intel 64-bit + Apple silicon";
private enum BuildOutputType
{
@@ -36,7 +38,7 @@ private enum MacOSArchitecture
#endregion
- public BuildOSX()
+ public BuildMac()
{
enabled = false;
Init();
@@ -47,10 +49,11 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.StandaloneOSX, "macOS", true, _binaryNameFormats[0]),
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.StandaloneOSX, PlayerName, true, _binaryNameFormats[0]),
+ new(UnityEditor.BuildTarget.StandaloneOSX, ServerName, false, _binaryNameFormats[0], (int)StandaloneBuildSubtarget.Server),
};
}
@@ -58,51 +61,48 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.Mono2x, true),
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, false),
+ new(ScriptingImplementation.Mono2x, true),
+ new(ScriptingImplementation.IL2CPP, false),
};
}
if (variants == null || variants.Length == 0)
{
variants = new BuildVariant[] {
- new BuildVariant(_macOSArchitectureVariantId, EnumNamesToArray(true), 0),
- new BuildVariant(_buildOutputTypeVariantId, EnumNamesToArray(true), 0)
+ new(ArchitectureVariantKey, new string[] { ArchitectureIntel64BitId, ArchitectureAppleSiliconId, ArchitectureUniversalId }, 0),
+ new(BuildOutputVariantKey, EnumNamesToArray(true), 0)
};
}
}
public override void ApplyVariant()
{
- foreach (var variantOption in variants)
+ foreach (BuildVariant variantOption in variants)
{
string key = variantOption.variantKey;
switch (variantOption.variantName)
{
- case _buildOutputTypeVariantId:
- SetBuildOutputType(key);
+ case ArchitectureVariantKey:
+ SetArchitecture(key);
break;
- case _macOSArchitectureVariantId:
- SetMacOSArchitecture(key);
+ case BuildOutputVariantKey:
+ SetBuildOutput(key);
break;
}
}
}
- private void SetBuildOutputType(string key)
+ private void SetArchitecture(string key)
{
- BuildOutputType outputType = EnumValueFromKey(key);
-
-#if UNITY_STANDALONE_OSX
- UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = outputType == BuildOutputType.XcodeProject;
-#endif
+ MacOSArchitecture architecture = key switch
+ {
+ ArchitectureIntel64BitId => MacOSArchitecture.Intelx64,
+ ArchitectureAppleSiliconId => MacOSArchitecture.AppleSilicon,
+ ArchitectureUniversalId or _ => MacOSArchitecture.Universal,
+ };
- architectures[0].binaryNameFormat = _binaryNameFormats[outputType];
- }
- private void SetMacOSArchitecture(string key)
- {
#if UNITY_STANDALONE_OSX
UnityEditor.OSXStandalone.UserBuildSettings.architecture =
#if UNITY_2022_1_OR_NEWER
@@ -110,8 +110,19 @@ private void SetMacOSArchitecture(string key)
#else
(UnityEditor.OSXStandalone.MacOSArchitecture)
#endif
- EnumValueFromKey(key);
+ architecture;
#endif
}
+
+ private void SetBuildOutput(string key)
+ {
+ BuildOutputType outputType = EnumValueFromKey(key);
+
+#if UNITY_STANDALONE_OSX
+ UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = outputType == BuildOutputType.XcodeProject;
+#endif
+
+ targets[0].binaryNameFormat = _binaryNameFormats[outputType];
+ }
}
}
diff --git a/Editor/Build/Platform/BuildOSX.cs.meta b/Editor/Build/Platform/BuildMac.cs.meta
similarity index 100%
rename from Editor/Build/Platform/BuildOSX.cs.meta
rename to Editor/Build/Platform/BuildMac.cs.meta
diff --git a/Editor/Build/Platform/BuildPC.cs b/Editor/Build/Platform/BuildPC.cs
deleted file mode 100644
index d22b2b4..0000000
--- a/Editor/Build/Platform/BuildPC.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-using System.Collections.Generic;
-using UnityEditor;
-
-namespace SuperUnityBuild.BuildTool
-{
- [Serializable]
- public class BuildPC : BuildPlatform
- {
- #region Constants
-
- private const string _name = "PC";
- private Dictionary _binaryNameFormats = new Dictionary{
- {BuildOutputType.App, "{0}.exe"},
- {BuildOutputType.VisualStudioSolution, "{0}.sln"},
- };
- private const BuildTargetGroup _targetGroup = BuildTargetGroup.Standalone;
-
- private const string _buildOutputTypeVariantId = "Build Output";
-
- private enum BuildOutputType
- {
- App,
- VisualStudioSolution
- }
-
- #endregion
-
- public BuildPC()
- {
- enabled = false;
- Init();
- }
-
- public override void Init()
- {
- platformName = _name;
- targetGroup = _targetGroup;
-
- if (architectures == null || architectures.Length == 0)
- {
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.StandaloneWindows, "Windows x86", true, _binaryNameFormats[0]),
- new BuildArchitecture(BuildTarget.StandaloneWindows64, "Windows x64", false, _binaryNameFormats[0])
- };
- }
-
- if (scriptingBackends == null || scriptingBackends.Length == 0)
- {
- scriptingBackends = new BuildScriptingBackend[]
- {
- new BuildScriptingBackend(ScriptingImplementation.Mono2x, true),
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, false),
- };
- }
-
- if (variants == null || variants.Length == 0)
- {
- variants = new BuildVariant[] {
- new BuildVariant(_buildOutputTypeVariantId, EnumNamesToArray(true), 0)
- };
- }
- }
-
- public override void ApplyVariant()
- {
- foreach (var variantOption in variants)
- {
- string key = variantOption.variantKey;
-
- switch (variantOption.variantName)
- {
- case _buildOutputTypeVariantId:
- SetBuildOutputType(key);
- break;
- }
- }
- }
-
- private void SetBuildOutputType(string key)
- {
- BuildOutputType outputType = EnumValueFromKey(key);
-
-#if UNITY_STANDALONE_WIN
- UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = outputType == BuildOutputType.VisualStudioSolution;
-#endif
-
- architectures[0].binaryNameFormat = _binaryNameFormats[outputType];
- }
- }
-}
diff --git a/Editor/Build/Platform/BuildPlatform.cs b/Editor/Build/Platform/BuildPlatform.cs
index 54b0c9e..db625dd 100644
--- a/Editor/Build/Platform/BuildPlatform.cs
+++ b/Editor/Build/Platform/BuildPlatform.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
@@ -9,9 +9,20 @@ namespace SuperUnityBuild.BuildTool
[Serializable]
public class BuildPlatform : ScriptableObject
{
+ #region Constants
+
+ protected const string PlayerName = "Player";
+ protected const string ServerName = "Dedicated Server";
+
+ protected const string ArchitectureVariantKey = "Architecture";
+ protected const string BuildOutputVariantKey = "Build Output";
+ protected const string BuildTypeVariantKey = "Build Type";
+
+ #endregion
+
public bool enabled = false;
- public BuildDistributionList distributionList = new BuildDistributionList();
- public BuildArchitecture[] architectures = new BuildArchitecture[0];
+ public BuildDistributionList distributionList = new();
+ public BuildTarget[] targets = new BuildTarget[0];
public BuildVariant[] variants = new BuildVariant[0];
public BuildScriptingBackend[] scriptingBackends = new BuildScriptingBackend[0];
@@ -28,17 +39,17 @@ public virtual void ApplyVariant()
#region Public Properties
- public bool atLeastOneArch
+ public bool atLeastOneTarget
{
get
{
- bool atLeastOneArch = false;
- for (int i = 0; i < architectures.Length && !atLeastOneArch; i++)
+ bool atLeastOneTarget = false;
+ for (int i = 0; i < targets.Length && !atLeastOneTarget; i++)
{
- atLeastOneArch |= architectures[i].enabled;
+ atLeastOneTarget |= targets[i].enabled;
}
- return atLeastOneArch;
+ return atLeastOneTarget;
}
}
@@ -75,6 +86,8 @@ public bool atLeastOneDistribution
}
}
+ public virtual bool hasAdditionalOptions => false;
+
public string variantKey
{
get
@@ -84,13 +97,13 @@ public string variantKey
// Build key string.
if (variants != null && variants.Length > 0)
{
- foreach (var variant in variants)
+ foreach (BuildVariant variant in variants)
retVal += variant.variantKey + ",";
}
// Remove trailing delimiter.
if (retVal.Length > 0)
- retVal = retVal.Substring(0, retVal.Length - 1);
+ retVal = retVal[..^1];
return retVal;
}
@@ -100,21 +113,21 @@ public string variantKey
public void Draw(SerializedObject obj)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
- SerializedProperty archList = obj.FindProperty("architectures");
+ SerializedProperty targets = obj.FindProperty("targets");
- if (archList.arraySize > 1)
+ if (targets.arraySize > 1)
{
- GUILayout.Label("Architectures", UnityBuildGUIUtility.midHeaderStyle);
- for (int i = 0; i < archList.arraySize; i++)
+ GUILayout.Label("Targets", UnityBuildGUIUtility.midHeaderStyle);
+ for (int i = 0; i < targets.arraySize; i++)
{
- SerializedProperty archProperty = archList.GetArrayElementAtIndex(i);
- SerializedProperty archName = archProperty.FindPropertyRelative("name");
- SerializedProperty archEnabled = archProperty.FindPropertyRelative("enabled");
+ SerializedProperty targetProperty = targets.GetArrayElementAtIndex(i);
+ SerializedProperty targetName = targetProperty.FindPropertyRelative("name");
+ SerializedProperty targetEnabled = targetProperty.FindPropertyRelative("enabled");
- archEnabled.boolValue = GUILayout.Toggle(archEnabled.boolValue, archName.stringValue);
- archProperty.serializedObject.ApplyModifiedProperties();
+ targetEnabled.boolValue = GUILayout.Toggle(targetEnabled.boolValue, targetName.stringValue);
+ _ = targetProperty.serializedObject.ApplyModifiedProperties();
}
}
@@ -130,7 +143,7 @@ public void Draw(SerializedObject obj)
SerializedProperty scriptEnabled = scriptProperty.FindPropertyRelative("enabled");
scriptEnabled.boolValue = GUILayout.Toggle(scriptEnabled.boolValue, scriptName.stringValue);
- scriptProperty.serializedObject.ApplyModifiedProperties();
+ _ = scriptProperty.serializedObject.ApplyModifiedProperties();
}
}
@@ -148,7 +161,7 @@ public void Draw(SerializedObject obj)
SerializedProperty selectedVariantIndex = variantProperty.FindPropertyRelative("selectedIndex");
SerializedProperty isFlag = variantProperty.FindPropertyRelative("isFlag");
- List valueNames = new List(variantValues.arraySize);
+ List valueNames = new(variantValues.arraySize);
for (int j = 0; j < variantValues.arraySize; j++)
{
valueNames.Add(variantValues.GetArrayElementAtIndex(j).stringValue);
@@ -176,6 +189,13 @@ public void Draw(SerializedObject obj)
}
}
+ if (hasAdditionalOptions)
+ {
+ GUILayout.Label("Additional Options", UnityBuildGUIUtility.midHeaderStyle);
+
+ DrawAdditionalOptions();
+ }
+
SerializedProperty distList = obj.FindProperty("distributionList.distributions");
if (distList.arraySize > 0)
@@ -196,7 +216,7 @@ public void Draw(SerializedObject obj)
if (UnityBuildGUIUtility.DeleteButton())
distList.SafeDeleteArrayElementAtIndex(i);
- dist.serializedObject.ApplyModifiedProperties();
+ _ = dist.serializedObject.ApplyModifiedProperties();
GUILayout.EndHorizontal();
}
@@ -214,37 +234,43 @@ public void Draw(SerializedObject obj)
addedProperty.FindPropertyRelative("enabled").boolValue = true;
addedProperty.FindPropertyRelative("distributionName").stringValue = "DistributionName";
- addedProperty.serializedObject.ApplyModifiedProperties();
- distList.serializedObject.ApplyModifiedProperties();
+ _ = addedProperty.serializedObject.ApplyModifiedProperties();
+ _ = distList.serializedObject.ApplyModifiedProperties();
GUIUtility.keyboardControl = 0;
}
GUILayout.EndVertical();
EditorGUILayout.EndVertical();
- obj.ApplyModifiedProperties();
+ _ = obj.ApplyModifiedProperties();
+ }
+
+ public virtual void DrawAdditionalOptions()
+ {
+ /// Override this method to draw additional options for the platform
+ /// Requires overriding to return true
}
public override string ToString()
{
string name = platformName;
- IEnumerable enabledArchitectures = architectures.Where(item => item.enabled);
- IEnumerable enabledscriptingBackends = scriptingBackends.Where(item => item.enabled);
+ IEnumerable enabledTargets = targets.Where(item => item.enabled);
+ IEnumerable enabledScriptingBackends = scriptingBackends.Where(item => item.enabled);
- List architecturesAndVariants = new List();
+ List targetsAndVariants = new();
- if (architectures.Length > 1 && enabledArchitectures.Count() > 0)
- architecturesAndVariants.AddRange(enabledArchitectures.Select(item => item.ToString()));
+ if (targets.Length > 1 && enabledTargets.Count() > 0)
+ targetsAndVariants.AddRange(enabledTargets.Select(item => item.ToString()));
- if (scriptingBackends.Length > 1 && enabledscriptingBackends.Count() > 0)
- architecturesAndVariants.AddRange(enabledscriptingBackends.Select(item => item.ToString()));
+ if (scriptingBackends.Length > 1 && enabledScriptingBackends.Count() > 0)
+ targetsAndVariants.AddRange(enabledScriptingBackends.Select(item => item.ToString()));
if (variants.Length > 0)
- architecturesAndVariants.AddRange(variants.Select(item => item.ToString()));
+ targetsAndVariants.AddRange(variants.Select(item => item.ToString()));
- name += architecturesAndVariants.Count > 0 ?
- " (" + string.Join(", ", architecturesAndVariants) + ")" :
+ name += targetsAndVariants.Count > 0 ?
+ " (" + string.Join(", ", targetsAndVariants) + ")" :
"";
return name;
diff --git a/Editor/Build/Platform/BuildPlatformList.cs b/Editor/Build/Platform/BuildPlatformList.cs
index e43fe06..21bd00a 100644
--- a/Editor/Build/Platform/BuildPlatformList.cs
+++ b/Editor/Build/Platform/BuildPlatformList.cs
@@ -6,6 +6,6 @@ namespace SuperUnityBuild.BuildTool
[Serializable]
public class BuildPlatformList
{
- public List platforms = new List();
+ public List platforms = new();
}
}
diff --git a/Editor/Build/Platform/BuildScriptingBackend.cs b/Editor/Build/Platform/BuildScriptingBackend.cs
index 7ba19ec..f0a1797 100644
--- a/Editor/Build/Platform/BuildScriptingBackend.cs
+++ b/Editor/Build/Platform/BuildScriptingBackend.cs
@@ -10,7 +10,7 @@ namespace SuperUnityBuild.BuildTool
[Serializable]
public class BuildScriptingBackend
{
- private static readonly Dictionary scriptingImplementationNames = new Dictionary()
+ private static readonly Dictionary scriptingImplementationNames = new()
{
{ ScriptingImplementation.Mono2x, "Mono" },
{ ScriptingImplementation.IL2CPP, "IL2CPP" },
@@ -42,7 +42,7 @@ public override string ToString()
///
/// The build target.
/// True if the IL2CPP backend is installed for this target.
- public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget Target)
+ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, UnityEditor.BuildTarget Target)
{
MethodInfo[] Methods = typeof(BuildPipeline).GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
MethodInfo GetPlaybackEngineDirectory = Methods.First((MethodInfo x) => x.Name == "GetPlaybackEngineDirectory"
@@ -71,7 +71,7 @@ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget T
return false;
}
- if (PlayerPackage == null || PlayerPackage == "")
+ if (PlayerPackage is null or "")
{
//If PlaybackEngineDirectory still doesn't exist, just return false
return false;
@@ -81,32 +81,27 @@ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget T
switch (Target)
{
- case BuildTarget.StandaloneWindows:
- case BuildTarget.StandaloneWindows64:
+ case UnityEditor.BuildTarget.StandaloneWindows:
+ case UnityEditor.BuildTarget.StandaloneWindows64:
{
PlayerName = "UnityPlayer.dll";
- if (Target == BuildTarget.StandaloneWindows)
- {
- IL2CPPVariations = new string[]
+ IL2CPPVariations = Target == UnityEditor.BuildTarget.StandaloneWindows
+ ? (new string[]
{
"win32_development_il2cpp",
"win32_nondevelopment_il2cpp"
- };
- }
- else
- {
- IL2CPPVariations = new string[]
+ })
+ : (new string[]
{
"win64_development_il2cpp",
"win64_nondevelopment_il2cpp"
- };
- }
+ });
break;
}
- case BuildTarget.StandaloneLinux64:
+ case UnityEditor.BuildTarget.StandaloneLinux64:
{
PlayerName = "LinuxPlayer";
@@ -120,7 +115,7 @@ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget T
break;
}
- case BuildTarget.StandaloneOSX:
+ case UnityEditor.BuildTarget.StandaloneOSX:
{
PlayerName = "UnityPlayer.app/Contents/MacOS/UnityPlayer";
@@ -133,7 +128,7 @@ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget T
break;
}
- case BuildTarget.WSAPlayer:
+ case UnityEditor.BuildTarget.WSAPlayer:
{
PlayerName = "UnityPlayer.dll";
@@ -157,16 +152,11 @@ public static bool IsIL2CPPInstalled(BuildTargetGroup TargetGroup, BuildTarget T
return false;
}
- if (Target == BuildTarget.WSAPlayer)
- {
- return IL2CPPVariations.ToList().Exists((string x) =>
- File.Exists(Path.Combine(Path.Combine(PlayerPackage, "Players/UAP"), Path.Combine(x, PlayerName))));
- }
- else
- {
- return IL2CPPVariations.ToList().Exists((string x) =>
+ return Target == UnityEditor.BuildTarget.WSAPlayer
+ ? IL2CPPVariations.ToList().Exists((string x) =>
+ File.Exists(Path.Combine(Path.Combine(PlayerPackage, "Players/UAP"), Path.Combine(x, PlayerName))))
+ : IL2CPPVariations.ToList().Exists((string x) =>
File.Exists(Path.Combine(Path.Combine(PlayerPackage, "Variations"), Path.Combine(x, PlayerName))));
- }
}
}
}
diff --git a/Editor/Build/Platform/BuildTarget.cs b/Editor/Build/Platform/BuildTarget.cs
new file mode 100644
index 0000000..d94bb07
--- /dev/null
+++ b/Editor/Build/Platform/BuildTarget.cs
@@ -0,0 +1,34 @@
+using System;
+using UnityBuildTarget = UnityEditor.BuildTarget;
+
+namespace SuperUnityBuild.BuildTool
+{
+ [Serializable]
+ public class BuildTarget
+ {
+ public UnityBuildTarget type;
+ public string name;
+ public bool enabled;
+ public string binaryNameFormat;
+ public int subtarget;
+
+ public bool isStandalone => type is
+ UnityBuildTarget.StandaloneLinux64 or
+ UnityBuildTarget.StandaloneOSX or
+ UnityBuildTarget.StandaloneWindows or UnityBuildTarget.StandaloneWindows64;
+
+ public BuildTarget(UnityBuildTarget type, string name, bool enabled, string binaryNameFormat, int subtarget = 0)
+ {
+ this.type = type;
+ this.name = name;
+ this.enabled = enabled;
+ this.binaryNameFormat = binaryNameFormat;
+ this.subtarget = subtarget;
+ }
+
+ public override string ToString()
+ {
+ return name;
+ }
+ }
+}
diff --git a/Editor/Build/Platform/UI/BuildPlatformDrawer.cs.meta b/Editor/Build/Platform/BuildTarget.cs.meta
similarity index 69%
rename from Editor/Build/Platform/UI/BuildPlatformDrawer.cs.meta
rename to Editor/Build/Platform/BuildTarget.cs.meta
index 25528c0..9cbfdd0 100644
--- a/Editor/Build/Platform/UI/BuildPlatformDrawer.cs.meta
+++ b/Editor/Build/Platform/BuildTarget.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
-guid: 4544ed9d41307634cbd34da86e28b78a
-timeCreated: 1463164846
-licenseType: Pro
+guid: b40705cb0169ede498bdbebd89074cd8
MonoImporter:
+ externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
diff --git a/Editor/Build/Platform/BuildUWP.cs b/Editor/Build/Platform/BuildUWP.cs
index 87eabb8..547da6d 100644
--- a/Editor/Build/Platform/BuildUWP.cs
+++ b/Editor/Build/Platform/BuildUWP.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Linq;
using UnityEditor;
@@ -13,11 +13,6 @@ public class BuildUWP : BuildPlatform
private const string _binaryNameFormat = "";
private const BuildTargetGroup _targetGroup = BuildTargetGroup.WSA;
- private const string _architectureVariantId = "Architecture";
- private const string _buildTypeVariantId = "Build Type";
-#if !UNITY_2021_2_OR_NEWER
- private const string _targetDeviceVariantId = "Target Device";
-#endif
#endregion
public BuildUWP()
@@ -31,10 +26,10 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.WSAPlayer, "UWP", true, _binaryNameFormat),
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.WSAPlayer, PlayerName, true, _binaryNameFormat),
};
}
@@ -42,41 +37,33 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, true),
+ new(ScriptingImplementation.IL2CPP, true),
};
}
if (variants == null || variants.Length == 0)
{
variants = new BuildVariant[] {
-#if !UNITY_2021_2_OR_NEWER
- new BuildVariant(_targetDeviceVariantId, EnumNamesToArray(true).ToArray(), 0),
-#endif
- new BuildVariant(_architectureVariantId, new string[] { "x86", "x64", "ARM", "ARM64" }, 0),
- new BuildVariant(_buildTypeVariantId, EnumNamesToArray(true).ToArray(), 0)
+ new(ArchitectureVariantKey, new string[] { "x86", "x64", "ARM", "ARM64" }, 0),
+ new(BuildOutputVariantKey, EnumNamesToArray(true).ToArray(), 0)
};
}
}
public override void ApplyVariant()
{
- foreach (var variantOption in variants)
+ foreach (BuildVariant variantOption in variants)
{
string key = variantOption.variantKey;
switch (variantOption.variantName)
{
- case _architectureVariantId:
+ case ArchitectureVariantKey:
SetArchitecture(key);
break;
- case _buildTypeVariantId:
- SetBuildType(key);
+ case BuildOutputVariantKey:
+ SetBuildOutput(key);
break;
-#if !UNITY_2021_2_OR_NEWER
- case _targetDeviceVariantId:
- SetTargetDevice(key);
- break;
-#endif
}
}
}
@@ -86,16 +73,9 @@ private void SetArchitecture(string key)
EditorUserBuildSettings.wsaArchitecture = key;
}
- private void SetBuildType(string key)
+ private void SetBuildOutput(string key)
{
EditorUserBuildSettings.wsaUWPBuildType = EnumValueFromKey(key);
}
-
-#if !UNITY_2021_2_OR_NEWER
- private void SetTargetDevice(string key)
- {
- EditorUserBuildSettings.wsaSubtarget = EnumValueFromKey(key);
- }
-#endif
}
}
diff --git a/Editor/Build/Platform/BuildVariant.cs b/Editor/Build/Platform/BuildVariant.cs
index 7f4c082..9544b90 100644
--- a/Editor/Build/Platform/BuildVariant.cs
+++ b/Editor/Build/Platform/BuildVariant.cs
@@ -1,6 +1,6 @@
using System;
-using System.Linq;
using System.Collections.Generic;
+using System.Linq;
namespace SuperUnityBuild.BuildTool
{
@@ -20,13 +20,7 @@ public BuildVariant(string variantName, string[] values, int selectedIndex, bool
this.isFlag = isFlag;
}
- public string variantKey
- {
- get
- {
- return isFlag ? string.Join("+", flags) : values[selectedIndex];
- }
- }
+ public string variantKey => ToString();
public List flags
{
@@ -34,22 +28,22 @@ public List flags
{
if (selectedIndex < 0)
return values;
- var indexList = ConvertFlagsToSelectedIndexList(selectedIndex);
+ List indexList = ConvertFlagsToSelectedIndexList(selectedIndex);
return indexList.Select(x => values[x]).ToList();
}
}
-
+
///
/// Converts an integer to a list of selected values (indices). Each power of 2 is considered a flag value. For example, 3 returns [0,1].
///
/// The flag value to convert.
/// A list of indices.
- List ConvertFlagsToSelectedIndexList(int number)
+ private List ConvertFlagsToSelectedIndexList(int number)
{
- List powerOf2List = new List();
+ List powerOf2List = new();
int power = 0;
int powerOf2 = 1;
-
+
while (powerOf2 <= number)
{
if ((number & powerOf2) == powerOf2)
@@ -58,7 +52,7 @@ List ConvertFlagsToSelectedIndexList(int number)
power++;
powerOf2 <<= 1;
}
-
+
return powerOf2List;
}
diff --git a/Editor/Build/Platform/BuildWebGL.cs b/Editor/Build/Platform/BuildWebGL.cs
index 347736b..4959b5a 100644
--- a/Editor/Build/Platform/BuildWebGL.cs
+++ b/Editor/Build/Platform/BuildWebGL.cs
@@ -25,10 +25,10 @@ public override void Init()
platformName = _name;
targetGroup = _targetGroup;
- if (architectures == null || architectures.Length == 0)
+ if (targets == null || targets.Length == 0)
{
- architectures = new BuildArchitecture[] {
- new BuildArchitecture(BuildTarget.WebGL, "WebGL", true, _binaryNameFormat),
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.WebGL, PlayerName, true, _binaryNameFormat),
};
}
@@ -36,7 +36,7 @@ public override void Init()
{
scriptingBackends = new BuildScriptingBackend[]
{
- new BuildScriptingBackend(ScriptingImplementation.IL2CPP, true),
+ new(ScriptingImplementation.IL2CPP, true),
};
}
}
diff --git a/Editor/Build/Platform/BuildWindows.cs b/Editor/Build/Platform/BuildWindows.cs
new file mode 100644
index 0000000..79e922c
--- /dev/null
+++ b/Editor/Build/Platform/BuildWindows.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using UnityEditor;
+
+namespace SuperUnityBuild.BuildTool
+{
+ [Serializable]
+ public class BuildWindows : BuildPlatform
+ {
+ #region Constants
+
+ private const string _name = "Windows";
+ private readonly Dictionary _binaryNameFormats = new()
+ {
+ {BuildOutputType.App, "{0}.exe"},
+ {BuildOutputType.VisualStudioSolution, "{0}.sln"},
+ };
+ private const BuildTargetGroup _targetGroup = BuildTargetGroup.Standalone;
+
+ private const string ArchitectureIntel64BitId = "Intel 64-bit";
+ private const string ArchitectureIntel32BitId = "Intel 32-bit";
+#if UNITY_2023_1_OR_NEWER
+ private const string ArchitectureArm64BitId = "ARM 64-bit";
+#endif
+
+ private enum BuildOutputType
+ {
+ App,
+ VisualStudioSolution
+ }
+
+ #endregion
+
+ public BuildWindows()
+ {
+ enabled = false;
+ Init();
+ }
+
+ public override void Init()
+ {
+ platformName = _name;
+ targetGroup = _targetGroup;
+
+ if (targets == null || targets.Length == 0)
+ {
+ targets = new BuildTarget[] {
+ new(UnityEditor.BuildTarget.StandaloneWindows64, PlayerName, true, _binaryNameFormats[0]),
+ new(UnityEditor.BuildTarget.StandaloneWindows64, ServerName, false, _binaryNameFormats[0], (int)StandaloneBuildSubtarget.Server),
+ };
+ }
+
+ if (scriptingBackends == null || scriptingBackends.Length == 0)
+ {
+ scriptingBackends = new BuildScriptingBackend[]
+ {
+ new(ScriptingImplementation.Mono2x, true),
+ new(ScriptingImplementation.IL2CPP, false),
+ };
+ }
+
+ if (variants == null || variants.Length == 0)
+ {
+ variants = new BuildVariant[] {
+ new(ArchitectureVariantKey, new string[] {
+ ArchitectureIntel64BitId, ArchitectureIntel32BitId,
+#if UNITY_2023_1_OR_NEWER
+ ArchitectureArm64BitId
+#endif
+ }, 0, false),
+ new(BuildOutputVariantKey, EnumNamesToArray(true), 0)
+ };
+ }
+ }
+
+ public override void ApplyVariant()
+ {
+ foreach (BuildVariant variantOption in variants)
+ {
+ string key = variantOption.variantKey;
+
+ switch (variantOption.variantName)
+ {
+ case ArchitectureVariantKey:
+ SetArchitecture(key);
+ break;
+ case BuildOutputVariantKey:
+ SetBuildOutput(key);
+ break;
+ }
+ }
+ }
+
+ private void SetArchitecture(string key)
+ {
+ UnityEditor.BuildTarget target = key switch
+ {
+ ArchitectureIntel32BitId => UnityEditor.BuildTarget.StandaloneWindows,
+ ArchitectureIntel64BitId or _ => UnityEditor.BuildTarget.StandaloneWindows64,
+ };
+
+#if UNITY_STANDALONE_WIN && UNITY_2023_1_OR_NEWER
+ UnityEditor.WindowsStandalone.UserBuildSettings.architecture = key == ArchitectureArm64BitId ?
+ UnityEditor.Build.OSArchitecture.ARM64 :
+ UnityEditor.Build.OSArchitecture.x64;
+#endif
+
+ _ = EditorUserBuildSettings.SwitchActiveBuildTarget(_targetGroup, target);
+ }
+
+ private void SetBuildOutput(string key)
+ {
+ BuildOutputType outputType = EnumValueFromKey(key);
+
+#if UNITY_STANDALONE_WIN
+ UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = outputType == BuildOutputType.VisualStudioSolution;
+#endif
+
+ targets[0].binaryNameFormat = _binaryNameFormats[outputType];
+ }
+ }
+}
diff --git a/Editor/Build/Platform/BuildPC.cs.meta b/Editor/Build/Platform/BuildWindows.cs.meta
similarity index 100%
rename from Editor/Build/Platform/BuildPC.cs.meta
rename to Editor/Build/Platform/BuildWindows.cs.meta
diff --git a/Editor/Build/Platform/UI/BuildPlatformDrawer.cs b/Editor/Build/Platform/UI/BuildPlatformDrawer.cs
deleted file mode 100644
index 8280787..0000000
--- a/Editor/Build/Platform/UI/BuildPlatformDrawer.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-using System.Collections.Generic;
-using UnityEditor;
-using UnityEngine;
-
-namespace SuperUnityBuild.BuildTool
-{
- [CustomPropertyDrawer(typeof(BuildPlatform))]
- public class BuildPlatformDrawer : PropertyDrawer
- {
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- EditorGUI.BeginProperty(position, GUIContent.none, property);
-
- bool show = property.isExpanded;
- UnityBuildGUIUtility.DropdownHeader(property.FindPropertyRelative("platformName").stringValue, ref show, false);
- property.isExpanded = show;
-
- if (show)
- {
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
-
- SerializedProperty archList = property.FindPropertyRelative("architectures");
-
- if (archList.arraySize > 1)
- {
- GUILayout.Label("Architectures", UnityBuildGUIUtility.midHeaderStyle);
- for (int i = 0; i < archList.arraySize; i++)
- {
- SerializedProperty archProperty = archList.GetArrayElementAtIndex(i);
- SerializedProperty archName = archProperty.FindPropertyRelative("name");
- SerializedProperty archEnabled = archProperty.FindPropertyRelative("enabled");
-
- archEnabled.boolValue = GUILayout.Toggle(archEnabled.boolValue, archName.stringValue);
- archProperty.serializedObject.ApplyModifiedProperties();
- }
- }
-
- SerializedProperty variantList = property.FindPropertyRelative("variants");
-
- if (variantList.arraySize > 0)
- {
- GUILayout.Label("Variant Options", UnityBuildGUIUtility.midHeaderStyle);
-
- for (int i = 0; i < variantList.arraySize; i++)
- {
- SerializedProperty variantProperty = variantList.GetArrayElementAtIndex(i);
- SerializedProperty variantName = variantProperty.FindPropertyRelative("variantName");
- SerializedProperty variantValues = variantProperty.FindPropertyRelative("values");
- SerializedProperty selectedVariantIndex = variantProperty.FindPropertyRelative("selectedIndex");
-
- List valueNames = new List(variantValues.arraySize);
- for (int j = 0; j < variantValues.arraySize; j++)
- {
- valueNames.Add(variantValues.GetArrayElementAtIndex(j).stringValue);
- }
-
- GUILayout.BeginHorizontal();
-
- EditorGUILayout.LabelField(variantName.stringValue);
- selectedVariantIndex.intValue =
- EditorGUILayout.Popup(selectedVariantIndex.intValue, valueNames.ToArray(), UnityBuildGUIUtility.popupStyle, GUILayout.ExpandWidth(false), GUILayout.MaxWidth(250));
-
- GUILayout.EndHorizontal();
- }
- }
-
- SerializedProperty distList = property.FindPropertyRelative("distributionList.distributions");
-
- if (distList.arraySize > 0)
- {
- GUILayout.Label("Distributions", UnityBuildGUIUtility.midHeaderStyle);
-
- for (int i = 0; i < distList.arraySize; i++)
- {
- SerializedProperty dist = distList.GetArrayElementAtIndex(i);
- SerializedProperty distEnabled = dist.FindPropertyRelative("enabled");
- SerializedProperty distName = dist.FindPropertyRelative("distributionName");
-
- GUILayout.BeginHorizontal();
-
- distEnabled.boolValue = GUILayout.Toggle(distEnabled.boolValue, GUIContent.none, GUILayout.ExpandWidth(false));
- distName.stringValue = GUILayout.TextField(distName.stringValue.SanitizeFolderName());
-
- if (UnityBuildGUIUtility.DeleteButton())
- distList.SafeDeleteArrayElementAtIndex(i);
-
- dist.serializedObject.ApplyModifiedProperties();
-
- GUILayout.EndHorizontal();
- }
- }
-
- GUILayout.Space(10);
- GUILayout.BeginHorizontal();
- GUILayout.FlexibleSpace();
- GUILayout.BeginVertical();
- if (GUILayout.Button("Add Distribution", GUILayout.MaxWidth(150)))
- {
- int addedIndex = distList.arraySize;
- distList.InsertArrayElementAtIndex(addedIndex);
-
- SerializedProperty addedProperty = distList.GetArrayElementAtIndex(addedIndex);
- addedProperty.FindPropertyRelative("enabled").boolValue = true;
- addedProperty.FindPropertyRelative("distributionName").stringValue = "DistributionName";
-
- addedProperty.serializedObject.ApplyModifiedProperties();
- distList.serializedObject.ApplyModifiedProperties();
- property.serializedObject.ApplyModifiedProperties();
- GUIUtility.keyboardControl = 0;
- }
-
- if (GUILayout.Button("Delete Platform", GUILayout.MaxWidth(150)))
- property.FindPropertyRelative("enabled").boolValue = false;
-
- GUILayout.EndVertical();
- GUILayout.FlexibleSpace();
- GUILayout.EndHorizontal();
-
- EditorGUILayout.EndVertical();
- }
-
- property.serializedObject.ApplyModifiedProperties();
-
- EditorGUI.EndProperty();
- }
- }
-}
diff --git a/Editor/Build/Platform/UI/BuildPlatformListDrawer.cs b/Editor/Build/Platform/UI/BuildPlatformListDrawer.cs
index 5f5c972..c2f7182 100644
--- a/Editor/Build/Platform/UI/BuildPlatformListDrawer.cs
+++ b/Editor/Build/Platform/UI/BuildPlatformListDrawer.cs
@@ -13,14 +13,14 @@ public class BuildPlatformListDrawer : PropertyDrawer
private SerializedProperty list = null;
private BuildPlatformList platformList = null;
- private List availablePlatformNameList = new List();
- private List availablePlatformTypeList = new List();
+ private readonly List availablePlatformNameList = new();
+ private readonly List availablePlatformTypeList = new();
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
- EditorGUI.BeginProperty(position, label, property);
+ _ = EditorGUI.BeginProperty(position, label, property);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
property.serializedObject.Update();
bool show = property.isExpanded;
@@ -37,7 +37,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
if (show)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
DrawPlatforms(property);
@@ -57,7 +57,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
AssetDatabase.AddObjectToAsset(addedBuildPlatform, BuildSettings.instance);
AssetDatabaseUtility.ImportAsset(AssetDatabase.GetAssetPath(BuildSettings.instance));
- platformList.platforms[platformList.platforms.Count - 1].enabled = true;
+ platformList.platforms[^1].enabled = true;
for (int i = platformList.platforms.Count - 1; i >= 0; i--)
{
@@ -88,9 +88,9 @@ private void DrawPlatforms(SerializedProperty property)
continue;
}
- SerializedObject serializedBuildPlatform = new SerializedObject(platform);
+ SerializedObject serializedBuildPlatform = new(platform);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
bool show = listEntry.isExpanded;
string tooltip = platform.ToString();
string text = UnityBuildGUIUtility.ToLabel(tooltip);
@@ -116,7 +116,7 @@ private void DrawPlatforms(SerializedProperty property)
if (show && platform.enabled)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
platform.Draw(serializedBuildPlatform);
EditorGUILayout.EndVertical();
}
diff --git a/Editor/Build/Settings/BasicSettings.cs b/Editor/Build/Settings/BasicSettings.cs
index 4113d5a..4629ce0 100644
--- a/Editor/Build/Settings/BasicSettings.cs
+++ b/Editor/Build/Settings/BasicSettings.cs
@@ -9,8 +9,8 @@ public class BasicSettings
{
[FilePath(true, true, "Choose location for build output")]
public string baseBuildFolder = "Builds";
- [Tooltip("Recognized tokens for the build path: $YEAR, $MONTH, $DAY, $TIME, $RELEASE_TYPE, $PLATFORM, $ARCHITECTURE, $VARIANTS, $DISTRIBUTION, $VERSION, $BUILD, $PRODUCT_NAME, $SCRIPTING_BACKEND")]
- public string buildPath = "$VERSION/$RELEASE_TYPE/$PLATFORM/$ARCHITECTURE/$SCRIPTING_BACKEND";
+ [Tooltip("Recognized tokens for the build path: $YEAR, $MONTH, $DAY, $TIME, $RELEASE_TYPE, $PLATFORM, $TARGET, $VARIANTS, $DISTRIBUTION, $VERSION, $BUILD, $PRODUCT_NAME, $SCRIPTING_BACKEND")]
+ public string buildPath = "$VERSION/$RELEASE_TYPE/$PLATFORM/$TARGET/$SCRIPTING_BACKEND";
public bool openFolderPostBuild = true;
[Tooltip("The folder path for the " + BuildConstantsGenerator.FileName + " file which will be generated on build. Use the Configure Editor Environment button on a selected configuration to generate it now.")]
[FilePath(true, true, "Choose folder location for the " + BuildConstantsGenerator.FileName + " file")]
diff --git a/Editor/Build/Settings/BuildSettings.cs b/Editor/Build/Settings/BuildSettings.cs
index 2362864..e6e8422 100644
--- a/Editor/Build/Settings/BuildSettings.cs
+++ b/Editor/Build/Settings/BuildSettings.cs
@@ -36,19 +36,19 @@ internal set
#region Variables
[SerializeField]
- private BasicSettings _basicSettings = new BasicSettings();
+ private BasicSettings _basicSettings = new();
[SerializeField]
- private ProductParameters _productParameters = new ProductParameters();
+ private ProductParameters _productParameters = new();
[SerializeField]
- private BuildReleaseTypeList _releaseTypeList = new BuildReleaseTypeList();
+ private BuildReleaseTypeList _releaseTypeList = new();
[SerializeField]
- private BuildPlatformList _platformList = new BuildPlatformList();
+ private BuildPlatformList _platformList = new();
[SerializeField]
- private ProjectConfigurations _projectConfigurations = new ProjectConfigurations();
+ private ProjectConfigurations _projectConfigurations = new();
[SerializeField]
- private BuildActionList _preBuildActions = new BuildActionList();
+ private BuildActionList _preBuildActions = new();
[SerializeField]
- private BuildActionList _postBuildActions = new BuildActionList();
+ private BuildActionList _postBuildActions = new();
#endregion
@@ -56,24 +56,22 @@ internal set
public static void Init()
{
- if (_instance._preBuildActions == null)
- _instance._preBuildActions = new BuildActionList();
+ _instance._preBuildActions ??= new BuildActionList();
- if (_instance._postBuildActions == null)
- _instance._postBuildActions = new BuildActionList();
+ _instance._postBuildActions ??= new BuildActionList();
}
#endregion
#region Properties
- public static BasicSettings basicSettings { get => instance._basicSettings; }
- public static ProductParameters productParameters { get => instance._productParameters; }
- public static BuildReleaseTypeList releaseTypeList { get => instance._releaseTypeList; }
- public static BuildPlatformList platformList { get => instance._platformList; }
- public static ProjectConfigurations projectConfigurations { get => instance._projectConfigurations; }
- public static BuildActionList preBuildActions { get => instance._preBuildActions; }
- public static BuildActionList postBuildActions { get => instance._postBuildActions; }
+ public static BasicSettings basicSettings => instance._basicSettings;
+ public static ProductParameters productParameters => instance._productParameters;
+ public static BuildReleaseTypeList releaseTypeList => instance._releaseTypeList;
+ public static BuildPlatformList platformList => instance._platformList;
+ public static ProjectConfigurations projectConfigurations => instance._projectConfigurations;
+ public static BuildActionList preBuildActions => instance._preBuildActions;
+ public static BuildActionList postBuildActions => instance._postBuildActions;
#endregion
@@ -82,14 +80,14 @@ public static void Init()
[OnOpenAssetAttribute(1)]
public static bool HandleOpenAsset(int instanceID, int line)
{
- var assetPath = AssetDatabase.GetAssetPath(instanceID);
- if(assetPath == null)
+ string assetPath = AssetDatabase.GetAssetPath(instanceID);
+ if (assetPath == null)
{
//Asset did not exist
return false;
}
- var asset = AssetDatabase.LoadAssetAtPath(assetPath);
- if(asset == null)
+ BuildSettings asset = AssetDatabase.LoadAssetAtPath(assetPath);
+ if (asset == null)
{
//Not the right type
return false;
@@ -104,7 +102,7 @@ public void OpenInUnityBuildWindow()
{
//Show the window using the same process as pressing the menu button
UnityBuildWindow.ShowWindow();
- var thisWindow = EditorWindow.GetWindow();
+ UnityBuildWindow thisWindow = EditorWindow.GetWindow();
if (thisWindow != null)
{
//If the window exists
@@ -113,7 +111,7 @@ public void OpenInUnityBuildWindow()
BuildSettings.instance = this;
//Tell the window to use the new settings
- thisWindow.RefreshSelectedBuildSettings();
+ thisWindow.UpdateCurrentBuildSettings();
}
}
diff --git a/Editor/Build/Settings/ProjectConfigurations.cs b/Editor/Build/Settings/ProjectConfigurations.cs
index 3c5827b..acec66d 100644
--- a/Editor/Build/Settings/ProjectConfigurations.cs
+++ b/Editor/Build/Settings/ProjectConfigurations.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
namespace SuperUnityBuild.BuildTool
@@ -21,13 +21,13 @@ public class ProjectConfigurations
public void Refresh()
{
- ConfigDictionary refreshedConfigSet = new ConfigDictionary();
+ ConfigDictionary refreshedConfigSet = new();
BuildReleaseType[] releaseTypes = BuildSettings.releaseTypeList.releaseTypes;
for (int i = 0; i < releaseTypes.Length; i++)
{
string key = releaseTypes[i].typeName;
- Configuration relConfig = new Configuration();
+ Configuration relConfig = new();
// Check for duplicate.
if (refreshedConfigSet.ContainsKey(key))
@@ -51,7 +51,7 @@ public void Refresh()
public string[] BuildAllKeychains()
{
- List keychains = new List();
+ List keychains = new();
BuildReleaseType[] releaseTypes = BuildSettings.releaseTypeList.releaseTypes;
for (int i = 0; i < releaseTypes.Length; i++)
@@ -117,7 +117,7 @@ private void BuildKeychainsRecursive(ref List keychains, Configuration c
}
}
- public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildArchitecture architecture,
+ public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out BuildPlatform platform, out BuildTarget target,
out BuildScriptingBackend scriptingBackend, out BuildDistribution distribution)
{
bool success = false;
@@ -127,7 +127,7 @@ public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out
releaseType = null;
platform = null;
- architecture = null;
+ target = null;
distribution = null;
scriptingBackend = null;
@@ -178,43 +178,43 @@ public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out
if (platform == null)
return false;
- // Parse architecture.
- if (platform.architectures.Length == 1)
+ // Parse target.
+ if (platform.targets.Length == 1)
{
- // Only one architecture, so it won't even appear in dictionary. Just get it directly.
+ // Only one target, so it won't even appear in dictionary. Just get it directly.
++targetKey;
- architecture = platform.architectures[0];
+ target = platform.targets[0];
success = true;
}
else if (keyCount > ++targetKey)
{
- for (int i = 0; i < platform.architectures.Length; i++)
+ for (int i = 0; i < platform.targets.Length; i++)
{
- BuildArchitecture arch = platform.architectures[i];
+ BuildTarget t = platform.targets[i];
- if (keys[targetKey] == arch.name)
+ if (keys[targetKey] == t.name)
{
- architecture = arch;
+ target = t;
success = true;
break;
}
}
}
- if (architecture == null)
+ if (target == null)
return false;
- //Parse scripting backend
+ // Parse scripting backend
if (platform.scriptingBackends.Length == 0)
{
- //If no scripting backends are available,
- //use Mono2x by default
+ // If no scripting backends are available,
+ // use Mono2x by default
scriptingBackend = new BuildScriptingBackend(UnityEditor.ScriptingImplementation.Mono2x, true);
success = true;
}
else if (keyCount > ++targetKey)
{
- //Else search for existing backends
+ // Else search for existing backends
success = false;
for (int i = 0; i < platform.scriptingBackends.Length; i++)
{
@@ -240,11 +240,11 @@ public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out
success = false;
for (int i = 0; i < platform.distributionList.distributions.Length; i++)
{
- BuildDistribution dist = platform.distributionList.distributions[i];
+ BuildDistribution d = platform.distributionList.distributions[i];
- if (keys[targetKey] == dist.distributionName)
+ if (keys[targetKey] == d.distributionName)
{
- distribution = dist;
+ distribution = d;
success = true;
break;
}
@@ -256,18 +256,18 @@ public bool ParseKeychain(string keychain, out BuildReleaseType releaseType, out
private string[] RefreshPlatforms(string keyChain, ConfigDictionary refreshedConfigSet, ConfigDictionary prevConfigSet)
{
- List childKeys = new List();
+ List childKeys = new();
List platforms = BuildSettings.platformList.platforms;
for (int i = 0; i < platforms.Count; i++)
{
// Skip if platform is disabled or if it doesn't have any
- // enabled architectures or scripting backends
- if (!platforms[i].enabled || !platforms[i].atLeastOneArch || !platforms[i].atLeastOneBackend)
+ // enabled targets or scripting backends
+ if (!platforms[i].enabled || !platforms[i].atLeastOneTarget || !platforms[i].atLeastOneBackend)
continue;
string key = keyChain + "/" + platforms[i].platformName;
- Configuration relConfig = new Configuration();
+ Configuration relConfig = new();
// Check for duplicate key.
if (refreshedConfigSet.ContainsKey(key))
@@ -279,22 +279,22 @@ private string[] RefreshPlatforms(string keyChain, ConfigDictionary refreshedCon
relConfig.enabled = prevConfigSet[key].enabled;
}
- // Refresh architectures.
- BuildArchitecture[] architectures = platforms[i].architectures;
+ // Refresh targets.
+ BuildTarget[] targets = platforms[i].targets;
BuildScriptingBackend[] scriptingBackends = platforms[i].scriptingBackends;
- if (architectures.Length > 0)
- relConfig.childKeys = RefreshArchitectures(key, refreshedConfigSet, platforms[i].variantKey, architectures,
+ if (targets.Length > 0)
+ relConfig.childKeys = RefreshTargets(key, refreshedConfigSet, platforms[i].variantKey, targets,
scriptingBackends, platforms[i].distributionList.distributions, prevConfigSet);
// Scan ahead for other versions of this platform with different variants.
for (int j = i; j < platforms.Count; j++)
{
BuildPlatform otherPlatform = platforms[j];
- if (otherPlatform.platformName == platforms[i].platformName && otherPlatform.enabled && otherPlatform.atLeastOneArch
+ if (otherPlatform.platformName == platforms[i].platformName && otherPlatform.enabled && otherPlatform.atLeastOneTarget
&& otherPlatform.atLeastOneBackend)
{
- List currentKeys = new List(relConfig.childKeys);
- string[] additionalKeys = RefreshArchitectures(key, refreshedConfigSet, otherPlatform.variantKey, otherPlatform.architectures,
+ List currentKeys = new(relConfig.childKeys);
+ string[] additionalKeys = RefreshTargets(key, refreshedConfigSet, otherPlatform.variantKey, otherPlatform.targets,
otherPlatform.scriptingBackends, otherPlatform.distributionList.distributions, prevConfigSet);
for (int k = 0; k < additionalKeys.Length; k++)
@@ -317,22 +317,22 @@ private string[] RefreshPlatforms(string keyChain, ConfigDictionary refreshedCon
return childKeys.ToArray();
}
- private string[] RefreshArchitectures(string keyChain, ConfigDictionary refreshedConfigSet, string variantKey, BuildArchitecture[] architectures,
+ private string[] RefreshTargets(string keyChain, ConfigDictionary refreshedConfigSet, string variantKey, BuildTarget[] targets,
BuildScriptingBackend[] scriptingBackends, BuildDistribution[] distributions, ConfigDictionary prevConfigSet)
{
- List childKeys = new List();
+ List childKeys = new();
- for (int i = 0; i < architectures.Length; i++)
+ for (int i = 0; i < targets.Length; i++)
{
- // Skip if architecture is disabled.
- if (!architectures[i].enabled)
+ // Skip if target is disabled.
+ if (!targets[i].enabled)
continue;
- string key = keyChain + "/" + architectures[i].name;
+ string key = keyChain + "/" + targets[i].name;
if (variantKey.Length > 0)
key += " (" + variantKey + ")";
- Configuration relConfig = new Configuration();
+ Configuration relConfig = new();
// Check for a duplicate key.
if (refreshedConfigSet.ContainsKey(key))
@@ -344,14 +344,14 @@ private string[] RefreshArchitectures(string keyChain, ConfigDictionary refreshe
relConfig.enabled = prevConfigSet[key].enabled;
}
- //Refresh scripting backends
+ // Refresh scripting backends
if (scriptingBackends.Length > 0)
{
relConfig.childKeys = RefreshBackends(key, refreshedConfigSet, scriptingBackends, distributions, prevConfigSet);
}
else
{
- //If scripting backends is empty, don't miss the distributions
+ // If scripting backends is empty, don't miss the distributions
relConfig.childKeys = RefreshDistributions(key, refreshedConfigSet, distributions, prevConfigSet);
}
@@ -368,7 +368,7 @@ private string[] RefreshArchitectures(string keyChain, ConfigDictionary refreshe
private string[] RefreshBackends(string keyChain, ConfigDictionary refreshedConfigSet, BuildScriptingBackend[] scriptingBackends,
BuildDistribution[] distributions, ConfigDictionary prevConfigSet)
{
- List childKeys = new List();
+ List childKeys = new();
for (int i = 0; i < scriptingBackends.Length; i++)
{
@@ -378,7 +378,7 @@ private string[] RefreshBackends(string keyChain, ConfigDictionary refreshedConf
string key = keyChain + "/" + scriptingBackends[i].name;
- Configuration relConfig = new Configuration();
+ Configuration relConfig = new();
// Check for a duplicate key.
if (refreshedConfigSet.ContainsKey(key))
@@ -408,7 +408,7 @@ private string[] RefreshBackends(string keyChain, ConfigDictionary refreshedConf
private string[] RefreshDistributions(string keyChain, ConfigDictionary refreshedConfigSet, BuildDistribution[] distributions, ConfigDictionary prevConfigSet)
{
- List childKeys = new List();
+ List childKeys = new();
for (int i = 0; i < distributions.Length; i++)
{
@@ -416,7 +416,7 @@ private string[] RefreshDistributions(string keyChain, ConfigDictionary refreshe
continue;
string key = keyChain + "/" + distributions[i].distributionName;
- Configuration relConfig = new Configuration();
+ Configuration relConfig = new();
if (refreshedConfigSet.ContainsKey(key))
continue;
diff --git a/Editor/Build/Settings/UI/BuildReleaseTypeDrawer.cs b/Editor/Build/Settings/UI/BuildReleaseTypeDrawer.cs
index 20d41c9..b5cfa70 100644
--- a/Editor/Build/Settings/UI/BuildReleaseTypeDrawer.cs
+++ b/Editor/Build/Settings/UI/BuildReleaseTypeDrawer.cs
@@ -75,14 +75,9 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
SerializedProperty buildOptions = property.FindPropertyRelative("buildOptions");
- bool enableHeadlessMode = ((BuildOptions)buildOptions.intValue & BuildOptions.EnableHeadlessMode) == BuildOptions.EnableHeadlessMode;
bool developmentBuild = ((BuildOptions)buildOptions.intValue & BuildOptions.Development) == BuildOptions.Development;
bool allowDebugging = ((BuildOptions)buildOptions.intValue & BuildOptions.AllowDebugging) == BuildOptions.AllowDebugging;
- enableHeadlessMode = EditorGUILayout.ToggleLeft(" Server Build", enableHeadlessMode);
- if (enableHeadlessMode) buildOptions.intValue |= (int)BuildOptions.EnableHeadlessMode;
- else buildOptions.intValue &= ~(int)BuildOptions.EnableHeadlessMode;
-
developmentBuild = EditorGUILayout.ToggleLeft(" Development Build", developmentBuild);
if (developmentBuild) buildOptions.intValue |= (int)BuildOptions.Development;
else buildOptions.intValue &= ~(int)BuildOptions.Development;
diff --git a/Editor/Build/Settings/UI/ProjectConfigurationsDrawer.cs b/Editor/Build/Settings/UI/ProjectConfigurationsDrawer.cs
index 49099f5..9f35b37 100644
--- a/Editor/Build/Settings/UI/ProjectConfigurationsDrawer.cs
+++ b/Editor/Build/Settings/UI/ProjectConfigurationsDrawer.cs
@@ -24,9 +24,9 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
treeView = property.FindPropertyRelative("treeView");
selectedKeyChain = property.FindPropertyRelative("selectedKeyChain");
- EditorGUI.BeginProperty(position, label, property);
+ _ = EditorGUI.BeginProperty(position, label, property);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
show = property.isExpanded;
UnityBuildGUIUtility.DropdownHeader("Build Configurations", ref show, false, GUILayout.ExpandWidth(true));
@@ -39,9 +39,9 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
if (show)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
show = showViewOptions.isExpanded;
UnityBuildGUIUtility.DropdownHeader("View Options", ref show, false, GUILayout.ExpandWidth(true));
showViewOptions.isExpanded = show;
@@ -49,7 +49,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
if (show)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
hideDisabled.boolValue = EditorGUILayout.ToggleLeft("Hide disabled configurations", hideDisabled.boolValue);
treeView.boolValue = EditorGUILayout.ToggleLeft("Show full configurations tree", treeView.boolValue);
@@ -58,7 +58,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
}
GUILayout.Space(5);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
show = showConfigs.isExpanded;
UnityBuildGUIUtility.DropdownHeader("Configurations", ref show, false, GUILayout.ExpandWidth(true));
showConfigs.isExpanded = show;
@@ -66,7 +66,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
if (show)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
if (BuildSettings.projectConfigurations.configSet.Keys.Count > 0)
{
@@ -87,7 +87,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
}
GUILayout.Space(5);
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
show = showBuildInfo.isExpanded;
UnityBuildGUIUtility.DropdownHeader("Selected Build Info", ref show, false, GUILayout.ExpandWidth(true));
showBuildInfo.isExpanded = show;
@@ -95,7 +95,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
if (show)
{
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
if (string.IsNullOrEmpty(selectedKeyChain.stringValue))
{
@@ -103,19 +103,14 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
}
else
{
- BuildReleaseType releaseType;
- BuildPlatform platform;
- BuildArchitecture architecture;
- BuildDistribution distribution;
- BuildScriptingBackend scriptingBackend;
BuildOptions buildOptions = BuildOptions.None;
- bool parseSuccess = BuildSettings.projectConfigurations.ParseKeychain(selectedKeyChain.stringValue, out releaseType, out platform,
- out architecture, out scriptingBackend, out distribution);
+ bool parseSuccess = BuildSettings.projectConfigurations.ParseKeychain(selectedKeyChain.stringValue, out BuildReleaseType releaseType, out BuildPlatform platform,
+ out BuildTarget target, out BuildScriptingBackend scriptingBackend, out BuildDistribution distribution);
if (parseSuccess)
{
- string defines = BuildProject.GenerateDefaultDefines(releaseType, platform, architecture, scriptingBackend, distribution);
+ string defines = BuildProject.GenerateDefaultDefines(releaseType, platform, target, scriptingBackend, distribution);
EditorGUILayout.LabelField("Misc Info", UnityBuildGUIUtility.midHeaderStyle);
EditorGUILayout.LabelField("Defines:");
@@ -139,10 +134,10 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
EditorGUILayout.LabelField("Name:\t\t" + platform.platformName);
}
- if (architecture != null)
+ if (target != null)
{
- EditorGUILayout.LabelField("Architecture", UnityBuildGUIUtility.midHeaderStyle);
- EditorGUILayout.LabelField("Name:\t\t" + architecture.name);
+ EditorGUILayout.LabelField("Target", UnityBuildGUIUtility.midHeaderStyle);
+ EditorGUILayout.LabelField("Name:\t\t" + target.name);
}
if (distribution != null)
@@ -200,7 +195,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
EditorGUILayout.EndVertical();
}
- property.serializedObject.ApplyModifiedProperties();
+ _ = property.serializedObject.ApplyModifiedProperties();
EditorGUILayout.EndVertical();
}
@@ -210,7 +205,7 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
private void DisplayConfigTree(string key, Configuration config, int depth, bool enabled = true)
{
- EditorGUILayout.BeginHorizontal();
+ _ = EditorGUILayout.BeginHorizontal();
EditorGUI.BeginDisabledGroup(!enabled);
bool displayButton = depth >= 2 && (config.childKeys == null || config.childKeys.Length == 0);
@@ -230,7 +225,7 @@ private void DisplayConfigTree(string key, Configuration config, int depth, bool
if (treeView.boolValue)
{
string[] split = key.Split('/');
- text = split[split.Length - 1];
+ text = split[^1];
}
else
{
diff --git a/Editor/Build/UI/UnityBuildWindow.cs b/Editor/Build/UI/UnityBuildWindow.cs
index 9753c01..09f77d7 100644
--- a/Editor/Build/UI/UnityBuildWindow.cs
+++ b/Editor/Build/UI/UnityBuildWindow.cs
@@ -25,16 +25,7 @@ public static void ShowWindow()
Type inspWndType = editorAsm.GetType("UnityEditor.InspectorWindow");
// Get and show window.
- UnityBuildWindow window;
- if (inspWndType != null)
- {
- window = GetWindow(inspWndType);
- }
- else
- {
- window = GetWindow();
- }
-
+ UnityBuildWindow window = inspWndType != null ? GetWindow(inspWndType) : GetWindow();
window.Show();
}
@@ -45,10 +36,9 @@ public static void ShowWindow()
protected void OnEnable()
{
GUIContent icon = EditorGUIUtility.IconContent("Packages/com.github.superunitybuild.buildtool/Editor/Assets/Textures/icon.png");
- GUIContent title = new GUIContent("SuperUnityBuild", icon.image);
+ GUIContent title = new("SuperUnityBuild", icon.image);
titleContent = title;
- BuildNotificationList.instance.InitializeErrors();
currentBuildSettings = BuildSettings.instance;
Undo.undoRedoPerformed += UndoHandler;
@@ -61,7 +51,7 @@ protected void OnDisable()
protected void OnGUI()
{
- EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
+ _ = EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
DrawTitle();
@@ -91,10 +81,10 @@ protected void OnGUI()
#region Public Methods
- public void RefreshSelectedBuildSettings()
+ public void UpdateCurrentBuildSettings()
{
currentBuildSettings = BuildSettings.instance;
- settings = null;
+ Reset();
}
#endregion
@@ -102,14 +92,9 @@ public void RefreshSelectedBuildSettings()
#region Private Methods
private void Init()
{
- if (go == null)
- {
- go = new SerializedObject(this);
- }
-
// Add field to switch the BuildSettings asset
- EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
- EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
+ _ = EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
+ _ = EditorGUILayout.BeginVertical(UnityBuildGUIUtility.dropdownContentStyle);
currentBuildSettings = EditorGUILayout.ObjectField("Build Settings", currentBuildSettings, typeof(BuildSettings), false) as BuildSettings;
EditorGUILayout.EndVertical();
EditorGUILayout.EndVertical();
@@ -117,26 +102,32 @@ private void Init()
// Override a 'None' selection for the BuildSettings asset
if (currentBuildSettings == null)
{
- RefreshSelectedBuildSettings();
+ UpdateCurrentBuildSettings();
}
if (currentBuildSettings != BuildSettings.instance)
{
BuildSettings.instance = currentBuildSettings;
- settings = null;
+ Reset();
}
- if (settings == null)
- {
- settings = new SerializedObject(BuildSettings.instance);
- }
+ settings ??= new SerializedObject(BuildSettings.instance);
+ go ??= new SerializedObject(this);
BuildSettings.Init();
}
+ private void Reset()
+ {
+ notifications.Reset();
+
+ settings = null;
+ go = null;
+ }
+
private void DrawTitle()
{
- EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
+ _ = EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
EditorGUILayout.LabelField("SuperUnityBuild", UnityBuildGUIUtility.mainTitleStyle);
GUILayout.Space(30);
EditorGUILayout.EndVertical();
@@ -144,32 +135,30 @@ private void DrawTitle()
private void DrawProperties()
{
- EditorGUILayout.PropertyField(settings.FindProperty("_basicSettings"), GUILayout.MaxHeight(0));
- EditorGUILayout.PropertyField(settings.FindProperty("_productParameters"), GUILayout.MaxHeight(10));
- EditorGUILayout.PropertyField(settings.FindProperty("_releaseTypeList"), GUILayout.MaxHeight(10));
- EditorGUILayout.PropertyField(settings.FindProperty("_platformList"), GUILayout.MaxHeight(10));
- EditorGUILayout.PropertyField(settings.FindProperty("_preBuildActions"), new GUIContent("Pre-Build Actions"), GUILayout.MaxHeight(10));
- EditorGUILayout.PropertyField(settings.FindProperty("_postBuildActions"), new GUIContent("Post-Build Actions"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_basicSettings"), GUILayout.MaxHeight(0));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_productParameters"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_releaseTypeList"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_platformList"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_preBuildActions"), new GUIContent("Pre-Build Actions"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_postBuildActions"), new GUIContent("Post-Build Actions"), GUILayout.MaxHeight(10));
BuildSettings.projectConfigurations.Refresh();
- EditorGUILayout.PropertyField(settings.FindProperty("_projectConfigurations"), GUILayout.MaxHeight(10));
- EditorGUILayout.PropertyField(go.FindProperty("notifications"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(settings.FindProperty("_projectConfigurations"), GUILayout.MaxHeight(10));
+ _ = EditorGUILayout.PropertyField(go.FindProperty("notifications"), GUILayout.MaxHeight(10));
- settings.ApplyModifiedProperties();
+ _ = settings.ApplyModifiedProperties();
}
private void DrawBuildButtons()
{
int totalBuildCount = BuildSettings.projectConfigurations.GetEnabledBuildsCount();
- EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
+ _ = EditorGUILayout.BeginVertical(EditorStyles.inspectorFullWidthMargins);
EditorGUI.BeginDisabledGroup(totalBuildCount < 1);
if (UnityBuildGUIUtility.BuildButton($"Perform All Enabled Builds ({totalBuildCount} Builds)", 30))
- {
EditorApplication.delayCall += BuildProject.BuildAll;
- }
EditorGUI.EndDisabledGroup();
EditorGUILayout.EndVertical();
diff --git a/Editor/BuildConstantsGenerator.cs b/Editor/BuildConstantsGenerator.cs
index 91290a3..1813a26 100644
--- a/Editor/BuildConstantsGenerator.cs
+++ b/Editor/BuildConstantsGenerator.cs
@@ -20,11 +20,11 @@ public static string FindFile()
char[] separatorChars = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };
for (int i = 0; i < fileSearchResults.Length; i++)
{
- var thisFilePath = fileSearchResults[i];
- var thisFilePathSplit = thisFilePath.Split(separatorChars);
+ string thisFilePath = fileSearchResults[i];
+ string[] thisFilePathSplit = thisFilePath.Split(separatorChars);
if (thisFilePathSplit.Length > 0)
{
- if (thisFilePathSplit[thisFilePathSplit.Length - 1].Equals(FileName))
+ if (thisFilePathSplit[^1].Equals(FileName))
{
filePath = thisFilePath;
break;
@@ -43,27 +43,19 @@ public static void Generate(
BuildReleaseType currentReleaseType = null,
BuildPlatform currentBuildPlatform = null,
BuildScriptingBackend currentScriptingBackend = null,
- BuildArchitecture currentBuildArchitecture = null,
+ BuildTarget currentBuildTarget = null,
BuildDistribution currentBuildDistribution = null)
{
// Find the BuildConstants file.
string currentFilePath = FindFile();
- string finalFileLocation;
- if (string.IsNullOrEmpty(currentFilePath))
- {
- finalFileLocation = Path.Combine(filePath, FileName);
- }
- else
- {
- finalFileLocation = currentFilePath;
- }
+ string finalFileLocation = string.IsNullOrEmpty(currentFilePath) ? Path.Combine(filePath, FileName) : currentFilePath;
// Generate strings
string versionString = currentVersion;
string releaseTypeString = currentReleaseType == null ? NONE : SanitizeString(currentReleaseType.typeName);
string platformString = currentBuildPlatform == null ? NONE : SanitizeString(currentBuildPlatform.platformName);
string scriptingBackendString = currentScriptingBackend == null ? NONE : SanitizeString(currentScriptingBackend.name);
- string architectureString = currentBuildArchitecture == null ? NONE : SanitizeString(currentBuildArchitecture.name);
+ string targetString = currentBuildTarget == null ? NONE : SanitizeString(currentBuildTarget.name);
string distributionString = currentBuildDistribution == null ? NONE : SanitizeString(currentBuildDistribution.distributionName);
if (File.Exists(finalFileLocation))
@@ -74,17 +66,17 @@ public static void Generate(
else
{
// Ensure desired path exists if generating for the first time.
- var fileInfo = new FileInfo(finalFileLocation);
+ FileInfo fileInfo = new(finalFileLocation);
if (!fileInfo.Directory.Exists)
{
- Directory.CreateDirectory(fileInfo.Directory.FullName);
+ _ = Directory.CreateDirectory(fileInfo.Directory.FullName);
}
}
// Create a buffer that we'll use to check for any duplicated names.
- List enumBuffer = new List();
+ List enumBuffer = new();
- using (StreamWriter writer = new StreamWriter(finalFileLocation))
+ using (StreamWriter writer = new(finalFileLocation))
{
// Start of file
writer.WriteLine("using System;");
@@ -168,9 +160,9 @@ public static void Generate(
if (!enumBuffer.Contains(scriptingBackendString))
scriptingBackendString = NONE;
- // Write Architecture enum.
+ // Write Target enum.
enumBuffer.Clear();
- writer.WriteLine(" public enum Architecture");
+ writer.WriteLine(" public enum Target");
writer.WriteLine(" {");
writer.WriteLine(" {0},", NONE);
enumBuffer.Add(NONE);
@@ -178,11 +170,11 @@ public static void Generate(
{
if (platform.enabled)
{
- foreach (BuildArchitecture arch in platform.architectures)
+ foreach (BuildTarget target in platform.targets)
{
- string addedString = SanitizeString(arch.name);
+ string addedString = SanitizeString(target.name);
- if (arch.enabled && !enumBuffer.Contains(addedString))
+ if (target.enabled && !enumBuffer.Contains(addedString))
{
enumBuffer.Add(addedString);
writer.WriteLine(" {0},", addedString);
@@ -193,9 +185,9 @@ public static void Generate(
writer.WriteLine(" }");
writer.WriteLine();
- // Validate Architecture string.
- if (!enumBuffer.Contains(architectureString))
- architectureString = NONE;
+ // Validate Target string.
+ if (!enumBuffer.Contains(targetString))
+ targetString = NONE;
// Write Distribution enum.
enumBuffer.Clear();
@@ -237,7 +229,7 @@ public static void Generate(
writer.WriteLine(" public const ReleaseType releaseType = ReleaseType.{0};", releaseTypeString);
writer.WriteLine(" public const Platform platform = Platform.{0};", platformString);
writer.WriteLine(" public const ScriptingBackend scriptingBackend = ScriptingBackend.{0};", scriptingBackendString);
- writer.WriteLine(" public const Architecture architecture = Architecture.{0};", architectureString);
+ writer.WriteLine(" public const Target target = Target.{0};", targetString);
writer.WriteLine(" public const Distribution distribution = Distribution.{0};", distributionString);
// End of class.
diff --git a/Editor/Generic/AssetDatabaseUtility.cs b/Editor/Generic/AssetDatabaseUtility.cs
index 4cd6755..b40ed79 100644
--- a/Editor/Generic/AssetDatabaseUtility.cs
+++ b/Editor/Generic/AssetDatabaseUtility.cs
@@ -7,14 +7,6 @@ public static class AssetDatabaseUtility
{
public static void ImportAsset(string path, ImportAssetOptions options = ImportAssetOptions.Default)
{
-#if UNITY_2021_2_OR_NEWER
- // Unity 2021.2+ fixes a bug in older Unity versions that required calling AssetDatabase.SaveAssets() before ImportAsset()
- // See
- // TODO: Update this when fix is backported
-#else
- AssetDatabase.SaveAssets();
-#endif
-
AssetDatabase.ImportAsset(path, options);
}
diff --git a/Editor/Generic/TokensUtility.cs b/Editor/Generic/TokensUtility.cs
index 3a7b951..fc81c64 100644
--- a/Editor/Generic/TokensUtility.cs
+++ b/Editor/Generic/TokensUtility.cs
@@ -8,26 +8,26 @@ namespace SuperUnityBuild.BuildTool
{
public static class TokensUtility
{
- public static string ResolveBuildConfigurationTokens(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildArchitecture architecture, BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime? buildTime)
+ public static string ResolveBuildConfigurationTokens(string prototype, BuildReleaseType releaseType, BuildPlatform platform, BuildTarget target, BuildScriptingBackend scriptingBackend, BuildDistribution distribution, DateTime? buildTime)
{
prototype = ResolveBuildVersionTokens(prototype);
if (buildTime != null)
prototype = ResolveBuildTimeTokens(prototype, (DateTime)buildTime);
- StringBuilder sb = new StringBuilder(prototype);
+ StringBuilder sb = new(prototype);
string variants = "";
if (platform.variants != null && platform.variants.Length > 0)
variants = platform.variantKey.Replace(",", ", ");
- sb.Replace("$RELEASE_TYPE", releaseType?.typeName.SanitizeFolderName());
- sb.Replace("$PLATFORM", platform?.platformName.SanitizeFolderName());
- sb.Replace("$ARCHITECTURE", architecture?.name.SanitizeFolderName());
- sb.Replace("$VARIANTS", variants.SanitizeFolderName());
- sb.Replace("$DISTRIBUTION", distribution?.distributionName.SanitizeFolderName());
- sb.Replace("$PRODUCT_NAME", releaseType?.productName.SanitizeFolderName());
- sb.Replace("$SCRIPTING_BACKEND", scriptingBackend?.name.SanitizeFolderName());
+ _ = sb.Replace("$RELEASE_TYPE", releaseType?.typeName.SanitizeFolderName());
+ _ = sb.Replace("$PLATFORM", platform?.platformName.SanitizeFolderName());
+ _ = sb.Replace("$TARGET", target?.name.SanitizeFolderName());
+ _ = sb.Replace("$VARIANTS", variants.SanitizeFolderName());
+ _ = sb.Replace("$DISTRIBUTION", distribution?.distributionName.SanitizeFolderName());
+ _ = sb.Replace("$PRODUCT_NAME", releaseType?.productName.SanitizeFolderName());
+ _ = sb.Replace("$SCRIPTING_BACKEND", scriptingBackend?.name.SanitizeFolderName());
return sb.ToString();
}
@@ -56,7 +56,7 @@ public static string ResolveBuildTimeTokens(string prototype, DateTime buildTime
public static string ResolveBuildTimeUtilityTokens(string prototype, DateTime buildTime)
{
- StringBuilder sb = new StringBuilder(prototype ?? "");
+ StringBuilder sb = new(prototype ?? "");
// Regex = (?:\$DAYSSINCE\(")([^"]*)(?:"\))
Match match = Regex.Match(prototype, "(?:\\$DAYSSINCE\\(\")([^\"]*)(?:\"\\))");
@@ -66,11 +66,11 @@ public static string ResolveBuildTimeUtilityTokens(string prototype, DateTime bu
buildTime.Subtract(parsedTime).Days :
0;
- sb.Replace(match.Captures[0].Value, daysSince.ToString());
+ _ = sb.Replace(match.Captures[0].Value, daysSince.ToString());
match = match.NextMatch();
}
- sb.Replace("$SECONDS", (buildTime.TimeOfDay.TotalSeconds / 15f).ToString("F0"));
+ _ = sb.Replace("$SECONDS", (buildTime.TimeOfDay.TotalSeconds / 15f).ToString("F0"));
return sb.ToString();
}
@@ -113,13 +113,13 @@ private static string ReplaceTokenFromFile(string prototype, string token, strin
{
string[] lines = textAsset.text.Split("\n");
int index = prototype.IndexOf(token, 0);
- StringBuilder sb = new StringBuilder(prototype);
+ StringBuilder sb = new(prototype);
while (index > -1)
{
string noun = lines[UnityEngine.Random.Range(0, lines.Length - 1)].ToUpperInvariant();
- sb.Replace(token, noun, index, token.Length);
+ _ = sb.Replace(token, noun, index, token.Length);
prototype = sb.ToString();
index = prototype.IndexOf(token, index + 1);
diff --git a/Editor/Notifications/BuildNotificationList.cs b/Editor/Notifications/BuildNotificationList.cs
index 9eb3604..db8ea7d 100644
--- a/Editor/Notifications/BuildNotificationList.cs
+++ b/Editor/Notifications/BuildNotificationList.cs
@@ -14,8 +14,7 @@ public static BuildNotificationList instance
{
get
{
- if (_instance == null)
- _instance = new BuildNotificationList();
+ _instance ??= new BuildNotificationList();
return _instance;
}
@@ -23,17 +22,18 @@ public static BuildNotificationList instance
#endregion
- public List notifications = new List();
- public List warnings = new List();
- public List errors = new List();
+ public List notifications = new();
+ public List warnings = new();
+ public List errors = new();
public BuildNotificationList()
{
+ InitializeErrors();
}
public void AddNotification(BuildNotification notification)
{
- BuildNotification entry = null;
+ BuildNotification entry;
switch (notification.cat)
{
case BuildNotification.Category.Error:
@@ -86,30 +86,39 @@ public void RefreshNotifications()
public void Remove(BuildNotification notification)
{
- BuildNotification entry = null;
+ BuildNotification entry;
switch (notification.cat)
{
case BuildNotification.Category.Error:
entry = FindDuplicate(notification, errors);
if (entry != null)
- errors.Remove(entry);
+ _ = errors.Remove(entry);
break;
case BuildNotification.Category.Warning:
entry = FindDuplicate(notification, warnings);
if (entry != null)
- warnings.Remove(entry);
+ _ = warnings.Remove(entry);
break;
case BuildNotification.Category.Notification:
entry = FindDuplicate(notification, notifications);
if (entry != null)
- notifications.Remove(entry);
+ _ = notifications.Remove(entry);
break;
}
}
- public void InitializeErrors()
+ public void Reset()
+ {
+ notifications.Clear();
+ warnings.Clear();
+ errors.Clear();
+
+ _instance = null;
+ }
+
+ private void InitializeErrors()
{
AddNotification(new BuildNotification(
BuildNotification.Category.Error,
@@ -121,7 +130,7 @@ public void InitializeErrors()
AddNotification(new BuildNotification(
BuildNotification.Category.Error,
"No Build Platform Found",
- "At least one Build Platform with one enabled Architecture is required to perform a build.",
+ "At least one Build Platform with one enabled Target is required to perform a build.",
false,
() =>
{
@@ -133,7 +142,7 @@ public void InitializeErrors()
for (int i = 0; i < platformCount; i++)
{
BuildPlatform platform = BuildSettings.platformList.platforms[i];
- if (platform.enabled && platform.atLeastOneArch && platform.atLeastOneBackend)
+ if (platform.enabled && platform.atLeastOneTarget && platform.atLeastOneBackend)
{
validError = false;
break;
diff --git a/package.json b/package.json
index 321a468..4b796c7 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"name": "com.github.superunitybuild.buildtool",
"displayName": "SuperUnityBuild",
- "version": "7.0.0",
- "unity": "2020.3",
+ "version": "8.0.0-pre.1",
+ "unity": "2021.3",
"description": "SuperUnityBuild is a Unity utility that automates the process of generating builds. It's easy and quick enough to use on small apps, but it's also powerful and extensible enough to be extremely useful on larger projects. The key to this flexibility lies in SuperUnityBuild's configurable degrees of granularity and its BuildActions framework which allows additional operations to be added into the build process.",
"changelogUrl": "https://github.com/superunitybuild/buildtool/releases",
"documentationUrl": "https://github.com/superunitybuild/buildtool/wiki",