From 41475d5a0a5c7b99f40dc389389f87a68640b3b9 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 09:28:28 +0300 Subject: [PATCH 01/19] Added stylecop.analyzers and updated gitignore --- .gitignore | 9 ++++++++- Assets/packages.config | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d1d3c22..c49cb9f 100644 --- a/.gitignore +++ b/.gitignore @@ -97,4 +97,11 @@ InitTestScene*.unity* /[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta # Auto-generated scenes by play mode tests -/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity* \ No newline at end of file +/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity* + +# NuGet Importer / NuGetForUnity +/[Aa]ssets/[Pp]ackages/ +/[Aa]ssets/[Pp]ackages.meta +/[Pp]ackages/* +!/[Pp]ackages/manifest.json +!/[Pp]ackages/packages-lock.json \ No newline at end of file diff --git a/Assets/packages.config b/Assets/packages.config index 116aaac..5cae4b2 100644 --- a/Assets/packages.config +++ b/Assets/packages.config @@ -5,6 +5,7 @@ + From a7fa7a813fa596e087a2756368acfd69a014fda1 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 10:27:52 +0300 Subject: [PATCH 02/19] Cleaned up .editorconfig and added a sample file --- .editorconfig | 335 +----------------- .../_Project/Scripts/Data/CodeStyleSample.cs | 223 ++++++++++++ .../Scripts/Data/CodeStyleSample.cs.meta | 3 + 3 files changed, 239 insertions(+), 322 deletions(-) create mode 100644 Assets/_Project/Scripts/Data/CodeStyleSample.cs create mode 100644 Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta diff --git a/.editorconfig b/.editorconfig index 36a9d30..6f1ec40 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,332 +1,23 @@ -# editorconfig.org - root = true [*] -insert_final_newline = false -indent_style = space -indent_size = 4 -charset = utf-8-bom -end_of_line = crlf -trim_trailing_whitespace = false - -# Microsoft .NET properties -csharp_new_line_before_members_in_object_initializers = false -csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion -csharp_style_prefer_utf8_string_literals = true:suggestion -csharp_style_var_elsewhere = true:suggestion -csharp_style_var_for_built_in_types = true:suggestion -csharp_style_var_when_type_is_apparent = true:suggestion -dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none -dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none -dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion -dotnet_style_predefined_type_for_member_access = true:suggestion -dotnet_style_qualification_for_event = false:suggestion -dotnet_style_qualification_for_field = false:suggestion -dotnet_style_qualification_for_method = false:suggestion -dotnet_style_qualification_for_property = false:suggestion -dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion - -# ReSharper properties -resharper_autodetect_indent_settings = true -resharper_csharp_insert_final_newline = false -resharper_formatter_off_tag = @formatter:off -resharper_formatter_on_tag = @formatter:on -resharper_formatter_tags_enabled = true -resharper_fsharp_insert_final_newline = false -resharper_html_insert_final_newline = false -resharper_resx_insert_final_newline = false -resharper_shaderlab_insert_final_newline = false -resharper_T4_insert_final_newline = false -resharper_use_indent_from_vs = false -resharper_vb_insert_final_newline = false -resharper_xmldoc_insert_final_newline = false -resharper_xml_insert_final_newline = false - -# ReSharper inspection severities -resharper_arrange_redundant_parentheses_highlighting = hint -resharper_arrange_this_qualifier_highlighting = hint -resharper_arrange_type_member_modifiers_highlighting = hint -resharper_arrange_type_modifiers_highlighting = hint -resharper_built_in_type_reference_style_for_member_access_highlighting = hint -resharper_built_in_type_reference_style_highlighting = hint -resharper_mvc_action_not_resolved_highlighting = warning -resharper_mvc_area_not_resolved_highlighting = warning -resharper_mvc_controller_not_resolved_highlighting = warning -resharper_mvc_masterpage_not_resolved_highlighting = warning -resharper_mvc_partial_view_not_resolved_highlighting = warning -resharper_mvc_template_not_resolved_highlighting = warning -resharper_mvc_view_component_not_resolved_highlighting = warning -resharper_mvc_view_component_view_not_resolved_highlighting = warning -resharper_mvc_view_not_resolved_highlighting = warning -resharper_razor_assembly_not_resolved_highlighting = warning -resharper_redundant_base_qualifier_highlighting = warning -resharper_suggest_var_or_type_built_in_types_highlighting = hint -resharper_suggest_var_or_type_elsewhere_highlighting = hint -resharper_suggest_var_or_type_simple_types_highlighting = hint -resharper_web_config_module_not_resolved_highlighting = warning -resharper_web_config_type_not_resolved_highlighting = warning -resharper_web_config_wrong_module_highlighting = warning - -# Code quality analyzers -dotnet_analyzer_diagnostic.category-security.severity = error -dotnet_code_quality.ca1802.api_surface = private, internal - -# name all constant fields using PascalCase -dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields -dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style -dotnet_naming_symbols.constant_fields.applicable_kinds = field -dotnet_naming_symbols.constant_fields.required_modifiers = const -dotnet_naming_style.pascal_case_style.capitalization = pascal_case - -# static fields should have s_ prefix -dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion -dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields -dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style -dotnet_naming_symbols.static_fields.applicable_kinds = field -dotnet_naming_symbols.static_fields.required_modifiers = static -dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected -dotnet_naming_style.static_prefix_style.required_prefix = s_ -dotnet_naming_style.static_prefix_style.capitalization = camel_case - -# internal and private fields should be _camelCase -dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion -dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields -dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style -dotnet_naming_symbols.private_internal_fields.applicable_kinds = field -dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal -dotnet_naming_style.camel_case_underscore_style.required_prefix = _ -dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case - -# Code quality -dotnet_style_readonly_field = true:suggestion -dotnet_code_quality_unused_parameters = non_public:suggestion - -# Expression-level preferences -dotnet_style_object_initializer = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_auto_properties = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true -dotnet_style_prefer_conditional_expression_over_return = true - -# C# files -[*.cs] -max_line_length = 120 -resharper_csharp_max_line_length = 120 - -# New line preferences -csharp_new_line_before_open_brace = all -csharp_new_line_before_else = true -csharp_new_line_before_catch = true -csharp_new_line_before_finally = true -csharp_new_line_before_members_in_object_initializers = true -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_between_query_expression_clauses = true -resharper_csharp_keep_user_linebreaks = false -resharper_csharp_keep_existing_linebreaks = false -resharper_csharp_keep_existing_arrangement = false - -# Method and constructor declarations: simple wrap, never chop. -resharper_csharp_wrap_parameters_style = wrap_if_long -resharper_csharp_max_formal_parameters_on_line = 100 -resharper_csharp_keep_existing_declaration_parens_arrangement = false -resharper_csharp_wrap_before_declaration_lpar = false -resharper_csharp_wrap_after_declaration_lpar = false -resharper_csharp_wrap_before_declaration_rpar = false - -# Record and C# 12 primary constructors: simple wrap, never chop. -resharper_csharp_wrap_primary_constructor_parameters_style = wrap_if_long -resharper_csharp_max_primary_constructor_parameters_on_line = 100 -resharper_csharp_keep_existing_primary_constructor_declaration_parens_arrangement = false -resharper_csharp_wrap_before_primary_constructor_declaration_lpar = false -resharper_csharp_wrap_after_primary_constructor_declaration_lpar = false -resharper_csharp_wrap_before_primary_constructor_declaration_rpar = false - -# Method and constructor invocations: simple wrap, never chop. -resharper_csharp_wrap_arguments_style = wrap_if_long -resharper_csharp_max_invocation_arguments_on_line = 100 -resharper_csharp_keep_existing_invocation_parens_arrangement = false -resharper_csharp_wrap_before_invocation_lpar = false -resharper_csharp_wrap_after_invocation_lpar = false -resharper_csharp_wrap_before_invocation_rpar = false - -resharper_csharp_align_multiline_parameter = false -resharper_csharp_align_multiline_argument = false - -# Expression-bodied methods: put the arrow and expression together on the next line. -resharper_csharp_keep_existing_expr_member_arrangement = false -resharper_csharp_place_expr_method_on_single_line = false -resharper_csharp_wrap_before_arrow_with_expressions = true - -# Enum declarations: always chop, unlike other lists. -resharper_csharp_wrap_enum_declaration = chop_always -resharper_csharp_max_enum_members_on_line = 100 - -# 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_switch_labels = true -csharp_indent_labels = one_less_than_current - -# Modifier preferences -csharp_preferred_modifier_order = public, private, protected, internal, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:suggestion - -# Code style defaults -csharp_using_directive_placement = outside_namespace:error -csharp_prefer_braces = true -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = false -csharp_prefer_static_local_function = true:suggestion -csharp_prefer_simple_using_statement = false:none -csharp_style_prefer_switch_expression = true:suggestion - -# Expression-bodied members -csharp_style_expression_bodied_methods = true -csharp_style_expression_bodied_constructors = true -csharp_style_expression_bodied_operators = true -csharp_style_expression_bodied_properties = true -csharp_style_expression_bodied_indexers = true -csharp_style_expression_bodied_accessors = true -csharp_style_expression_bodied_lambdas = true -csharp_style_expression_bodied_local_functions = true - -# Pattern matching -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion - -# Expression-level preferences -csharp_prefer_simple_default_expression = true:suggestion - -# Null checking preferences -csharp_style_throw_expression = true:suggestion -csharp_style_conditional_delegate_call = true:suggestion - -# Other features -csharp_style_prefer_index_operator = false:none -csharp_style_prefer_range_operator = false:none -csharp_style_pattern_local_over_anonymous_function = false:none - -# 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_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 - -# Types: use keywords instead of BCL types, and permit var only when the type is clear -csharp_style_var_for_built_in_types = false:suggestion -csharp_style_var_when_type_is_apparent = false:none -csharp_style_var_elsewhere = false:suggestion - -# Xml project files -[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] -indent_size = 2 - -# Xml build files -[*.builds] -indent_size = 2 - -# Xml files -[*.{xml,stylecop,resx,ruleset}] -indent_size = 2 - -# Xml config files -[*.{props,targets,config,nuspec}] -indent_size = 2 - -# Shell scripts -[*.sh] +charset = utf-8 end_of_line = lf - -[*.{cmd, bat}] -end_of_line = crlf - -[{*.har,*.jsb2,*.jsb3,*.json,*.jsonc,*.postman_collection,*.postman_collection.json,*.postman_environment,*.postman_environment.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,.ws-context,bowerrc,jest.config}] -indent_style = space -indent_size = 2 - -[{*.yaml,*.yml}] -indent_style = space -indent_size = 2 - -[*.{appxmanifest,asax,ascx,aspx,axaml,build,c,c++,c++m,cc,ccm,cginc,compute,cp,cpp,cppm,cs,cshtml,cu,cuh,cxx,cxxm,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,mxx,nuspec,paml,razor,resw,resx,shader,skin,tpp,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}] indent_style = space indent_size = 4 tab_width = 4 +insert_final_newline = true +trim_trailing_whitespace = true -#CUSTOM - -#STYLE COP ANALYZERS -dotnet_diagnostic.sa1200.severity = none -dotnet_diagnostic.sa1309.severity = none -dotnet_diagnostic.SA1101.severity = none -dotnet_diagnostic.SA1600.severity = none -dotnet_diagnostic.SA1503.severity = none -dotnet_diagnostic.SA1206.severity = none -dotnet_diagnostic.SA1313.severity = none -dotnet_diagnostic.SA1010.severity = none -dotnet_diagnostic.SA1200.severity = none -dotnet_diagnostic.SA1601.severity = none -dotnet_diagnostic.SA1106.severity = none -dotnet_diagnostic.SA1024.severity = none -dotnet_diagnostic.SA1009.severity = none -dotnet_diagnostic.SA1000.severity = none -dotnet_diagnostic.SA1009.severity = none -dotnet_diagnostic.SA1011.severity = none -dotnet_diagnostic.SA1101.severity = none -dotnet_diagnostic.SA1633.severity = none -dotnet_diagnostic.SA1201.severity = none -dotnet_diagnostic.SA1116.severity = none -dotnet_diagnostic.SA1117.severity = none - -# Отключаем или меняем уровень серьезности предупреждения SA1310, чтобы не конфликтовало с новыми правилами. -dotnet_diagnostic.SA1310.severity = none - -# Определяем символы для публичных констант -dotnet_naming_symbols.public_constants.applicable_kinds = field -dotnet_naming_symbols.public_constants.applicable_accessibilities = public -dotnet_naming_symbols.public_constants.required_modifiers = const +[*.cs] +# Стандартные настройки C# +csharp_new_line_before_open_brace = all -# Применяем стиль к символам: -dotnet_naming_rule.public_constants_rule.symbols = public_constants -dotnet_naming_rule.public_constants_rule.style = public_constants_style -dotnet_naming_rule.public_constants_rule.severity = suggestion - -# Настройка правил именования для приватных статических полей -dotnet_naming_rule.private_static_fields_should_have_underscore.symbols = private_static_fields -dotnet_naming_rule.private_static_fields_should_have_underscore.style = underscore_prefix_style -dotnet_naming_rule.private_static_fields_should_have_underscore.severity = suggestion - -dotnet_naming_symbols.private_static_fields.applicable_kinds = field -dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private -dotnet_naming_symbols.private_static_fields.required_modifiers = static +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = true:suggestion -dotnet_naming_style.underscore_prefix_style.capitalization = camel_case -dotnet_naming_style.underscore_prefix_style.required_prefix = _ +# Подробные настройки Rider +resharper_csharp_wrap_arguments_style = chop_if_long +resharper_csharp_wrap_parameters_style = chop_if_long +resharper_csharp_wrap_chained_method_calls = chop_if_long \ No newline at end of file diff --git a/Assets/_Project/Scripts/Data/CodeStyleSample.cs b/Assets/_Project/Scripts/Data/CodeStyleSample.cs new file mode 100644 index 0000000..a2594dd --- /dev/null +++ b/Assets/_Project/Scripts/Data/CodeStyleSample.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace _Project.Data +{ + public enum CharacterState + { + Idle, Walking, Attacking, + Dead, + } + + public delegate void HealthChangedHandler(int previousHealth, int currentHealth); + + public interface IDamageable + { + int Health { get; } + + bool IsAlive { get; } + + void TakeDamage(int damage); + } + + public sealed class Character : IDamageable + { + public const int MaximumHealth = 100; + + private const string DefaultName = "Character"; + + public static readonly Character Empty = new Character(DefaultName); + + private static int instanceCount; + + private readonly Guid id; + + private string characterName; + + private int health; + + public Character() + : this(DefaultName) + { + } + + public Character(string characterName) + { + this.id = Guid.NewGuid(); + this.characterName = characterName; + this.health = MaximumHealth; + + instanceCount++; + } + + public event HealthChangedHandler HealthChanged; + + public static int InstanceCount => instanceCount; + + public Guid Id => this.id; + + public int Health => this.health; + + public bool IsAlive => this.health > 0; + + public CharacterState State { get; private set; } + + public string CharacterName + { + get => this.characterName; + set + { + if (string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException( + "Character name cannot be empty.", + nameof(value)); + } + + this.characterName = value; + } + } + + public string this[int index] + { + get + { + return index switch + { + 0 => this.CharacterName, + 1 => this.Health.ToString(), + _ => throw new IndexOutOfRangeException(), + }; + } + } + + public static Character Create(string characterName) + { + return new Character(characterName); + } + + public void TakeDamage(int damage) + { + if (damage < 0) + { + throw new ArgumentOutOfRangeException(nameof(damage)); + } + + int previousHealth = this.health; + + this.health = Math.Max(0, this.health - damage); + + this.HealthChanged?.Invoke(previousHealth, this.health); + + if (!this.IsAlive) + { + this.State = CharacterState.Dead; + } + } + + public void Heal(int amount = 10) + { + if (amount <= 0) + { + return; + } + + int previousHealth = this.health; + + this.health = Math.Min(MaximumHealth, this.health + amount); + + this.HealthChanged?.Invoke(previousHealth, this.health); + } + + public TResult Convert(Func converter) + { + throw new ArgumentNullException(converter.ToString()); + + return converter(this); + } + + public async Task AttackAsync( + Character target, + int damage, + TimeSpan delay) + { + throw new ArgumentNullException(target.ToString()); + + await Task.Delay(delay); + + target.TakeDamage(damage); + this.State = CharacterState.Attacking; + } + + public IEnumerable GetHealthHistory(int step) + { + if (step <= 0) + { + throw new ArgumentOutOfRangeException(nameof(step)); + } + + for (int value = this.health; value >= 0; value -= step) + { + yield return value; + } + } + + public override string ToString() + { + return $"{this.CharacterName}: {this.Health}/{MaximumHealth}"; + } + + private static bool IsValidDamage(int damage) + { + return damage > 0; + } + + private void ResetState() + { + this.State = CharacterState.Idle; + } + + public readonly struct CharacterSnapshot + { + public CharacterSnapshot( + string characterName, + int health, + CharacterState state) + { + this.CharacterName = characterName; + this.Health = health; + this.State = state; + } + + public string CharacterName { get; } + + public int Health { get; } + + public CharacterState State { get; } + } + + private sealed class CharacterComparer : IComparer + { + public int Compare(Character first, Character second) + { + if (ReferenceEquals(first, second)) + { + return 0; + } + + if (first is null) + { + return -1; + } + + if (second is null) + { + return 1; + } + + return first.Health.CompareTo(second.Health); + } + } + } +} diff --git a/Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta b/Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta new file mode 100644 index 0000000..f6534f8 --- /dev/null +++ b/Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ba837c8694974f428690267eb53b3e99 +timeCreated: 1784877158 \ No newline at end of file From ddc57d0c6d1a3f3a30e5424e41d0b4f24f462a57 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:01:50 +0300 Subject: [PATCH 03/19] Added bash script for quick format check --- .editorconfig | 5 ++++- .gitattributes | 1 + format_check.sh | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 format_check.sh diff --git a/.editorconfig b/.editorconfig index 6f1ec40..7704cf9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,6 +9,7 @@ tab_width = 4 insert_final_newline = true trim_trailing_whitespace = true +# noinspection EditorConfigKeyCorrectness [*.cs] # Стандартные настройки C# csharp_new_line_before_open_brace = all @@ -20,4 +21,6 @@ csharp_style_var_elsewhere = true:suggestion # Подробные настройки Rider resharper_csharp_wrap_arguments_style = chop_if_long resharper_csharp_wrap_parameters_style = chop_if_long -resharper_csharp_wrap_chained_method_calls = chop_if_long \ No newline at end of file +resharper_csharp_wrap_chained_method_calls = chop_if_long + +dotnet_diagnostic.SA1200.severity = none \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index fd82082..bcb7ca4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ *.png filter=lfs diff=lfs merge=lfs -text *.jpeg filter=lfs diff=lfs merge=lfs -text *.psd filter=lfs diff=lfs merge=lfs -text +*.sh text eol=lf diff --git a/format_check.sh b/format_check.sh new file mode 100644 index 0000000..946e0ed --- /dev/null +++ b/format_check.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +set -eu + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +cd "$SCRIPT_DIR" + +dotnet format UnityTemplateURP.sln --verify-no-changes --no-restore --include Assets/_Project/Scripts From 63b1fa06d732d1af38d079e0fcca6a56323348e7 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:19:55 +0300 Subject: [PATCH 04/19] Update on editorconfig for enum --- .editorconfig | 10 +++++++++- Assets/_Project/Scripts/Data/CodeStyleSample.cs | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 7704cf9..f858746 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,4 +23,12 @@ resharper_csharp_wrap_arguments_style = chop_if_long resharper_csharp_wrap_parameters_style = chop_if_long resharper_csharp_wrap_chained_method_calls = chop_if_long -dotnet_diagnostic.SA1200.severity = none \ No newline at end of file +# usings inside namespace +dotnet_diagnostic.SA1200.severity = none + +# Documentation on Enum, Enum elements +dotnet_diagnostic.SA1600.severity = none +dotnet_diagnostic.SA1602.severity = none +resharper_csharp_place_simple_enum_on_single_line = false +resharper_csharp_keep_existing_enum_arrangement = false +resharper_csharp_max_enum_members_on_line = 1 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Data/CodeStyleSample.cs b/Assets/_Project/Scripts/Data/CodeStyleSample.cs index a2594dd..e71cbfb 100644 --- a/Assets/_Project/Scripts/Data/CodeStyleSample.cs +++ b/Assets/_Project/Scripts/Data/CodeStyleSample.cs @@ -6,7 +6,9 @@ namespace _Project.Data { public enum CharacterState { - Idle, Walking, Attacking, + Idle, + Walking, + Attacking, Dead, } From 34b788ca84212f751d7e48e9735c0a6a3c742fc1 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:27:01 +0300 Subject: [PATCH 05/19] Temporary code style asmdef --- Assets/_Project/Scripts/Test.meta | 8 ++++++++ .../CodeStyleSample.cs => Test/Character.cs} | 19 ------------------- .../_Project/Scripts/Test/Character.cs.meta | 3 +++ .../_Project/Scripts/Test/CharacterState.cs | 10 ++++++++++ .../Scripts/Test/CharacterState.cs.meta | 3 +++ .../_Project/Scripts/Test/CodeStyleSample.cs | 4 ++++ .../{Data => Test}/CodeStyleSample.cs.meta | 0 Assets/_Project/Scripts/Test/IDamageable.cs | 11 +++++++++++ .../_Project/Scripts/Test/IDamageable.cs.meta | 3 +++ .../Scripts/Test/_Project.Test.asmdef | 3 +++ .../Scripts/Test/_Project.Test.asmdef.meta | 7 +++++++ 11 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 Assets/_Project/Scripts/Test.meta rename Assets/_Project/Scripts/{Data/CodeStyleSample.cs => Test/Character.cs} (93%) create mode 100644 Assets/_Project/Scripts/Test/Character.cs.meta create mode 100644 Assets/_Project/Scripts/Test/CharacterState.cs create mode 100644 Assets/_Project/Scripts/Test/CharacterState.cs.meta create mode 100644 Assets/_Project/Scripts/Test/CodeStyleSample.cs rename Assets/_Project/Scripts/{Data => Test}/CodeStyleSample.cs.meta (100%) create mode 100644 Assets/_Project/Scripts/Test/IDamageable.cs create mode 100644 Assets/_Project/Scripts/Test/IDamageable.cs.meta create mode 100644 Assets/_Project/Scripts/Test/_Project.Test.asmdef create mode 100644 Assets/_Project/Scripts/Test/_Project.Test.asmdef.meta diff --git a/Assets/_Project/Scripts/Test.meta b/Assets/_Project/Scripts/Test.meta new file mode 100644 index 0000000..2fb2fbd --- /dev/null +++ b/Assets/_Project/Scripts/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7444d7fd8cc42feaa9387e01660d878 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Data/CodeStyleSample.cs b/Assets/_Project/Scripts/Test/Character.cs similarity index 93% rename from Assets/_Project/Scripts/Data/CodeStyleSample.cs rename to Assets/_Project/Scripts/Test/Character.cs index e71cbfb..c7fd4cc 100644 --- a/Assets/_Project/Scripts/Data/CodeStyleSample.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -4,25 +4,6 @@ namespace _Project.Data { - public enum CharacterState - { - Idle, - Walking, - Attacking, - Dead, - } - - public delegate void HealthChangedHandler(int previousHealth, int currentHealth); - - public interface IDamageable - { - int Health { get; } - - bool IsAlive { get; } - - void TakeDamage(int damage); - } - public sealed class Character : IDamageable { public const int MaximumHealth = 100; diff --git a/Assets/_Project/Scripts/Test/Character.cs.meta b/Assets/_Project/Scripts/Test/Character.cs.meta new file mode 100644 index 0000000..831f4d2 --- /dev/null +++ b/Assets/_Project/Scripts/Test/Character.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 04a9574dda4a483e9d5b9a7241a53a80 +timeCreated: 1784885191 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Test/CharacterState.cs b/Assets/_Project/Scripts/Test/CharacterState.cs new file mode 100644 index 0000000..b19a91a --- /dev/null +++ b/Assets/_Project/Scripts/Test/CharacterState.cs @@ -0,0 +1,10 @@ +namespace _Project.Data +{ + public enum CharacterState + { + Idle, + Walking, + Attacking, + Dead, + } +} diff --git a/Assets/_Project/Scripts/Test/CharacterState.cs.meta b/Assets/_Project/Scripts/Test/CharacterState.cs.meta new file mode 100644 index 0000000..f8e4288 --- /dev/null +++ b/Assets/_Project/Scripts/Test/CharacterState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f97cce634ae04039bf8782d3aea05c83 +timeCreated: 1784885171 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Test/CodeStyleSample.cs b/Assets/_Project/Scripts/Test/CodeStyleSample.cs new file mode 100644 index 0000000..8b931cd --- /dev/null +++ b/Assets/_Project/Scripts/Test/CodeStyleSample.cs @@ -0,0 +1,4 @@ +namespace _Project.Data +{ + public delegate void HealthChangedHandler(int previousHealth, int currentHealth); +} diff --git a/Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta b/Assets/_Project/Scripts/Test/CodeStyleSample.cs.meta similarity index 100% rename from Assets/_Project/Scripts/Data/CodeStyleSample.cs.meta rename to Assets/_Project/Scripts/Test/CodeStyleSample.cs.meta diff --git a/Assets/_Project/Scripts/Test/IDamageable.cs b/Assets/_Project/Scripts/Test/IDamageable.cs new file mode 100644 index 0000000..b5fcd4c --- /dev/null +++ b/Assets/_Project/Scripts/Test/IDamageable.cs @@ -0,0 +1,11 @@ +namespace _Project.Data +{ + public interface IDamageable + { + int Health { get; } + + bool IsAlive { get; } + + void TakeDamage(int damage); + } +} diff --git a/Assets/_Project/Scripts/Test/IDamageable.cs.meta b/Assets/_Project/Scripts/Test/IDamageable.cs.meta new file mode 100644 index 0000000..2b438d4 --- /dev/null +++ b/Assets/_Project/Scripts/Test/IDamageable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5071c61acf0441e99fee7e3a3a2d5e25 +timeCreated: 1784885186 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Test/_Project.Test.asmdef b/Assets/_Project/Scripts/Test/_Project.Test.asmdef new file mode 100644 index 0000000..e71a389 --- /dev/null +++ b/Assets/_Project/Scripts/Test/_Project.Test.asmdef @@ -0,0 +1,3 @@ +{ + "name": "_Project.Test" +} diff --git a/Assets/_Project/Scripts/Test/_Project.Test.asmdef.meta b/Assets/_Project/Scripts/Test/_Project.Test.asmdef.meta new file mode 100644 index 0000000..e6f7cfe --- /dev/null +++ b/Assets/_Project/Scripts/Test/_Project.Test.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b704bbc2cfe78754dbecb6ea072f9433 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 46575756afecb54dd36508f7aa7f39ec04ee9421 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:42:41 +0300 Subject: [PATCH 06/19] Updated wrap over chop for long lines --- .editorconfig | 19 ++++--- Assets/_Project/Scripts/Test/Character.cs | 65 ++++++++++------------- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/.editorconfig b/.editorconfig index f858746..8c4e7dc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,7 @@ trim_trailing_whitespace = true # noinspection EditorConfigKeyCorrectness [*.cs] + # Стандартные настройки C# csharp_new_line_before_open_brace = all @@ -18,17 +19,21 @@ csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion -# Подробные настройки Rider -resharper_csharp_wrap_arguments_style = chop_if_long -resharper_csharp_wrap_parameters_style = chop_if_long -resharper_csharp_wrap_chained_method_calls = chop_if_long +resharper_csharp_wrap_arguments_style = wrap_if_long +resharper_csharp_max_invocation_arguments_on_line = 10 +resharper_csharp_keep_user_linebreaks = false -# usings inside namespace -dotnet_diagnostic.SA1200.severity = none +# using block +dotnet_diagnostic.SA1200.severity = none # move usings inside namespace +dotnet_diagnostic.SA1633.severity = none # obligatory file header +dotnet_diagnostic.SA1300.severity = none # _Project. namespace to be changed # Documentation on Enum, Enum elements dotnet_diagnostic.SA1600.severity = none dotnet_diagnostic.SA1602.severity = none resharper_csharp_place_simple_enum_on_single_line = false resharper_csharp_keep_existing_enum_arrangement = false -resharper_csharp_max_enum_members_on_line = 1 \ No newline at end of file +resharper_csharp_max_enum_members_on_line = 1k + +# fields, properties, methods +dotnet_diagnostic.SA1309.severity = none \ No newline at end of file diff --git a/Assets/_Project/Scripts/Test/Character.cs b/Assets/_Project/Scripts/Test/Character.cs index c7fd4cc..215a6cc 100644 --- a/Assets/_Project/Scripts/Test/Character.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using UnityEngine; namespace _Project.Data { @@ -8,57 +9,55 @@ public sealed class Character : IDamageable { public const int MaximumHealth = 100; - private const string DefaultName = "Character"; - public static readonly Character Empty = new Character(DefaultName); - private static int instanceCount; + private const string DefaultName = "Character"; + + private static int _instanceCount; - private readonly Guid id; + private readonly Guid _id; - private string characterName; + private string _characterName; + private static string characterName; - private int health; + private int _health; - public Character() - : this(DefaultName) + public Character() : this(DefaultName) { } public Character(string characterName) { - this.id = Guid.NewGuid(); - this.characterName = characterName; - this.health = MaximumHealth; + this._id = Guid.NewGuid(); + this._characterName = characterName; + this._health = MaximumHealth; - instanceCount++; + _instanceCount++; } public event HealthChangedHandler HealthChanged; - public static int InstanceCount => instanceCount; + public static int InstanceCount => _instanceCount; - public Guid Id => this.id; + public Guid Id => this._id; - public int Health => this.health; + public int Health => this._health; - public bool IsAlive => this.health > 0; + public bool IsAlive => this._health > 0; public CharacterState State { get; private set; } public string CharacterName { - get => this.characterName; + get => this._characterName; set { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException( - "Character name cannot be empty.", - nameof(value)); + throw new ArgumentException("Character name cannot be empty.", nameof(value)); } - this.characterName = value; + this._characterName = value; } } @@ -87,11 +86,11 @@ public void TakeDamage(int damage) throw new ArgumentOutOfRangeException(nameof(damage)); } - int previousHealth = this.health; + int previousHealth = this._health; - this.health = Math.Max(0, this.health - damage); + this._health = Math.Max(0, this._health - damage); - this.HealthChanged?.Invoke(previousHealth, this.health); + this.HealthChanged?.Invoke(previousHealth, this._health); if (!this.IsAlive) { @@ -106,11 +105,11 @@ public void Heal(int amount = 10) return; } - int previousHealth = this.health; + int previousHealth = this._health; - this.health = Math.Min(MaximumHealth, this.health + amount); + this._health = Math.Min(MaximumHealth, this._health + amount); - this.HealthChanged?.Invoke(previousHealth, this.health); + this.HealthChanged?.Invoke(previousHealth, this._health); } public TResult Convert(Func converter) @@ -120,10 +119,7 @@ public TResult Convert(Func converter) return converter(this); } - public async Task AttackAsync( - Character target, - int damage, - TimeSpan delay) + public async Task AttackAsync(Character target, int damage, TimeSpan delay) { throw new ArgumentNullException(target.ToString()); @@ -140,7 +136,7 @@ public IEnumerable GetHealthHistory(int step) throw new ArgumentOutOfRangeException(nameof(step)); } - for (int value = this.health; value >= 0; value -= step) + for (int value = this._health; value >= 0; value -= step) { yield return value; } @@ -163,10 +159,7 @@ private void ResetState() public readonly struct CharacterSnapshot { - public CharacterSnapshot( - string characterName, - int health, - CharacterState state) + public CharacterSnapshot(string characterName, int health, CharacterState state) { this.CharacterName = characterName; this.Health = health; From 1e08b56ec2188e06e47f36dd465453a937754b8e Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:44:39 +0300 Subject: [PATCH 07/19] Now single argument stays on the same line --- .editorconfig | 4 +++- Assets/_Project/Scripts/Test/Character.cs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 8c4e7dc..726581a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,9 +19,11 @@ csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion +# wrap over chop, long arguments resharper_csharp_wrap_arguments_style = wrap_if_long resharper_csharp_max_invocation_arguments_on_line = 10 resharper_csharp_keep_user_linebreaks = false +dotnet_diagnostic.SA1116.severity = none # using block dotnet_diagnostic.SA1200.severity = none # move usings inside namespace @@ -36,4 +38,4 @@ resharper_csharp_keep_existing_enum_arrangement = false resharper_csharp_max_enum_members_on_line = 1k # fields, properties, methods -dotnet_diagnostic.SA1309.severity = none \ No newline at end of file +dotnet_diagnostic.SA1309.severity = none diff --git a/Assets/_Project/Scripts/Test/Character.cs b/Assets/_Project/Scripts/Test/Character.cs index 215a6cc..a681cc8 100644 --- a/Assets/_Project/Scripts/Test/Character.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -18,7 +18,6 @@ public sealed class Character : IDamageable private readonly Guid _id; private string _characterName; - private static string characterName; private int _health; @@ -54,7 +53,8 @@ public string CharacterName { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException("Character name cannot be empty.", nameof(value)); + throw new ArgumentException("Character name caaracter name cannot aracter name cannot aracnnot n.", + nameof(value)); } this._characterName = value; From b72322e14a35c06c0dbde5070a2a1a1fa90be7c0 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:21:19 +0300 Subject: [PATCH 08/19] Updated Stylecop, added team-shared DotSettings --- .editorconfig | 1 + .gitignore | 3 +- Assets/_Project/Scripts/Test/Character.cs | 108 +++---- Assets/packages.config | 2 +- UnityTemplateURP.sln.DotSettings | 349 ++++++++++++++++++++++ 5 files changed, 394 insertions(+), 69 deletions(-) create mode 100644 UnityTemplateURP.sln.DotSettings diff --git a/.editorconfig b/.editorconfig index 726581a..faef053 100644 --- a/.editorconfig +++ b/.editorconfig @@ -39,3 +39,4 @@ resharper_csharp_max_enum_members_on_line = 1k # fields, properties, methods dotnet_diagnostic.SA1309.severity = none +dotnet_diagnostic.SA1128.severity = none # let public ClassName : this() without new line after : \ No newline at end of file diff --git a/.gitignore b/.gitignore index c49cb9f..6095699 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ # Visual Studio cache directory .vs/ .idea +!.idea/UnityTemplateURP.sln.DotSettings # Gradle cache directory .gradle/ @@ -104,4 +105,4 @@ InitTestScene*.unity* /[Aa]ssets/[Pp]ackages.meta /[Pp]ackages/* !/[Pp]ackages/manifest.json -!/[Pp]ackages/packages-lock.json \ No newline at end of file +!/[Pp]ackages/packages-lock.json diff --git a/Assets/_Project/Scripts/Test/Character.cs b/Assets/_Project/Scripts/Test/Character.cs index a681cc8..94fe118 100644 --- a/Assets/_Project/Scripts/Test/Character.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using UnityEngine; namespace _Project.Data { @@ -9,10 +8,11 @@ public sealed class Character : IDamageable { public const int MaximumHealth = 100; - public static readonly Character Empty = new Character(DefaultName); + public static readonly Character Empty = new(DefaultName); private const string DefaultName = "Character"; + private static int _instanceCount; private readonly Guid _id; @@ -27,37 +27,29 @@ public Character() : this(DefaultName) public Character(string characterName) { - this._id = Guid.NewGuid(); - this._characterName = characterName; - this._health = MaximumHealth; + _id = Guid.NewGuid(); + _characterName = characterName; + _health = MaximumHealth; _instanceCount++; } - public event HealthChangedHandler HealthChanged; - public static int InstanceCount => _instanceCount; - public Guid Id => this._id; - - public int Health => this._health; - - public bool IsAlive => this._health > 0; + public Guid Id => _id; public CharacterState State { get; private set; } public string CharacterName { - get => this._characterName; + get => _characterName; set { if (string.IsNullOrWhiteSpace(value)) - { throw new ArgumentException("Character name caaracter name cannot aracter name cannot aracnnot n.", nameof(value)); - } - this._characterName = value; + _characterName = value; } } @@ -67,49 +59,46 @@ public string this[int index] { return index switch { - 0 => this.CharacterName, - 1 => this.Health.ToString(), - _ => throw new IndexOutOfRangeException(), + 0 => CharacterName, + 1 => Health.ToString(), + _ => throw new IndexOutOfRangeException() }; } } - public static Character Create(string characterName) - { - return new Character(characterName); - } + public int Health => _health; + + public bool IsAlive => _health > 0; public void TakeDamage(int damage) { - if (damage < 0) - { - throw new ArgumentOutOfRangeException(nameof(damage)); - } + if (damage < 0) throw new ArgumentOutOfRangeException(nameof(damage)); - int previousHealth = this._health; + var previousHealth = _health; - this._health = Math.Max(0, this._health - damage); + _health = Math.Max(0, _health - damage); - this.HealthChanged?.Invoke(previousHealth, this._health); + HealthChanged?.Invoke(previousHealth, _health); - if (!this.IsAlive) - { - this.State = CharacterState.Dead; - } + if (!IsAlive) State = CharacterState.Dead; + } + + public event HealthChangedHandler HealthChanged; + + public static Character Create(string characterName) + { + return new Character(characterName); } public void Heal(int amount = 10) { - if (amount <= 0) - { - return; - } + if (amount <= 0) return; - int previousHealth = this._health; + var previousHealth = _health; - this._health = Math.Min(MaximumHealth, this._health + amount); + _health = Math.Min(MaximumHealth, _health + amount); - this.HealthChanged?.Invoke(previousHealth, this._health); + HealthChanged?.Invoke(previousHealth, _health); } public TResult Convert(Func converter) @@ -126,25 +115,19 @@ public async Task AttackAsync(Character target, int damage, TimeSpan delay) await Task.Delay(delay); target.TakeDamage(damage); - this.State = CharacterState.Attacking; + State = CharacterState.Attacking; } public IEnumerable GetHealthHistory(int step) { - if (step <= 0) - { - throw new ArgumentOutOfRangeException(nameof(step)); - } + if (step <= 0) throw new ArgumentOutOfRangeException(nameof(step)); - for (int value = this._health; value >= 0; value -= step) - { - yield return value; - } + for (var value = _health; value >= 0; value -= step) yield return value; } public override string ToString() { - return $"{this.CharacterName}: {this.Health}/{MaximumHealth}"; + return $"{CharacterName}: {Health}/{MaximumHealth}"; } private static bool IsValidDamage(int damage) @@ -154,16 +137,16 @@ private static bool IsValidDamage(int damage) private void ResetState() { - this.State = CharacterState.Idle; + State = CharacterState.Idle; } public readonly struct CharacterSnapshot { public CharacterSnapshot(string characterName, int health, CharacterState state) { - this.CharacterName = characterName; - this.Health = health; - this.State = state; + CharacterName = characterName; + Health = health; + State = state; } public string CharacterName { get; } @@ -177,20 +160,11 @@ private sealed class CharacterComparer : IComparer { public int Compare(Character first, Character second) { - if (ReferenceEquals(first, second)) - { - return 0; - } + if (ReferenceEquals(first, second)) return 0; - if (first is null) - { - return -1; - } + if (first is null) return -1; - if (second is null) - { - return 1; - } + if (second is null) return 1; return first.Health.CompareTo(second.Health); } diff --git a/Assets/packages.config b/Assets/packages.config index 5cae4b2..a2db27a 100644 --- a/Assets/packages.config +++ b/Assets/packages.config @@ -5,7 +5,7 @@ - + diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings new file mode 100644 index 0000000..000abd1 --- /dev/null +++ b/UnityTemplateURP.sln.DotSettings @@ -0,0 +1,349 @@ + + <?xml version="1.0" encoding="utf-16"?><Profile name="Scitalis: Reformat Code"><CppReformatCode>True</CppReformatCode><FSharpReformatCode>True</FSharpReformatCode><ShaderLabReformatCode>True</ShaderLabReformatCode><XMLReformatCode>True</XMLReformatCode><HtmlReformatCode>True</HtmlReformatCode><VBReformatCode>True</VBReformatCode><CSReformatCode>True</CSReformatCode><IDEA_SETTINGS>&lt;profile version="1.0"&gt; + &lt;option name="myName" value="Scitalis: Reformat Code" /&gt; + &lt;inspection_tool class="ES6ShorthandObjectProperty" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="JSArrowFunctionBracesCanBeRemoved" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="JSRemoveUnnecessaryParentheses" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="JSUnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="UnnecessaryContinueJS" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="UnnecessaryLabelJS" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="UnnecessaryLabelOnBreakStatementJS" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="UnnecessaryLabelOnContinueStatementJS" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="UnnecessaryReturnJS" enabled="false" level="WARNING" enabled_by_default="false" /&gt; + &lt;inspection_tool class="WrongPropertyKeyValueDelimiter" enabled="false" level="WARNING" enabled_by_default="false" /&gt; +&lt;/profile&gt;</IDEA_SETTINGS><RIDER_SETTINGS>&lt;profile&gt; + &lt;Language id="CSS"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;Rearrange&gt;true&lt;/Rearrange&gt; + &lt;/Language&gt; + &lt;Language id="EditorConfig"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="HTML"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;Rearrange&gt;true&lt;/Rearrange&gt; + &lt;OptimizeImports&gt;true&lt;/OptimizeImports&gt; + &lt;/Language&gt; + &lt;Language id="HTTP Request"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="Handlebars"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="Ini"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="JSON"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="Jade"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="JavaScript"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;Rearrange&gt;true&lt;/Rearrange&gt; + &lt;OptimizeImports&gt;true&lt;/OptimizeImports&gt; + &lt;/Language&gt; + &lt;Language id="Markdown"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="Mermaid"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="Properties"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="RELAX-NG"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="SQL"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="VueExpr"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; + &lt;Language id="XML"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;Rearrange&gt;true&lt;/Rearrange&gt; + &lt;OptimizeImports&gt;true&lt;/OptimizeImports&gt; + &lt;/Language&gt; + &lt;Language id="yaml"&gt; + &lt;Reformat&gt;true&lt;/Reformat&gt; + &lt;/Language&gt; +&lt;/profile&gt;</RIDER_SETTINGS><CSCodeStyleAttributes ArrangeVarStyle="True" ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" ArrangeArgumentsStyle="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeCodeBodyStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CppCodeStyleCleanupDescriptor ArrangeBraces="True" ArrangeAuto="True" ArrangeFunctionDeclarations="True" ArrangeNestedNamespaces="True" ArrangeTypeAliases="True" ArrangeCVQualifiers="True" ArrangeSlashesInIncludeDirectives="True" ArrangeOverridingFunctions="True" SortIncludeDirectives="True" SortMemberInitializers="True" /><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><VBOptimizeImports>True</VBOptimizeImports><VBShortenReferences>True</VBShortenReferences><Xaml.RemoveRedundantNamespaceAlias>True</Xaml.RemoveRedundantNamespaceAlias><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><CSReorderTypeMembers>True</CSReorderTypeMembers></Profile> + Scitalis: Reformat Code + Built-in: Full Cleanup + WRAP_IF_LONG + WRAP_IF_LONG + WRAP_IF_LONG + WRAP_IF_LONG + WRAP_IF_LONG + <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> + <TypePattern DisplayName="Non-reorderable types" Priority="99999999"> + <TypePattern.Match> + <Or> + <And> + <Kind Is="Interface" /> + <Or> + <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" /> + <HasAttribute Name="System.Runtime.InteropServices.ComImport" /> + </Or> + </And> + <Kind Is="Struct" /> + <HasAttribute Name="System.Runtime.InteropServices.StructLayoutAttribute" /> + <HasAttribute Name="JetBrains.Annotations.NoReorderAttribute" /> + </Or> + </TypePattern.Match> + </TypePattern> + + <TypePattern DisplayName="xUnit.net Test Classes" RemoveRegions="All"> + <TypePattern.Match> + <And> + <Kind Is="Class" /> + <HasMember> + <And> + <Kind Is="Method" /> + <HasAttribute Name="Xunit.FactAttribute" Inherited="True" /> + <HasAttribute Name="Xunit.TheoryAttribute" Inherited="True" /> + </And> + </HasMember> + </And> + </TypePattern.Match> + + <Entry DisplayName="Fields"> + <Entry.Match> + <And> + <Kind Is="Field" /> + <Not> + <Static /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Readonly /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Constructors"> + <Entry.Match> + <Kind Is="Constructor" /> + </Entry.Match> + + <Entry.SortBy> + <Static/> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Teardown Methods"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <ImplementsInterface Name="System.IDisposable" /> + </And> + </Entry.Match> + </Entry> + + <Entry DisplayName="All other members" /> + + <Entry DisplayName="Test Methods" Priority="100"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <HasAttribute Name="Xunit.FactAttribute" Inherited="false" /> + <HasAttribute Name="Xunit.TheoryAttribute" Inherited="false" /> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + </TypePattern> + + <TypePattern DisplayName="NUnit Test Fixtures" RemoveRegions="All"> + <TypePattern.Match> + <And> + <Kind Is="Class" /> + <Or> + <HasAttribute Name="NUnit.Framework.TestFixtureAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.TestFixtureSourceAttribute" Inherited="true" /> + <HasMember> + <And> + <Kind Is="Method" /> + <HasAttribute Name="NUnit.Framework.TestAttribute" Inherited="false" /> + <HasAttribute Name="NUnit.Framework.TestCaseAttribute" Inherited="false" /> + <HasAttribute Name="NUnit.Framework.TestCaseSourceAttribute" Inherited="false" /> + </And> + </HasMember> + </Or> + </And> + </TypePattern.Match> + + <Entry DisplayName="Setup/Teardown Methods"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <Or> + <HasAttribute Name="NUnit.Framework.SetUpAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.TearDownAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.TestFixtureSetUpAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.TestFixtureTearDownAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.OneTimeSetUpAttribute" Inherited="true" /> + <HasAttribute Name="NUnit.Framework.OneTimeTearDownAttribute" Inherited="true" /> + </Or> + </And> + </Entry.Match> + </Entry> + + <Entry DisplayName="All other members" /> + + <Entry DisplayName="Test Methods" Priority="100"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <HasAttribute Name="NUnit.Framework.TestAttribute" Inherited="false" /> + <HasAttribute Name="NUnit.Framework.TestCaseAttribute" Inherited="false" /> + <HasAttribute Name="NUnit.Framework.TestCaseSourceAttribute" Inherited="false" /> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + </TypePattern> + + <TypePattern DisplayName="Default Pattern"> + <Entry DisplayName="Public Delegates" Priority="100"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Kind Is="Delegate" /> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Enums" Priority="100"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Kind Is="Enum" /> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Static Fields and Constants"> + <Entry.Match> + <Or> + <Kind Is="Constant" /> + <And> + <Kind Is="Field" /> + <Static /> + </And> + </Or> + </Entry.Match> + + <Entry.SortBy> + <Access> + <Access.Order> + <AccessModifier>Public</AccessModifier> + <AccessModifier>Internal</AccessModifier> + <AccessModifier>ProtectedInternal</AccessModifier> + <AccessModifier>Protected</AccessModifier> + <AccessModifier>PrivateProtected</AccessModifier> + <AccessModifier>Private</AccessModifier> + </Access.Order> + </Access> + <Kind> + <Kind.Order> + <DeclarationKind>Constant</DeclarationKind> + <DeclarationKind>Field</DeclarationKind> + </Kind.Order> + </Kind> + <Readonly /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Fields"> + <Entry.Match> + <And> + <Kind Is="Field" /> + <Not> + <Static /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Readonly /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Constructors"> + <Entry.Match> + <Kind Is="Constructor" /> + </Entry.Match> + + <Entry.SortBy> + <Static/> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Properties, Indexers"> + <Entry.Match> + <Or> + <Kind Is="Property" /> + <Kind Is="Indexer" /> + </Or> + </Entry.Match> + </Entry> + + <Entry DisplayName="Interface Implementations" Priority="100"> + <Entry.Match> + <And> + <Kind Is="Member" /> + <ImplementsInterface /> + </And> + </Entry.Match> + + <Entry.SortBy> + <ImplementsInterface Immediate="true" /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="All other members" /> + + <Entry DisplayName="Nested Types"> + <Entry.Match> + <Kind Is="Type" /> + </Entry.Match> + </Entry> + </TypePattern> +</Patterns> + + False + False + False + True + False + False + True + False + True + CLIP + JSON + LU + ML + MLP \ No newline at end of file From 34fd8367aa3a2f8025d658c895c0b336143e13ef Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:22:41 +0300 Subject: [PATCH 09/19] removed obligatory this.fieldName usage in editorconfig --- .editorconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index faef053..a6364ee 100644 --- a/.editorconfig +++ b/.editorconfig @@ -39,4 +39,5 @@ resharper_csharp_max_enum_members_on_line = 1k # fields, properties, methods dotnet_diagnostic.SA1309.severity = none -dotnet_diagnostic.SA1128.severity = none # let public ClassName : this() without new line after : \ No newline at end of file +dotnet_diagnostic.SA1128.severity = none # let public ClassName : this() without new line after : +dotnet_diagnostic.SA1101.severity = none # disable obligatory this.fieldName \ No newline at end of file From d7cbd33c7efdf31b9601afdcb65773966b539454 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:29:00 +0300 Subject: [PATCH 10/19] Autoformatting: requires {} for multiline single statement --- UnityTemplateURP.sln.DotSettings | 1 + 1 file changed, 1 insertion(+) diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings index 000abd1..ed03cac 100644 --- a/UnityTemplateURP.sln.DotSettings +++ b/UnityTemplateURP.sln.DotSettings @@ -73,6 +73,7 @@ &lt;/profile&gt;</RIDER_SETTINGS><CSCodeStyleAttributes ArrangeVarStyle="True" ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" ArrangeArgumentsStyle="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeCodeBodyStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CppCodeStyleCleanupDescriptor ArrangeBraces="True" ArrangeAuto="True" ArrangeFunctionDeclarations="True" ArrangeNestedNamespaces="True" ArrangeTypeAliases="True" ArrangeCVQualifiers="True" ArrangeSlashesInIncludeDirectives="True" ArrangeOverridingFunctions="True" SortIncludeDirectives="True" SortMemberInitializers="True" /><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><VBOptimizeImports>True</VBOptimizeImports><VBShortenReferences>True</VBShortenReferences><Xaml.RemoveRedundantNamespaceAlias>True</Xaml.RemoveRedundantNamespaceAlias><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><CSReorderTypeMembers>True</CSReorderTypeMembers></Profile> Scitalis: Reformat Code Built-in: Full Cleanup + RequiredForMultiline WRAP_IF_LONG WRAP_IF_LONG WRAP_IF_LONG From 2416c0e15ff1dcf4bcb2d8e6ad9d329f90a6f71f Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:32:39 +0300 Subject: [PATCH 11/19] Added trailing comma to dotsetting --- Assets/_Project/Scripts/Test/Character.cs | 4 +++- UnityTemplateURP.sln.DotSettings | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Assets/_Project/Scripts/Test/Character.cs b/Assets/_Project/Scripts/Test/Character.cs index 94fe118..64610a1 100644 --- a/Assets/_Project/Scripts/Test/Character.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -46,8 +46,10 @@ public string CharacterName set { if (string.IsNullOrWhiteSpace(value)) + { throw new ArgumentException("Character name caaracter name cannot aracter name cannot aracnnot n.", nameof(value)); + } _characterName = value; } @@ -61,7 +63,7 @@ public string this[int index] { 0 => CharacterName, 1 => Health.ToString(), - _ => throw new IndexOutOfRangeException() + _ => throw new IndexOutOfRangeException(), }; } } diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings index ed03cac..8d9a18e 100644 --- a/UnityTemplateURP.sln.DotSettings +++ b/UnityTemplateURP.sln.DotSettings @@ -1,4 +1,5 @@  + SUGGESTION <?xml version="1.0" encoding="utf-16"?><Profile name="Scitalis: Reformat Code"><CppReformatCode>True</CppReformatCode><FSharpReformatCode>True</FSharpReformatCode><ShaderLabReformatCode>True</ShaderLabReformatCode><XMLReformatCode>True</XMLReformatCode><HtmlReformatCode>True</HtmlReformatCode><VBReformatCode>True</VBReformatCode><CSReformatCode>True</CSReformatCode><IDEA_SETTINGS>&lt;profile version="1.0"&gt; &lt;option name="myName" value="Scitalis: Reformat Code" /&gt; &lt;inspection_tool class="ES6ShorthandObjectProperty" enabled="false" level="WARNING" enabled_by_default="false" /&gt; @@ -74,6 +75,7 @@ Scitalis: Reformat Code Built-in: Full Cleanup RequiredForMultiline + False WRAP_IF_LONG WRAP_IF_LONG WRAP_IF_LONG From 0d80f37814cf9a8d8fe15a451faaf419a3f2984d Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:12:48 +0300 Subject: [PATCH 12/19] quick fix --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index a6364ee..0f5bf04 100644 --- a/.editorconfig +++ b/.editorconfig @@ -35,7 +35,7 @@ dotnet_diagnostic.SA1600.severity = none dotnet_diagnostic.SA1602.severity = none resharper_csharp_place_simple_enum_on_single_line = false resharper_csharp_keep_existing_enum_arrangement = false -resharper_csharp_max_enum_members_on_line = 1k +resharper_csharp_max_enum_members_on_line = 1 # fields, properties, methods dotnet_diagnostic.SA1309.severity = none From e96fb9e796f16af97c71f68a51388651eb6cfed6 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 14:57:42 +0300 Subject: [PATCH 13/19] updated objects order in file layout xml - now match the stylecop --- .editorconfig | 3 +- UnityTemplateURP.sln.DotSettings | 613 ++++++++++++++++++------------- 2 files changed, 361 insertions(+), 255 deletions(-) diff --git a/.editorconfig b/.editorconfig index 0f5bf04..cd89010 100644 --- a/.editorconfig +++ b/.editorconfig @@ -40,4 +40,5 @@ resharper_csharp_max_enum_members_on_line = 1 # fields, properties, methods dotnet_diagnostic.SA1309.severity = none dotnet_diagnostic.SA1128.severity = none # let public ClassName : this() without new line after : -dotnet_diagnostic.SA1101.severity = none # disable obligatory this.fieldName \ No newline at end of file +dotnet_diagnostic.SA1101.severity = none # disable obligatory this.fieldName +dotnet_diagnostic.SA1401.severity = error # fields always private \ No newline at end of file diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings index 8d9a18e..3803069 100644 --- a/UnityTemplateURP.sln.DotSettings +++ b/UnityTemplateURP.sln.DotSettings @@ -82,260 +82,365 @@ WRAP_IF_LONG WRAP_IF_LONG <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> - <TypePattern DisplayName="Non-reorderable types" Priority="99999999"> - <TypePattern.Match> - <Or> - <And> - <Kind Is="Interface" /> - <Or> - <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" /> - <HasAttribute Name="System.Runtime.InteropServices.ComImport" /> - </Or> - </And> - <Kind Is="Struct" /> - <HasAttribute Name="System.Runtime.InteropServices.StructLayoutAttribute" /> - <HasAttribute Name="JetBrains.Annotations.NoReorderAttribute" /> - </Or> - </TypePattern.Match> - </TypePattern> - - <TypePattern DisplayName="xUnit.net Test Classes" RemoveRegions="All"> - <TypePattern.Match> - <And> - <Kind Is="Class" /> - <HasMember> - <And> - <Kind Is="Method" /> - <HasAttribute Name="Xunit.FactAttribute" Inherited="True" /> - <HasAttribute Name="Xunit.TheoryAttribute" Inherited="True" /> - </And> - </HasMember> - </And> - </TypePattern.Match> - - <Entry DisplayName="Fields"> - <Entry.Match> - <And> - <Kind Is="Field" /> - <Not> - <Static /> - </Not> - </And> - </Entry.Match> - - <Entry.SortBy> - <Readonly /> - <Name /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Constructors"> - <Entry.Match> - <Kind Is="Constructor" /> - </Entry.Match> - - <Entry.SortBy> - <Static/> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Teardown Methods"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <ImplementsInterface Name="System.IDisposable" /> - </And> - </Entry.Match> - </Entry> - - <Entry DisplayName="All other members" /> - - <Entry DisplayName="Test Methods" Priority="100"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <HasAttribute Name="Xunit.FactAttribute" Inherited="false" /> - <HasAttribute Name="Xunit.TheoryAttribute" Inherited="false" /> - </And> - </Entry.Match> - - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - </TypePattern> - - <TypePattern DisplayName="NUnit Test Fixtures" RemoveRegions="All"> - <TypePattern.Match> - <And> - <Kind Is="Class" /> - <Or> - <HasAttribute Name="NUnit.Framework.TestFixtureAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.TestFixtureSourceAttribute" Inherited="true" /> - <HasMember> - <And> - <Kind Is="Method" /> - <HasAttribute Name="NUnit.Framework.TestAttribute" Inherited="false" /> - <HasAttribute Name="NUnit.Framework.TestCaseAttribute" Inherited="false" /> - <HasAttribute Name="NUnit.Framework.TestCaseSourceAttribute" Inherited="false" /> - </And> - </HasMember> - </Or> - </And> - </TypePattern.Match> - - <Entry DisplayName="Setup/Teardown Methods"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <Or> - <HasAttribute Name="NUnit.Framework.SetUpAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.TearDownAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.TestFixtureSetUpAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.TestFixtureTearDownAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.OneTimeSetUpAttribute" Inherited="true" /> - <HasAttribute Name="NUnit.Framework.OneTimeTearDownAttribute" Inherited="true" /> - </Or> - </And> - </Entry.Match> - </Entry> - - <Entry DisplayName="All other members" /> - - <Entry DisplayName="Test Methods" Priority="100"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <HasAttribute Name="NUnit.Framework.TestAttribute" Inherited="false" /> - <HasAttribute Name="NUnit.Framework.TestCaseAttribute" Inherited="false" /> - <HasAttribute Name="NUnit.Framework.TestCaseSourceAttribute" Inherited="false" /> - </And> - </Entry.Match> - - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - </TypePattern> - - <TypePattern DisplayName="Default Pattern"> - <Entry DisplayName="Public Delegates" Priority="100"> - <Entry.Match> - <And> - <Access Is="Public" /> - <Kind Is="Delegate" /> - </And> - </Entry.Match> - - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Public Enums" Priority="100"> - <Entry.Match> - <And> - <Access Is="Public" /> - <Kind Is="Enum" /> - </And> - </Entry.Match> - - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Static Fields and Constants"> - <Entry.Match> - <Or> - <Kind Is="Constant" /> - <And> - <Kind Is="Field" /> - <Static /> - </And> - </Or> - </Entry.Match> - - <Entry.SortBy> - <Access> - <Access.Order> - <AccessModifier>Public</AccessModifier> - <AccessModifier>Internal</AccessModifier> - <AccessModifier>ProtectedInternal</AccessModifier> - <AccessModifier>Protected</AccessModifier> - <AccessModifier>PrivateProtected</AccessModifier> - <AccessModifier>Private</AccessModifier> - </Access.Order> - </Access> - <Kind> - <Kind.Order> - <DeclarationKind>Constant</DeclarationKind> - <DeclarationKind>Field</DeclarationKind> - </Kind.Order> - </Kind> - <Readonly /> - <Name /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Fields"> - <Entry.Match> - <And> - <Kind Is="Field" /> - <Not> - <Static /> - </Not> - </And> - </Entry.Match> - - <Entry.SortBy> - <Readonly /> - <Name /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Constructors"> - <Entry.Match> - <Kind Is="Constructor" /> - </Entry.Match> - - <Entry.SortBy> - <Static/> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="Properties, Indexers"> - <Entry.Match> - <Or> - <Kind Is="Property" /> - <Kind Is="Indexer" /> - </Or> - </Entry.Match> - </Entry> - - <Entry DisplayName="Interface Implementations" Priority="100"> - <Entry.Match> - <And> - <Kind Is="Member" /> - <ImplementsInterface /> - </And> - </Entry.Match> - - <Entry.SortBy> - <ImplementsInterface Immediate="true" /> - </Entry.SortBy> - </Entry> - - <Entry DisplayName="All other members" /> - - <Entry DisplayName="Nested Types"> - <Entry.Match> - <Kind Is="Type" /> - </Entry.Match> - </Entry> - </TypePattern> -</Patterns> - + <TypePattern DisplayName="StyleCop Analyzers Default Ordering"> + <TypePattern.Match> + <Or> + <Kind Is="Class" /> + <Kind Is="Struct" /> + <Kind Is="Interface" /> + <Kind Is="Record" /> + </Or> + </TypePattern.Match> + + <Entry DisplayName="Fields"> + <Entry.Match> + <Or> + <Kind Is="Constant" /> + <Kind Is="Field" /> + </Or> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Kind Order="Constant Field" /> + <Static /> + <Readonly /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Static Constructor" Priority="200"> + <Entry.Match> + <And> + <Kind Is="Constructor" /> + <Static /> + </And> + </Entry.Match> + </Entry> + + <Entry DisplayName="Instance Constructors"> + <Entry.Match> + <And> + <Kind Is="Constructor" /> + <Not> + <Static /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Finalizer"> + <Entry.Match> + <Kind Is="Destructor" /> + </Entry.Match> + </Entry> + + <Entry DisplayName="Delegates"> + <Entry.Match> + <Kind Is="Delegate" /> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Static Events and Static Interface Event Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Event" /> + <Static /> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Instance Events and Instance Interface Event Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Event" /> + <Not> + <Static /> + </Not> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Other Events"> + <Entry.Match> + <And> + <Kind Is="Event" /> + <Not> + <Access Is="Public" /> + </Not> + <Not> + <ImplementsInterface /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" /> + <Static /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Enums"> + <Entry.Match> + <Kind Is="Enum" /> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Interfaces"> + <Entry.Match> + <Kind Is="Interface" /> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Static Properties and Static Interface Property Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Property" /> + <Static /> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Instance Properties and Instance Interface Property Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Property" /> + <Not> + <Static /> + </Not> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Other Properties"> + <Entry.Match> + <And> + <Kind Is="Property" /> + <Not> + <Access Is="Public" /> + </Not> + <Not> + <ImplementsInterface /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" /> + <Static /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Static Indexers and Static Interface Indexer Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Indexer" /> + <Static /> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Instance Indexers and Instance Interface Indexer Implementations" + Priority="200"> + <Entry.Match> + <And> + <Kind Is="Indexer" /> + <Not> + <Static /> + </Not> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Other Indexers"> + <Entry.Match> + <And> + <Kind Is="Indexer" /> + <Not> + <Access Is="Public" /> + </Not> + <Not> + <ImplementsInterface /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" /> + <Static /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Static Methods, Operators, and Static Interface Implementations" + Priority="200"> + <Entry.Match> + <And> + <Or> + <Kind Is="Method" /> + <Kind Is="Operator" /> + </Or> + <Static /> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Public Instance Methods, Operators, and Instance Interface Implementations" + Priority="200"> + <Entry.Match> + <And> + <Or> + <Kind Is="Method" /> + <Kind Is="Operator" /> + </Or> + <Not> + <Static /> + </Not> + <Or> + <Access Is="Public" /> + <ImplementsInterface /> + </Or> + </And> + </Entry.Match> + + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Other Methods and Operators"> + <Entry.Match> + <And> + <Or> + <Kind Is="Method" /> + <Kind Is="Operator" /> + </Or> + <Not> + <Access Is="Public" /> + </Not> + <Not> + <ImplementsInterface /> + </Not> + </And> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" /> + <Static /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Nested Structs"> + <Entry.Match> + <Kind Is="Struct" /> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="Nested Classes and Records"> + <Entry.Match> + <Or> + <Kind Is="Class" /> + <Kind Is="Record" /> + </Or> + </Entry.Match> + + <Entry.SortBy> + <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" /> + <Name /> + </Entry.SortBy> + </Entry> + + <Entry DisplayName="All Other Members" /> + </TypePattern> +</Patterns> False False False From a76dd3b582854291df1c80955db999ac03a4d56c Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:47:44 +0300 Subject: [PATCH 14/19] Updated formatting rules for new lines --- .editorconfig | 8 +- Assets/_Project/Scripts/Test/Character.cs | 91 +++++++++++------------ UnityTemplateURP.sln.DotSettings | 2 + 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/.editorconfig b/.editorconfig index cd89010..964a460 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,6 +9,9 @@ tab_width = 4 insert_final_newline = true trim_trailing_whitespace = true +# ReSharper properties +resharper_keep_existing_embedded_arrangement = false + # noinspection EditorConfigKeyCorrectness [*.cs] @@ -39,6 +42,7 @@ resharper_csharp_max_enum_members_on_line = 1 # fields, properties, methods dotnet_diagnostic.SA1309.severity = none -dotnet_diagnostic.SA1128.severity = none # let public ClassName : this() without new line after : +dotnet_diagnostic.SA1128.severity = none # allow public ClassName : this() without new line after : dotnet_diagnostic.SA1101.severity = none # disable obligatory this.fieldName -dotnet_diagnostic.SA1401.severity = error # fields always private \ No newline at end of file +dotnet_diagnostic.SA1401.severity = error # fields always private +dotnet_diagnostic.SA1503.severity = none # allow no braces \ No newline at end of file diff --git a/Assets/_Project/Scripts/Test/Character.cs b/Assets/_Project/Scripts/Test/Character.cs index 64610a1..e86d865 100644 --- a/Assets/_Project/Scripts/Test/Character.cs +++ b/Assets/_Project/Scripts/Test/Character.cs @@ -9,10 +9,8 @@ public sealed class Character : IDamageable public const int MaximumHealth = 100; public static readonly Character Empty = new(DefaultName); - private const string DefaultName = "Character"; - private static int _instanceCount; private readonly Guid _id; @@ -34,11 +32,9 @@ public Character(string characterName) _instanceCount++; } - public static int InstanceCount => _instanceCount; - - public Guid Id => _id; + public event HealthChangedHandler HealthChanged; - public CharacterState State { get; private set; } + public static int InstanceCount => _instanceCount; public string CharacterName { @@ -55,6 +51,14 @@ public string CharacterName } } + public int Health => _health; + + public Guid Id => _id; + + public bool IsAlive => _health > 0; + + public CharacterState State { get; private set; } + public string this[int index] { get @@ -68,33 +72,41 @@ public string this[int index] } } - public int Health => _health; - - public bool IsAlive => _health > 0; + public static Character Create(string characterName) + { + return new Character(characterName); + } - public void TakeDamage(int damage) + public async Task AttackAsync(Character target, int damage, TimeSpan delay) { - if (damage < 0) throw new ArgumentOutOfRangeException(nameof(damage)); + throw new ArgumentNullException(target.ToString()); - var previousHealth = _health; + await Task.Delay(delay); - _health = Math.Max(0, _health - damage); + target.TakeDamage(damage); + State = CharacterState.Attacking; + } - HealthChanged?.Invoke(previousHealth, _health); + public TResult Convert(Func converter) + { + throw new ArgumentNullException(converter.ToString()); - if (!IsAlive) State = CharacterState.Dead; + return converter(this); } - public event HealthChangedHandler HealthChanged; - - public static Character Create(string characterName) + public IEnumerable GetHealthHistory(int step) { - return new Character(characterName); + if (step <= 0) + throw new ArgumentOutOfRangeException(nameof(step)); + + for (var value = _health; value >= 0; value -= step) + yield return value; } public void Heal(int amount = 10) { - if (amount <= 0) return; + if (amount <= 0) + return; var previousHealth = _health; @@ -103,28 +115,19 @@ public void Heal(int amount = 10) HealthChanged?.Invoke(previousHealth, _health); } - public TResult Convert(Func converter) - { - throw new ArgumentNullException(converter.ToString()); - - return converter(this); - } - - public async Task AttackAsync(Character target, int damage, TimeSpan delay) + public void TakeDamage(int damage) { - throw new ArgumentNullException(target.ToString()); + if (damage < 0) + throw new ArgumentOutOfRangeException(nameof(damage)); - await Task.Delay(delay); + var previousHealth = _health; - target.TakeDamage(damage); - State = CharacterState.Attacking; - } + _health = Math.Max(0, _health - damage); - public IEnumerable GetHealthHistory(int step) - { - if (step <= 0) throw new ArgumentOutOfRangeException(nameof(step)); + HealthChanged?.Invoke(previousHealth, _health); - for (var value = _health; value >= 0; value -= step) yield return value; + if (!IsAlive) + State = CharacterState.Dead; } public override string ToString() @@ -158,18 +161,12 @@ public CharacterSnapshot(string characterName, int health, CharacterState state) public CharacterState State { get; } } - private sealed class CharacterComparer : IComparer + private struct Struct1 { - public int Compare(Character first, Character second) - { - if (ReferenceEquals(first, second)) return 0; - - if (first is null) return -1; - - if (second is null) return 1; + } - return first.Health.CompareTo(second.Health); - } + private sealed class Class1 + { } } } diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings index 3803069..ce1a936 100644 --- a/UnityTemplateURP.sln.DotSettings +++ b/UnityTemplateURP.sln.DotSettings @@ -76,6 +76,8 @@ Built-in: Full Cleanup RequiredForMultiline False + 1 + 1 WRAP_IF_LONG WRAP_IF_LONG WRAP_IF_LONG From 7a427ef3cafdd1a1e41eb8f7851770b7634a49e5 Mon Sep 17 00:00:00 2001 From: Mikov Denis <45800215+TaggedDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 17:27:31 +0300 Subject: [PATCH 15/19] Updated gitignore --- .gitignore | 8 + .../.idea/codeStyles/Project.xml | 16 + .../.idea/codeStyles/codeStyleConfig.xml | 5 + .../.idea/encodings.xml | 4 + .../.idea/indexLayout.xml | 8 + .../.idea/projectSettingsUpdater.xml | 7 + .../.idea/scopes/_Project.xml | 3 + .idea/.idea.UnityTemplateURP/.idea/vcs.xml | 6 + .../.idea/workspace.xml | 384 ++++++++++++++++++ 9 files changed, 441 insertions(+) create mode 100644 .idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/encodings.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/indexLayout.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/vcs.xml create mode 100644 .idea/.idea.UnityTemplateURP/.idea/workspace.xml diff --git a/.gitignore b/.gitignore index 6095699..779ec5f 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,11 @@ InitTestScene*.unity* /[Pp]ackages/* !/[Pp]ackages/manifest.json !/[Pp]ackages/packages-lock.json + +!.idea/ +!.idea/.idea.UnityTemplateURP/ +!.idea/.idea.UnityTemplateURP/.idea/ +!.idea/.idea.UnityTemplateURP/.idea/scopes/ +!.idea/.idea.UnityTemplateURP/.idea/scopes/* +!.idea/.idea.UnityTemplateURP/.idea/codeStyles/ +!.idea/.idea.UnityTemplateURP/.idea/codeStyles/* diff --git a/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..758d63d --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/encodings.xml b/.idea/.idea.UnityTemplateURP/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml b/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml b/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..64af657 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml b/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml new file mode 100644 index 0000000..3c531a8 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml @@ -0,0 +1,3 @@ + + + diff --git a/.idea/.idea.UnityTemplateURP/.idea/vcs.xml b/.idea/.idea.UnityTemplateURP/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.UnityTemplateURP/.idea/workspace.xml b/.idea/.idea.UnityTemplateURP/.idea/workspace.xml new file mode 100644 index 0000000..60f1759 --- /dev/null +++ b/.idea/.idea.UnityTemplateURP/.idea/workspace.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "lastFilter": { + "state": "OPEN", + "assignee": "TaggedDev" + } +} + { + "selectedUrlAndAccountId": { + "url": "git@github.com:4RTNV/UnityTemplateURP.git", + "accountId": "18f9e816-ddcb-42de-8532-ae4e44d75796" + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "customColor": "", + "associatedIndex": 3 +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1754318479012 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/Assets/_Project/Scripts/Services/SceneLoader/AsyncSceneLoader.cs + 17 + + + + + + + + + + + + +