├── .editorconfig ├── .gitignore ├── LICENSE.md ├── LICENSE.md.meta ├── README.md ├── README.md.meta ├── Runtime.meta ├── Runtime ├── CodeWriter.TutorialMaskForUGUI.Runtime.asmdef ├── CodeWriter.TutorialMaskForUGUI.Runtime.asmdef.meta ├── MaskFixForTutorial.cs ├── MaskFixForTutorial.cs.meta ├── TutorialMask.cs ├── TutorialMask.cs.meta ├── TutorialObject.cs └── TutorialObject.cs.meta ├── package.json └── package.json.meta /.editorconfig: -------------------------------------------------------------------------------- 1 | 2 | [*] 3 | charset = utf-8 4 | end_of_line = crlf 5 | trim_trailing_whitespace = false 6 | insert_final_newline = false 7 | indent_style = space 8 | indent_size = 4 9 | 10 | # Microsoft .NET properties 11 | csharp_indent_braces = false 12 | csharp_indent_switch_labels = true 13 | csharp_new_line_before_catch = true 14 | csharp_new_line_before_else = true 15 | csharp_new_line_before_finally = true 16 | csharp_new_line_before_members_in_object_initializers = false 17 | csharp_new_line_before_open_brace = all 18 | csharp_new_line_between_query_expression_clauses = true 19 | csharp_preferred_modifier_order = public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion 20 | csharp_preserve_single_line_blocks = true 21 | csharp_space_after_cast = true 22 | csharp_space_after_colon_in_inheritance_clause = true 23 | csharp_space_after_comma = true 24 | csharp_space_after_dot = false 25 | csharp_space_after_keywords_in_control_flow_statements = true 26 | csharp_space_after_semicolon_in_for_statement = true 27 | csharp_space_around_binary_operators = before_and_after 28 | csharp_space_before_colon_in_inheritance_clause = true 29 | csharp_space_before_comma = false 30 | csharp_space_before_dot = false 31 | csharp_space_before_open_square_brackets = false 32 | csharp_space_before_semicolon_in_for_statement = false 33 | csharp_space_between_empty_square_brackets = false 34 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 35 | csharp_space_between_method_call_name_and_opening_parenthesis = false 36 | csharp_space_between_method_call_parameter_list_parentheses = false 37 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 38 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 39 | csharp_space_between_method_declaration_parameter_list_parentheses = false 40 | csharp_space_between_parentheses = false 41 | csharp_space_between_square_brackets = false 42 | csharp_style_var_elsewhere = true:suggestion 43 | csharp_style_var_for_built_in_types = true:suggestion 44 | csharp_style_var_when_type_is_apparent = true:suggestion 45 | csharp_using_directive_placement = outside_namespace:silent 46 | dotnet_naming_rule.constants_rule.severity = warning 47 | dotnet_naming_rule.constants_rule.style = upper_camel_case_style 48 | dotnet_naming_rule.constants_rule.symbols = constants_symbols 49 | dotnet_naming_rule.event_rule.severity = warning 50 | dotnet_naming_rule.event_rule.style = upper_camel_case_style 51 | dotnet_naming_rule.event_rule.symbols = event_symbols 52 | dotnet_naming_rule.interfaces_rule.severity = warning 53 | dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style 54 | dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols 55 | dotnet_naming_rule.locals_rule.severity = warning 56 | dotnet_naming_rule.locals_rule.style = lower_camel_case_style 57 | dotnet_naming_rule.locals_rule.symbols = locals_symbols 58 | dotnet_naming_rule.local_constants_rule.severity = warning 59 | dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style 60 | dotnet_naming_rule.local_constants_rule.symbols = local_constants_symbols 61 | dotnet_naming_rule.local_functions_rule.severity = warning 62 | dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style 63 | dotnet_naming_rule.local_functions_rule.symbols = local_functions_symbols 64 | dotnet_naming_rule.method_rule.severity = warning 65 | dotnet_naming_rule.method_rule.style = upper_camel_case_style 66 | dotnet_naming_rule.method_rule.symbols = method_symbols 67 | dotnet_naming_rule.parameters_rule.severity = warning 68 | dotnet_naming_rule.parameters_rule.style = lower_camel_case_style 69 | dotnet_naming_rule.parameters_rule.symbols = parameters_symbols 70 | dotnet_naming_rule.private_constants_rule.severity = warning 71 | dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style 72 | dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols 73 | dotnet_naming_rule.private_instance_fields_rule.severity = warning 74 | dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style_1 75 | dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols 76 | dotnet_naming_rule.private_static_fields_rule.severity = warning 77 | dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style_1 78 | dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols 79 | dotnet_naming_rule.private_static_readonly_rule.severity = warning 80 | dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style 81 | dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols 82 | dotnet_naming_rule.property_rule.severity = warning 83 | dotnet_naming_rule.property_rule.style = upper_camel_case_style 84 | dotnet_naming_rule.property_rule.symbols = property_symbols 85 | dotnet_naming_rule.public_fields_rule.severity = warning 86 | dotnet_naming_rule.public_fields_rule.style = lower_camel_case_style 87 | dotnet_naming_rule.public_fields_rule.symbols = public_fields_symbols 88 | dotnet_naming_rule.static_readonly_rule.severity = warning 89 | dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style 90 | dotnet_naming_rule.static_readonly_rule.symbols = static_readonly_symbols 91 | dotnet_naming_rule.types_and_namespaces_rule.severity = warning 92 | dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style 93 | dotnet_naming_rule.types_and_namespaces_rule.symbols = types_and_namespaces_symbols 94 | dotnet_naming_rule.type_parameters_rule.severity = warning 95 | dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style 96 | dotnet_naming_rule.type_parameters_rule.symbols = type_parameters_symbols 97 | dotnet_naming_style.i_upper_camel_case_style.capitalization = pascal_case 98 | dotnet_naming_style.i_upper_camel_case_style.required_prefix = I 99 | dotnet_naming_style.lower_camel_case_style.capitalization = camel_case 100 | dotnet_naming_style.lower_camel_case_style_1.capitalization = camel_case 101 | dotnet_naming_style.lower_camel_case_style_1.required_prefix = _ 102 | dotnet_naming_style.t_upper_camel_case_style.capitalization = pascal_case 103 | dotnet_naming_style.t_upper_camel_case_style.required_prefix = T 104 | dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case 105 | dotnet_naming_symbols.constants_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected 106 | dotnet_naming_symbols.constants_symbols.applicable_kinds = field 107 | dotnet_naming_symbols.constants_symbols.required_modifiers = const 108 | dotnet_naming_symbols.event_symbols.applicable_accessibilities = * 109 | dotnet_naming_symbols.event_symbols.applicable_kinds = event 110 | dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = * 111 | dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface 112 | dotnet_naming_symbols.locals_symbols.applicable_accessibilities = * 113 | dotnet_naming_symbols.locals_symbols.applicable_kinds = local 114 | dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities = * 115 | dotnet_naming_symbols.local_constants_symbols.applicable_kinds = local 116 | dotnet_naming_symbols.local_constants_symbols.required_modifiers = const 117 | dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities = * 118 | dotnet_naming_symbols.local_functions_symbols.applicable_kinds = local_function 119 | dotnet_naming_symbols.method_symbols.applicable_accessibilities = * 120 | dotnet_naming_symbols.method_symbols.applicable_kinds = method 121 | dotnet_naming_symbols.parameters_symbols.applicable_accessibilities = * 122 | dotnet_naming_symbols.parameters_symbols.applicable_kinds = parameter 123 | dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private 124 | dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field 125 | dotnet_naming_symbols.private_constants_symbols.required_modifiers = const 126 | dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private 127 | dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field 128 | dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private 129 | dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field 130 | dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static 131 | dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private 132 | dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field 133 | dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = static,readonly 134 | dotnet_naming_symbols.property_symbols.applicable_accessibilities = * 135 | dotnet_naming_symbols.property_symbols.applicable_kinds = property 136 | dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected 137 | dotnet_naming_symbols.public_fields_symbols.applicable_kinds = field 138 | dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected 139 | dotnet_naming_symbols.static_readonly_symbols.applicable_kinds = field 140 | dotnet_naming_symbols.static_readonly_symbols.required_modifiers = static,readonly 141 | dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities = * 142 | dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds = namespace,class,struct,enum,delegate 143 | dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities = * 144 | dotnet_naming_symbols.type_parameters_symbols.applicable_kinds = type_parameter 145 | dotnet_separate_import_directive_groups = false 146 | dotnet_sort_system_directives_first = true 147 | dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none 148 | dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none 149 | dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none 150 | dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion 151 | dotnet_style_predefined_type_for_member_access = true:suggestion 152 | dotnet_style_qualification_for_event = false:suggestion 153 | dotnet_style_qualification_for_field = false:suggestion 154 | dotnet_style_qualification_for_method = false:suggestion 155 | dotnet_style_qualification_for_property = false:suggestion 156 | dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion 157 | file_header_template = 158 | 159 | # ReSharper properties 160 | resharper_accessor_owner_body = expression_body 161 | resharper_alignment_tab_fill_style = use_spaces 162 | resharper_align_first_arg_by_paren = false 163 | resharper_align_linq_query = false 164 | resharper_align_multiline_array_and_object_initializer = false 165 | resharper_align_multiline_array_initializer = true 166 | resharper_align_multiline_ctor_init = true 167 | resharper_align_multiline_expression_braces = false 168 | resharper_align_multiline_implements_list = true 169 | resharper_align_multiline_property_pattern = false 170 | resharper_align_multiline_switch_expression = false 171 | resharper_align_multiline_type_argument = true 172 | resharper_align_multiline_type_parameter = true 173 | resharper_align_multline_type_parameter_constrains = false 174 | resharper_align_multline_type_parameter_list = false 175 | resharper_align_ternary = align_not_nested 176 | resharper_align_tuple_components = false 177 | resharper_allow_alias = true 178 | resharper_allow_comment_after_lbrace = false 179 | resharper_allow_far_alignment = false 180 | resharper_always_use_end_of_line_brace_style = false 181 | resharper_anonymous_method_declaration_braces = next_line 182 | resharper_apply_auto_detected_rules = true 183 | resharper_apply_on_completion = false 184 | resharper_arguments_anonymous_function = positional 185 | resharper_arguments_literal = positional 186 | resharper_arguments_named = positional 187 | resharper_arguments_other = positional 188 | resharper_arguments_skip_single = false 189 | resharper_arguments_string_literal = positional 190 | resharper_attribute_style = do_not_touch 191 | resharper_autodetect_indent_settings = true 192 | resharper_blank_lines_after_block_statements = 1 193 | resharper_blank_lines_after_case = 0 194 | resharper_blank_lines_after_control_transfer_statements = 0 195 | resharper_blank_lines_after_imports = 1 196 | resharper_blank_lines_after_multiline_statements = 0 197 | resharper_blank_lines_after_options = 1 198 | resharper_blank_lines_after_start_comment = 1 199 | resharper_blank_lines_after_using_list = 1 200 | resharper_blank_lines_around_accessor = 0 201 | resharper_blank_lines_around_auto_property = 1 202 | resharper_blank_lines_around_block_case_section = 0 203 | resharper_blank_lines_around_class_definition = 1 204 | resharper_blank_lines_around_field = 1 205 | resharper_blank_lines_around_function_declaration = 0 206 | resharper_blank_lines_around_function_definition = 1 207 | resharper_blank_lines_around_global_attribute = 0 208 | resharper_blank_lines_around_invocable = 1 209 | resharper_blank_lines_around_local_method = 1 210 | resharper_blank_lines_around_multiline_case_section = 0 211 | resharper_blank_lines_around_namespace = 1 212 | resharper_blank_lines_around_other_declaration = 0 213 | resharper_blank_lines_around_property = 1 214 | resharper_blank_lines_around_razor_functions = 1 215 | resharper_blank_lines_around_razor_helpers = 1 216 | resharper_blank_lines_around_razor_sections = 1 217 | resharper_blank_lines_around_region = 1 218 | resharper_blank_lines_around_single_line_accessor = 0 219 | resharper_blank_lines_around_single_line_auto_property = 0 220 | resharper_blank_lines_around_single_line_field = 0 221 | resharper_blank_lines_around_single_line_function_definition = 0 222 | resharper_blank_lines_around_single_line_invocable = 0 223 | resharper_blank_lines_around_single_line_local_method = 0 224 | resharper_blank_lines_around_single_line_property = 0 225 | resharper_blank_lines_around_single_line_type = 1 226 | resharper_blank_lines_around_type = 1 227 | resharper_blank_lines_before_block_statements = 0 228 | resharper_blank_lines_before_case = 0 229 | resharper_blank_lines_before_control_transfer_statements = 0 230 | resharper_blank_lines_before_multiline_statements = 0 231 | resharper_blank_lines_before_single_line_comment = 0 232 | resharper_blank_lines_inside_namespace = 0 233 | resharper_blank_lines_inside_region = 1 234 | resharper_blank_lines_inside_type = 0 235 | resharper_blank_line_after_pi = true 236 | resharper_braces_for_dowhile = required 237 | resharper_braces_for_fixed = required 238 | resharper_braces_for_for = required 239 | resharper_braces_for_foreach = required 240 | resharper_braces_for_ifelse = required 241 | resharper_braces_for_lock = required 242 | resharper_braces_for_using = required 243 | resharper_braces_for_while = required 244 | resharper_braces_redundant = false 245 | resharper_break_template_declaration = line_break 246 | resharper_can_use_global_alias = true 247 | resharper_constructor_or_destructor_body = block_body 248 | resharper_continuous_indent_multiplier = 1 249 | resharper_continuous_line_indent = single 250 | resharper_cpp_align_multiline_argument = true 251 | resharper_cpp_align_multiline_binary_expressions_chain = false 252 | resharper_cpp_align_multiline_calls_chain = true 253 | resharper_cpp_align_multiline_extends_list = true 254 | resharper_cpp_align_multiline_for_stmt = true 255 | resharper_cpp_align_multiline_parameter = true 256 | resharper_cpp_align_multiple_declaration = true 257 | resharper_cpp_case_block_braces = next_line_shifted_2 258 | resharper_cpp_indent_switch_labels = false 259 | resharper_cpp_max_line_length = 120 260 | resharper_cpp_new_line_before_while = true 261 | resharper_cpp_space_after_cast = false 262 | resharper_cpp_space_around_binary_operator = true 263 | resharper_cpp_wrap_lines = true 264 | resharper_csharp_align_multiline_argument = false 265 | resharper_csharp_align_multiline_binary_expressions_chain = true 266 | resharper_csharp_align_multiline_calls_chain = false 267 | resharper_csharp_align_multiline_expression = false 268 | resharper_csharp_align_multiline_extends_list = false 269 | resharper_csharp_align_multiline_for_stmt = false 270 | resharper_csharp_align_multiline_parameter = false 271 | resharper_csharp_align_multiple_declaration = false 272 | resharper_csharp_max_line_length = 120 273 | resharper_csharp_naming_rule.enum_member = AaBb 274 | resharper_csharp_naming_rule.method_property_event = AaBb 275 | resharper_csharp_naming_rule.other = AaBb 276 | resharper_csharp_naming_rule.public_fields = aaBb, AaBb 277 | resharper_csharp_new_line_before_while = false 278 | resharper_csharp_prefer_qualified_reference = false 279 | resharper_csharp_space_after_unary_operator = false 280 | resharper_csharp_wrap_lines = true 281 | resharper_cxxcli_property_declaration_braces = next_line 282 | resharper_default_exception_variable_name = e 283 | resharper_default_value_when_type_evident = default_literal 284 | resharper_default_value_when_type_not_evident = default_literal 285 | resharper_delete_quotes_from_solid_values = false 286 | resharper_disable_blank_line_changes = false 287 | resharper_disable_formatter = false 288 | resharper_disable_indenter = false 289 | resharper_disable_int_align = false 290 | resharper_disable_line_break_changes = false 291 | resharper_disable_line_break_removal = false 292 | resharper_disable_space_changes = false 293 | resharper_disable_space_changes_before_trailing_comment = false 294 | resharper_dont_remove_extra_blank_lines = false 295 | resharper_empty_block_style = multiline 296 | resharper_enable_wrapping = false 297 | resharper_enforce_line_ending_style = false 298 | resharper_event_handler_pattern_long = $object$On$event$ 299 | resharper_event_handler_pattern_short = On$event$ 300 | resharper_expression_braces = inside 301 | resharper_expression_pars = inside 302 | resharper_extra_spaces = remove_all 303 | resharper_force_attribute_style = separate 304 | resharper_force_chop_compound_do_expression = false 305 | resharper_force_chop_compound_if_expression = false 306 | resharper_force_chop_compound_while_expression = false 307 | resharper_format_leading_spaces_decl = false 308 | resharper_free_block_braces = next_line 309 | resharper_fsharp_align_function_signature_to_indentation = false 310 | resharper_fsharp_alternative_long_member_definitions = false 311 | resharper_fsharp_indent_on_try_with = false 312 | resharper_fsharp_keep_if_then_in_same_line = false 313 | resharper_fsharp_max_array_or_list_width = 40 314 | resharper_fsharp_max_elmish_width = 40 315 | resharper_fsharp_max_function_binding_width = 40 316 | resharper_fsharp_max_if_then_else_short_width = 40 317 | resharper_fsharp_max_infix_operator_expression = 50 318 | resharper_fsharp_max_line_length = 120 319 | resharper_fsharp_max_record_width = 40 320 | resharper_fsharp_max_value_binding_width = 40 321 | resharper_fsharp_multiline_block_brackets_on_same_column = false 322 | resharper_fsharp_newline_between_type_definition_and_members = false 323 | resharper_fsharp_semicolon_at_end_of_line = false 324 | resharper_fsharp_single_argument_web_mode = false 325 | resharper_fsharp_space_after_comma = true 326 | resharper_fsharp_space_after_semicolon = true 327 | resharper_fsharp_space_around_delimiter = true 328 | resharper_fsharp_space_before_class_constructor = false 329 | resharper_fsharp_space_before_colon = false 330 | resharper_fsharp_space_before_lowercase_invocation = true 331 | resharper_fsharp_space_before_member = false 332 | resharper_fsharp_space_before_parameter = true 333 | resharper_fsharp_space_before_semicolon = false 334 | resharper_fsharp_space_before_uppercase_invocation = false 335 | resharper_fsharp_wrap_lines = true 336 | resharper_function_declaration_return_type_style = do_not_change 337 | resharper_function_definition_return_type_style = do_not_change 338 | resharper_generator_mode = false 339 | resharper_html_attribute_indent = align_by_first_attribute 340 | resharper_html_linebreak_before_elements = body,div,p,form,h1,h2,h3 341 | resharper_html_max_blank_lines_between_tags = 2 342 | resharper_html_max_line_length = 120 343 | resharper_html_pi_attribute_style = on_single_line 344 | resharper_html_space_before_self_closing = false 345 | resharper_html_wrap_lines = true 346 | resharper_ignore_space_preservation = false 347 | resharper_include_prefix_comment_in_indent = false 348 | resharper_indent_access_specifiers_from_class = false 349 | resharper_indent_aligned_ternary = true 350 | resharper_indent_anonymous_method_block = false 351 | resharper_indent_case_from_select = true 352 | resharper_indent_child_elements = OneIndent 353 | resharper_indent_class_members_from_access_specifiers = false 354 | resharper_indent_comment = true 355 | resharper_indent_inside_namespace = true 356 | resharper_indent_invocation_pars = inside 357 | resharper_indent_method_decl_pars = inside 358 | resharper_indent_nested_fixed_stmt = false 359 | resharper_indent_nested_foreach_stmt = false 360 | resharper_indent_nested_for_stmt = false 361 | resharper_indent_nested_lock_stmt = false 362 | resharper_indent_nested_usings_stmt = false 363 | resharper_indent_nested_while_stmt = false 364 | resharper_indent_pars = inside 365 | resharper_indent_preprocessor_directives = normal 366 | resharper_indent_preprocessor_if = no_indent 367 | resharper_indent_preprocessor_other = no_indent 368 | resharper_indent_preprocessor_region = usual_indent 369 | resharper_indent_statement_pars = inside 370 | resharper_indent_text = OneIndent 371 | resharper_indent_typearg_angles = inside 372 | resharper_indent_typeparam_angles = inside 373 | resharper_indent_type_constraints = true 374 | resharper_indent_wrapped_function_names = false 375 | resharper_instance_members_qualify_declared_in = this_class, base_class 376 | resharper_int_align = false 377 | resharper_int_align_comments = false 378 | resharper_int_align_declaration_names = false 379 | resharper_int_align_eq = false 380 | resharper_int_align_fix_in_adjacent = true 381 | resharper_invocable_declaration_braces = next_line 382 | resharper_keep_blank_lines_in_code = 2 383 | resharper_keep_blank_lines_in_declarations = 2 384 | resharper_keep_existing_attribute_arrangement = true 385 | resharper_keep_existing_declaration_block_arrangement = false 386 | resharper_keep_existing_declaration_parens_arrangement = true 387 | resharper_keep_existing_embedded_arrangement = true 388 | resharper_keep_existing_embedded_block_arrangement = false 389 | resharper_keep_existing_enum_arrangement = false 390 | resharper_keep_existing_expr_member_arrangement = true 391 | resharper_keep_existing_invocation_parens_arrangement = true 392 | resharper_keep_existing_property_patterns_arrangement = true 393 | resharper_keep_existing_switch_expression_arrangement = true 394 | resharper_keep_nontrivial_alias = true 395 | resharper_keep_user_linebreaks = true 396 | resharper_keep_user_wrapping = true 397 | resharper_linebreaks_around_razor_statements = true 398 | resharper_linebreaks_inside_tags_for_elements_longer_than = 2147483647 399 | resharper_linebreaks_inside_tags_for_elements_with_child_elements = true 400 | resharper_linebreaks_inside_tags_for_multiline_elements = true 401 | resharper_linebreak_before_all_elements = false 402 | resharper_linebreak_before_multiline_elements = true 403 | resharper_linebreak_before_singleline_elements = false 404 | resharper_line_break_after_colon_in_member_initializer_lists = do_not_change 405 | resharper_line_break_after_comma_in_member_initializer_lists = false 406 | resharper_line_break_before_comma_in_member_initializer_lists = false 407 | resharper_linkage_specification_braces = end_of_line 408 | resharper_linkage_specification_indentation = none 409 | resharper_local_function_body = block_body 410 | resharper_max_array_initializer_elements_on_line = 10000 411 | resharper_max_attribute_length_for_same_line = 38 412 | resharper_max_enum_members_on_line = 3 413 | resharper_max_formal_parameters_on_line = 10000 414 | resharper_max_initializer_elements_on_line = 4 415 | resharper_max_invocation_arguments_on_line = 10000 416 | resharper_member_initializer_list_style = do_not_change 417 | resharper_method_or_operator_body = block_body 418 | resharper_namespace_declaration_braces = next_line 419 | resharper_namespace_indentation = all 420 | resharper_nested_ternary_style = autodetect 421 | resharper_never_outdent_pipe_operators = true 422 | resharper_new_line_before_catch = true 423 | resharper_new_line_before_else = true 424 | resharper_new_line_before_enumerators = true 425 | resharper_normalize_tag_names = false 426 | resharper_no_indent_inside_elements = html,body,thead,tbody,tfoot 427 | resharper_no_indent_inside_if_element_longer_than = 200 428 | resharper_object_creation_when_type_evident = target_typed 429 | resharper_object_creation_when_type_not_evident = explicitly_typed 430 | resharper_old_engine = false 431 | resharper_other_braces = next_line 432 | resharper_outdent_binary_operators = true 433 | resharper_outdent_binary_ops = false 434 | resharper_outdent_commas = false 435 | resharper_outdent_dots = false 436 | resharper_outdent_namespace_member = false 437 | resharper_outdent_ternary_ops = false 438 | resharper_parentheses_non_obvious_operations = none, bitwise, bitwise_inclusive_or, bitwise_exclusive_or, shift, bitwise_and 439 | resharper_parentheses_redundancy_style = remove_if_not_clarifies_precedence 440 | resharper_pi_attributes_indent = align_by_first_attribute 441 | resharper_place_attribute_on_same_line = true 442 | resharper_place_comments_at_first_column = false 443 | resharper_place_constructor_initializer_on_same_line = true 444 | resharper_place_event_attribute_on_same_line = false 445 | resharper_place_expr_accessor_on_single_line = if_owner_is_single_line 446 | resharper_place_expr_method_on_single_line = if_owner_is_single_line 447 | resharper_place_expr_property_on_single_line = if_owner_is_single_line 448 | resharper_place_linq_into_on_new_line = true 449 | resharper_place_namespace_definitions_on_same_line = false 450 | resharper_place_property_attribute_on_same_line = false 451 | resharper_place_simple_case_statement_on_same_line = false 452 | resharper_place_simple_embedded_statement_on_same_line = if_owner_is_single_line 453 | resharper_place_simple_initializer_on_single_line = true 454 | resharper_place_simple_property_pattern_on_single_line = true 455 | resharper_place_simple_switch_expression_on_single_line = false 456 | resharper_place_type_constraints_on_same_line = true 457 | resharper_prefer_explicit_discard_declaration = false 458 | resharper_prefer_separate_deconstructed_variables_declaration = false 459 | resharper_preserve_spaces_inside_tags = pre,textarea 460 | resharper_qualified_using_at_nested_scope = false 461 | resharper_quote_style = doublequoted 462 | resharper_razor_prefer_qualified_reference = true 463 | resharper_remove_blank_lines_near_braces = false 464 | resharper_remove_blank_lines_near_braces_in_code = true 465 | resharper_remove_blank_lines_near_braces_in_declarations = true 466 | resharper_remove_this_qualifier = true 467 | resharper_requires_expression_braces = next_line 468 | resharper_resx_attribute_indent = single_indent 469 | resharper_resx_linebreak_before_elements = 470 | resharper_resx_max_blank_lines_between_tags = 0 471 | resharper_resx_max_line_length = 2147483647 472 | resharper_resx_pi_attribute_style = do_not_touch 473 | resharper_resx_space_before_self_closing = false 474 | resharper_resx_wrap_lines = false 475 | resharper_resx_wrap_tags_and_pi = false 476 | resharper_resx_wrap_text = false 477 | resharper_shaderlab_brace_style = next_line 478 | resharper_shaderlab_max_line_length = 120 479 | resharper_shaderlab_wrap_lines = true 480 | resharper_show_autodetect_configure_formatting_tip = true 481 | resharper_simple_block_style = do_not_change 482 | resharper_simple_case_statement_style = do_not_change 483 | resharper_simple_embedded_statement_style = do_not_change 484 | resharper_sort_attributes = false 485 | resharper_sort_class_selectors = false 486 | resharper_sort_usings = true 487 | resharper_sort_usings_lowercase_first = false 488 | resharper_spaces_around_eq_in_attribute = false 489 | resharper_spaces_around_eq_in_pi_attribute = false 490 | resharper_spaces_inside_tags = false 491 | resharper_space_after_attributes = true 492 | resharper_space_after_attribute_target_colon = true 493 | resharper_space_after_colon = true 494 | resharper_space_after_colon_in_case = true 495 | resharper_space_after_colon_in_inheritance_clause = true 496 | resharper_space_after_comma = true 497 | resharper_space_after_for_colon = true 498 | resharper_space_after_keywords_in_control_flow_statements = true 499 | resharper_space_after_last_attribute = false 500 | resharper_space_after_last_pi_attribute = false 501 | resharper_space_after_operator_keyword = true 502 | resharper_space_after_ptr_in_data_member = true 503 | resharper_space_after_ptr_in_data_members = false 504 | resharper_space_after_ptr_in_method = true 505 | resharper_space_after_ref_in_data_member = true 506 | resharper_space_after_ref_in_data_members = false 507 | resharper_space_after_ref_in_method = true 508 | resharper_space_after_semicolon_in_for_statement = true 509 | resharper_space_after_ternary_colon = true 510 | resharper_space_after_ternary_quest = true 511 | resharper_space_after_triple_slash = true 512 | resharper_space_after_type_parameter_constraint_colon = true 513 | resharper_space_around_additive_op = true 514 | resharper_space_around_alias_eq = true 515 | resharper_space_around_assignment_op = true 516 | resharper_space_around_assignment_operator = true 517 | resharper_space_around_deref_in_trailing_return_type = true 518 | resharper_space_around_lambda_arrow = true 519 | resharper_space_around_member_access_operator = false 520 | resharper_space_around_relational_op = true 521 | resharper_space_around_shift_op = true 522 | resharper_space_around_stmt_colon = true 523 | resharper_space_around_ternary_operator = true 524 | resharper_space_before_array_rank_parentheses = false 525 | resharper_space_before_attribute_target_colon = false 526 | resharper_space_before_checked_parentheses = false 527 | resharper_space_before_colon = false 528 | resharper_space_before_colon_in_case = false 529 | resharper_space_before_colon_in_inheritance_clause = true 530 | resharper_space_before_comma = false 531 | resharper_space_before_default_parentheses = false 532 | resharper_space_before_empty_invocation_parentheses = false 533 | resharper_space_before_empty_method_parentheses = false 534 | resharper_space_before_for_colon = true 535 | resharper_space_before_initializer_braces = false 536 | resharper_space_before_invocation_parentheses = false 537 | resharper_space_before_label_colon = false 538 | resharper_space_before_lambda_parentheses = false 539 | resharper_space_before_method_parentheses = false 540 | resharper_space_before_nameof_parentheses = false 541 | resharper_space_before_nullable_mark = false 542 | resharper_space_before_open_square_brackets = false 543 | resharper_space_before_pointer_asterik_declaration = false 544 | resharper_space_before_ptr_in_abstract_decl = false 545 | resharper_space_before_ptr_in_data_member = false 546 | resharper_space_before_ptr_in_data_members = true 547 | resharper_space_before_ptr_in_method = false 548 | resharper_space_before_ref_in_abstract_decl = false 549 | resharper_space_before_ref_in_data_member = false 550 | resharper_space_before_ref_in_data_members = true 551 | resharper_space_before_ref_in_method = false 552 | resharper_space_before_semicolon = false 553 | resharper_space_before_semicolon_in_for_statement = false 554 | resharper_space_before_singleline_accessorholder = true 555 | resharper_space_before_sizeof_parentheses = false 556 | resharper_space_before_template_args = false 557 | resharper_space_before_template_params = true 558 | resharper_space_before_ternary_colon = true 559 | resharper_space_before_ternary_quest = true 560 | resharper_space_before_trailing_comment = true 561 | resharper_space_before_typeof_parentheses = false 562 | resharper_space_before_type_argument_angle = false 563 | resharper_space_before_type_parameter_angle = false 564 | resharper_space_before_type_parameter_constraint_colon = true 565 | resharper_space_before_type_parameter_parentheses = true 566 | resharper_space_between_accessors_in_singleline_property = true 567 | resharper_space_between_attribute_sections = true 568 | resharper_space_between_closing_angle_brackets_in_template_args = false 569 | resharper_space_between_keyword_and_expression = true 570 | resharper_space_between_keyword_and_type = true 571 | resharper_space_between_method_call_empty_parameter_list_parentheses = false 572 | resharper_space_between_method_call_name_and_opening_parenthesis = false 573 | resharper_space_between_method_call_parameter_list_parentheses = false 574 | resharper_space_between_method_declaration_empty_parameter_list_parentheses = false 575 | resharper_space_between_method_declaration_name_and_open_parenthesis = false 576 | resharper_space_between_method_declaration_parameter_list_parentheses = false 577 | resharper_space_between_parentheses_of_control_flow_statements = false 578 | resharper_space_between_square_brackets = false 579 | resharper_space_between_typecast_parentheses = false 580 | resharper_space_in_singleline_accessorholder = true 581 | resharper_space_in_singleline_anonymous_method = true 582 | resharper_space_in_singleline_method = true 583 | resharper_space_near_postfix_and_prefix_op = false 584 | resharper_space_within_array_initialization_braces = false 585 | resharper_space_within_array_rank_empty_parentheses = false 586 | resharper_space_within_array_rank_parentheses = false 587 | resharper_space_within_attribute_angles = false 588 | resharper_space_within_checked_parentheses = false 589 | resharper_space_within_default_parentheses = false 590 | resharper_space_within_empty_braces = true 591 | resharper_space_within_empty_initializer_braces = false 592 | resharper_space_within_empty_invocation_parentheses = false 593 | resharper_space_within_empty_method_parentheses = false 594 | resharper_space_within_empty_template_params = false 595 | resharper_space_within_expression_parentheses = false 596 | resharper_space_within_initializer_braces = false 597 | resharper_space_within_invocation_parentheses = false 598 | resharper_space_within_method_parentheses = false 599 | resharper_space_within_nameof_parentheses = false 600 | resharper_space_within_parentheses = false 601 | resharper_space_within_single_line_array_initializer_braces = false 602 | resharper_space_within_sizeof_parentheses = false 603 | resharper_space_within_template_args = false 604 | resharper_space_within_template_params = false 605 | resharper_space_within_tuple_parentheses = false 606 | resharper_space_within_typeof_parentheses = false 607 | resharper_space_within_type_argument_angles = false 608 | resharper_space_within_type_parameter_angles = false 609 | resharper_space_within_type_parameter_parentheses = false 610 | resharper_special_else_if_treatment = true 611 | resharper_static_members_qualify_members = none 612 | resharper_static_members_qualify_with = declared_type 613 | resharper_stick_comment = true 614 | resharper_support_vs_event_naming_pattern = true 615 | resharper_toplevel_function_declaration_return_type_style = do_not_change 616 | resharper_toplevel_function_definition_return_type_style = do_not_change 617 | resharper_trailing_comma_in_multiline_lists = true 618 | resharper_trailing_comma_in_singleline_lists = false 619 | resharper_type_declaration_braces = next_line 620 | resharper_use_continuous_indent_inside_initializer_braces = true 621 | resharper_use_continuous_indent_inside_parens = true 622 | resharper_use_continuous_line_indent_in_expression_braces = false 623 | resharper_use_continuous_line_indent_in_method_pars = false 624 | resharper_use_heuristics_for_body_style = true 625 | resharper_use_indents_from_main_language_in_file = true 626 | resharper_use_indent_from_previous_element = true 627 | resharper_use_indent_from_vs = false 628 | resharper_use_roslyn_logic_for_evident_types = false 629 | resharper_vb_align_multiline_argument = true 630 | resharper_vb_align_multiline_expression = true 631 | resharper_vb_align_multiline_parameter = true 632 | resharper_vb_align_multiple_declaration = true 633 | resharper_vb_max_line_length = 120 634 | resharper_vb_place_field_attribute_on_same_line = true 635 | resharper_vb_place_method_attribute_on_same_line = false 636 | resharper_vb_place_type_attribute_on_same_line = false 637 | resharper_vb_prefer_qualified_reference = false 638 | resharper_vb_space_after_unary_operator = true 639 | resharper_vb_space_around_multiplicative_op = false 640 | resharper_vb_wrap_lines = true 641 | resharper_wrap_after_binary_opsign = true 642 | resharper_wrap_after_declaration_lpar = false 643 | resharper_wrap_after_dot = false 644 | resharper_wrap_after_dot_in_method_calls = false 645 | resharper_wrap_after_expression_lbrace = true 646 | resharper_wrap_after_invocation_lpar = false 647 | resharper_wrap_arguments_style = wrap_if_long 648 | resharper_wrap_around_elements = true 649 | resharper_wrap_array_initializer_style = wrap_if_long 650 | resharper_wrap_base_clause_style = wrap_if_long 651 | resharper_wrap_before_arrow_with_expressions = false 652 | resharper_wrap_before_binary_opsign = false 653 | resharper_wrap_before_colon = false 654 | resharper_wrap_before_comma = false 655 | resharper_wrap_before_comma_in_base_clause = false 656 | resharper_wrap_before_declaration_lpar = false 657 | resharper_wrap_before_declaration_rpar = false 658 | resharper_wrap_before_expression_rbrace = true 659 | resharper_wrap_before_extends_colon = false 660 | resharper_wrap_before_first_type_parameter_constraint = false 661 | resharper_wrap_before_invocation_lpar = false 662 | resharper_wrap_before_invocation_rpar = false 663 | resharper_wrap_before_linq_expression = false 664 | resharper_wrap_before_ternary_opsigns = true 665 | resharper_wrap_before_type_parameter_langle = false 666 | resharper_wrap_braced_init_list_style = wrap_if_long 667 | resharper_wrap_chained_binary_expressions = wrap_if_long 668 | resharper_wrap_chained_method_calls = wrap_if_long 669 | resharper_wrap_ctor_initializer_style = wrap_if_long 670 | resharper_wrap_enumeration_style = chop_if_long 671 | resharper_wrap_enum_declaration = chop_always 672 | resharper_wrap_extends_list_style = wrap_if_long 673 | resharper_wrap_for_stmt_header_style = chop_if_long 674 | resharper_wrap_multiple_declaration_style = chop_if_long 675 | resharper_wrap_multiple_type_parameter_constraints_style = chop_if_long 676 | resharper_wrap_object_and_collection_initializer_style = chop_if_long 677 | resharper_wrap_parameters_style = wrap_if_long 678 | resharper_wrap_property_pattern = chop_if_long 679 | resharper_wrap_switch_expression = chop_always 680 | resharper_wrap_ternary_expr_style = chop_if_long 681 | resharper_wrap_verbatim_interpolated_strings = no_wrap 682 | resharper_xmldoc_attribute_indent = single_indent 683 | resharper_xmldoc_linebreak_before_elements = summary,remarks,example,returns,param,typeparam,value,para 684 | resharper_xmldoc_max_blank_lines_between_tags = 0 685 | resharper_xmldoc_max_line_length = 120 686 | resharper_xmldoc_pi_attribute_style = do_not_touch 687 | resharper_xmldoc_space_before_self_closing = true 688 | resharper_xmldoc_wrap_lines = true 689 | resharper_xmldoc_wrap_tags_and_pi = true 690 | resharper_xmldoc_wrap_text = true 691 | resharper_xml_attribute_indent = align_by_first_attribute 692 | resharper_xml_linebreak_before_elements = 693 | resharper_xml_max_blank_lines_between_tags = 2 694 | resharper_xml_max_line_length = 120 695 | resharper_xml_pi_attribute_style = do_not_touch 696 | resharper_xml_space_before_self_closing = true 697 | resharper_xml_wrap_lines = true 698 | resharper_xml_wrap_tags_and_pi = true 699 | resharper_xml_wrap_text = false 700 | 701 | [*.asmdef] 702 | indent_style = space 703 | indent_size = 2 704 | 705 | [*.{appxmanifest,asax,ascx,aspx,axaml,build,cg,cginc,compute,cs,cshtml,dtd,fs,fsi,fsscript,fsx,hlsl,hlsli,hlslinc,master,ml,mli,nuspec,paml,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}] 706 | indent_style = space 707 | indent_size = 4 708 | tab_width = 4 709 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | [Dd]ebug/ 2 | [Rr]elease/ 3 | x64/ 4 | [Bb]in/ 5 | [Oo]bj/ 6 | 7 | *.*~ 8 | .vs 9 | .vscode 10 | .idea 11 | .gradle 12 | *.DotSettings.user -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 CodeWriter Packages 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5083fe4bc0bd02b4a9a9c04990a8b423 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TutorialMaskForUGUI [![Github license](https://img.shields.io/github/license/codewriter-packages/TutorialMaskForUGUI.svg?style=flat-square)](#) [![Unity 2021.3](https://img.shields.io/badge/Unity-2021.3+-2296F3.svg?style=flat-square)](#) ![GitHub package.json version](https://img.shields.io/github/package-json/v/codewriter-packages/TutorialMaskForUGUI?style=flat-square) 2 | 3 | UI Tutorial Mask is a component for highlighting specific objects over darkened background for Unity UI (uGUI) 4 | 5 | ![Demo](https://github.com/codewriter-packages/TutorialMaskForUGUI/assets/26966368/4b31beed-3324-42d8-ad7c-62edcafb1bdc) 6 | 7 | ## :rocket: How to use? 8 | 9 | - Create an `Image` that will cover the entire visible area, add a `TutorialMask` script to it 10 | - Add a `TutorialObject` script to each object that should be visible on top of the image 11 | - If you want to use `TutorialObject` with `Mask`, you need to add `MaskFixForTutorial` script on each mask object. It's necessary due to a bug in the mask component that overwrites all bit (even which it does not use) in stencil buffer 12 | 13 | ## :open_book: How to Install 14 | Minimal Unity Version is 2021.3. 15 | 16 | Library distributed as git package ([How to install package from git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html)) 17 |
Git URL: `https://github.com/codewriter-packages/TutorialMaskForUGUI.git` 18 | 19 | ## :green_book: License 20 | 21 | TutorialMaskForUGUI is [MIT licensed](./LICENSE.md). 22 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bb8d14e2195824d41a6a2496b26a1777 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 710fc8e04800b3843b49497274f69574 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Runtime/CodeWriter.TutorialMaskForUGUI.Runtime.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CodeWriter.TutorialMaskForUGUI.Runtime" 3 | } 4 | -------------------------------------------------------------------------------- /Runtime/CodeWriter.TutorialMaskForUGUI.Runtime.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4c3075e3992331f4ab71f86d37982dc6 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Runtime/MaskFixForTutorial.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.EventSystems; 4 | using UnityEngine.Rendering; 5 | using UnityEngine.UI; 6 | 7 | namespace CodeWriter.UIExtensions 8 | { 9 | [RequireComponent(typeof(Mask))] 10 | public class MaskFixForTutorial : UIBehaviour, IMaterialModifier 11 | { 12 | [NonSerialized] 13 | private Graphic _graphic; 14 | 15 | [NonSerialized] 16 | private Mask _mask; 17 | 18 | [NonSerialized] 19 | private Material _maskMaterial; 20 | 21 | [NonSerialized] 22 | private Material _unmaskMaterial; 23 | 24 | public Graphic Graphic => _graphic ?? (_graphic = GetComponent()); 25 | public Mask Mask => _mask ?? (_mask = GetComponent()); 26 | 27 | public Material GetModifiedMaterial(Material baseMaterial) 28 | { 29 | if (!Mask.MaskEnabled()) 30 | { 31 | return baseMaterial; 32 | } 33 | 34 | var rootSortCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform); 35 | var stencilDepth = MaskUtilities.GetStencilDepth(transform, rootSortCanvas); 36 | if (stencilDepth >= 7) 37 | { 38 | Debug.LogWarning("Attempting to use a stencil mask with depth > 7", gameObject); 39 | return baseMaterial; 40 | } 41 | 42 | int desiredStencilBit = 1 << stencilDepth; 43 | 44 | // if we are at the first level... 45 | // we want to destroy what is there 46 | if (desiredStencilBit == 1) 47 | { 48 | var maskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Replace, CompareFunction.Always, 49 | Mask.showMaskGraphic ? ColorWriteMask.All : 0, 255, desiredStencilBit); 50 | StencilMaterial.Remove(_maskMaterial); 51 | _maskMaterial = maskMaterial; 52 | 53 | var unmaskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Zero, CompareFunction.Always, 0, 54 | 255, desiredStencilBit); 55 | StencilMaterial.Remove(_unmaskMaterial); 56 | _unmaskMaterial = unmaskMaterial; 57 | Graphic.canvasRenderer.popMaterialCount = 1; 58 | Graphic.canvasRenderer.SetPopMaterial(_unmaskMaterial, 0); 59 | 60 | return _maskMaterial; 61 | } 62 | 63 | //otherwise we need to be a bit smarter and set some read / write masks 64 | var maskMaterial2 = StencilMaterial.Add(baseMaterial, desiredStencilBit | (desiredStencilBit - 1), 65 | StencilOp.Replace, CompareFunction.Equal, Mask.showMaskGraphic ? ColorWriteMask.All : 0, 66 | desiredStencilBit - 1, desiredStencilBit | (desiredStencilBit - 1)); 67 | StencilMaterial.Remove(_maskMaterial); 68 | _maskMaterial = maskMaterial2; 69 | 70 | Graphic.canvasRenderer.hasPopInstruction = true; 71 | var unmaskMaterial2 = StencilMaterial.Add(baseMaterial, desiredStencilBit - 1, StencilOp.Replace, 72 | CompareFunction.Equal, 0, desiredStencilBit - 1, desiredStencilBit | (desiredStencilBit - 1)); 73 | StencilMaterial.Remove(_unmaskMaterial); 74 | _unmaskMaterial = unmaskMaterial2; 75 | Graphic.canvasRenderer.popMaterialCount = 1; 76 | Graphic.canvasRenderer.SetPopMaterial(_unmaskMaterial, 0); 77 | 78 | return _maskMaterial; 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /Runtime/MaskFixForTutorial.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a4c2f7f0c797483ca8b4a4dcff27681b 3 | timeCreated: 1716646653 -------------------------------------------------------------------------------- /Runtime/TutorialMask.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.EventSystems; 4 | using UnityEngine.Rendering; 5 | using UnityEngine.UI; 6 | 7 | namespace CodeWriter.UIExtensions 8 | { 9 | [ExecuteAlways] 10 | [DisallowMultipleComponent] 11 | [RequireComponent(typeof(RectTransform))] 12 | [RequireComponent(typeof(Graphic))] 13 | [AddComponentMenu("CodeWriter/UIExtensions/Tutorial Mask")] 14 | public class TutorialMask : UIBehaviour, IMaterialModifier 15 | { 16 | [SerializeField] 17 | [Tooltip("Resets the mask, useful if you want to show multiple tutorials on top of each other")] 18 | private bool clearMask = true; 19 | 20 | [SerializeField] 21 | private bool invert; 22 | 23 | [NonSerialized] 24 | private Graphic _graphic; 25 | 26 | [NonSerialized] 27 | private Material _maskMaterial; 28 | 29 | [NonSerialized] 30 | private Material _unMaskMaterial; 31 | 32 | public Graphic Graphic => _graphic ?? (_graphic = GetComponent()); 33 | 34 | protected override void OnEnable() 35 | { 36 | base.OnEnable(); 37 | 38 | if (Graphic != null) 39 | { 40 | if (clearMask) 41 | { 42 | Graphic.canvasRenderer.hasPopInstruction = true; 43 | } 44 | 45 | Graphic.SetMaterialDirty(); 46 | } 47 | } 48 | 49 | protected override void OnDisable() 50 | { 51 | base.OnDisable(); 52 | 53 | if (Graphic != null) 54 | { 55 | Graphic.SetMaterialDirty(); 56 | Graphic.canvasRenderer.hasPopInstruction = false; 57 | Graphic.canvasRenderer.popMaterialCount = 0; 58 | } 59 | 60 | StencilMaterial.Remove(_maskMaterial); 61 | _maskMaterial = null; 62 | 63 | StencilMaterial.Remove(_unMaskMaterial); 64 | _unMaskMaterial = null; 65 | } 66 | 67 | #if UNITY_EDITOR 68 | protected override void OnValidate() 69 | { 70 | base.OnValidate(); 71 | 72 | if (!IsActive()) 73 | { 74 | return; 75 | } 76 | 77 | if (Graphic != null) 78 | { 79 | Graphic.SetMaterialDirty(); 80 | } 81 | } 82 | #endif 83 | 84 | public Material GetModifiedMaterial(Material baseMaterial) 85 | { 86 | if (!IsActive()) 87 | { 88 | return baseMaterial; 89 | } 90 | 91 | const int tutorialBit = 1 << 7; 92 | 93 | var maskMat = StencilMaterial.Add(baseMaterial, 94 | stencilID: tutorialBit, 95 | operation: StencilOp.Keep, 96 | compareFunction: invert ? CompareFunction.Equal : CompareFunction.NotEqual, 97 | colorWriteMask: ColorWriteMask.All, 98 | readMask: tutorialBit, 99 | writeMask: 0 100 | ); 101 | StencilMaterial.Remove(_maskMaterial); 102 | _maskMaterial = maskMat; 103 | 104 | if (clearMask) 105 | { 106 | var unMaskMat = StencilMaterial.Add(baseMaterial, 107 | stencilID: tutorialBit, 108 | operation: StencilOp.Zero, 109 | compareFunction: CompareFunction.Always, 110 | colorWriteMask: 0, 111 | readMask: 255, 112 | writeMask: tutorialBit 113 | ); 114 | StencilMaterial.Remove(_unMaskMaterial); 115 | _unMaskMaterial = unMaskMat; 116 | 117 | Graphic.canvasRenderer.hasPopInstruction = true; 118 | Graphic.canvasRenderer.popMaterialCount = 1; 119 | Graphic.canvasRenderer.SetPopMaterial(_unMaskMaterial, 0); 120 | } 121 | else 122 | { 123 | Graphic.canvasRenderer.hasPopInstruction = false; 124 | Graphic.canvasRenderer.popMaterialCount = 0; 125 | } 126 | 127 | return maskMat; 128 | } 129 | } 130 | } -------------------------------------------------------------------------------- /Runtime/TutorialMask.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0774eccf33534a799283e4bbc1d257ed 3 | timeCreated: 1716640791 -------------------------------------------------------------------------------- /Runtime/TutorialObject.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.EventSystems; 4 | using UnityEngine.Rendering; 5 | using UnityEngine.UI; 6 | 7 | namespace CodeWriter.UIExtensions 8 | { 9 | [ExecuteAlways] 10 | [DisallowMultipleComponent] 11 | [RequireComponent(typeof(RectTransform))] 12 | [RequireComponent(typeof(Graphic))] 13 | [AddComponentMenu("CodeWriter/UIExtensions/Tutorial Object")] 14 | public class TutorialObject : UIBehaviour, IMaterialModifier 15 | { 16 | [SerializeField] 17 | private bool showGraphics = true; 18 | 19 | [NonSerialized] 20 | private Graphic _graphic; 21 | 22 | [NonSerialized] 23 | private Material _highlightMaterial; 24 | 25 | public Graphic Graphic => _graphic ?? (_graphic = GetComponent()); 26 | 27 | protected override void OnEnable() 28 | { 29 | base.OnEnable(); 30 | 31 | if (Graphic != null) 32 | { 33 | Graphic.SetMaterialDirty(); 34 | } 35 | } 36 | 37 | protected override void OnDisable() 38 | { 39 | base.OnDisable(); 40 | 41 | if (Graphic != null) 42 | { 43 | Graphic.SetMaterialDirty(); 44 | } 45 | 46 | StencilMaterial.Remove(_highlightMaterial); 47 | _highlightMaterial = null; 48 | } 49 | 50 | #if UNITY_EDITOR 51 | protected override void OnValidate() 52 | { 53 | base.OnValidate(); 54 | 55 | if (!IsActive()) 56 | { 57 | return; 58 | } 59 | 60 | if (Graphic != null) 61 | { 62 | Graphic.SetMaterialDirty(); 63 | } 64 | } 65 | #endif 66 | 67 | public Material GetModifiedMaterial(Material baseMaterial) 68 | { 69 | if (!IsActive()) 70 | { 71 | return baseMaterial; 72 | } 73 | 74 | const int tutorialBit = 1 << 7; 75 | 76 | if (Graphic is MaskableGraphic maskableGraphic && maskableGraphic.maskable) 77 | { 78 | var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform); 79 | var stencilValue = MaskUtilities.GetStencilDepth(transform, rootCanvas); 80 | 81 | if (stencilValue > 0) 82 | { 83 | var highlightMat = StencilMaterial.Add(baseMaterial, 84 | stencilID: tutorialBit | ((1 << stencilValue) - 1), 85 | operation: StencilOp.Replace, 86 | compareFunction: CompareFunction.Equal, 87 | colorWriteMask: showGraphics ? ColorWriteMask.All : 0, 88 | readMask: (1 << stencilValue) - 1, 89 | writeMask: tutorialBit 90 | ); 91 | StencilMaterial.Remove(_highlightMaterial); 92 | _highlightMaterial = highlightMat; 93 | 94 | return _highlightMaterial; 95 | } 96 | } 97 | 98 | { 99 | var highlightMat = StencilMaterial.Add(baseMaterial, 100 | stencilID: tutorialBit, 101 | operation: StencilOp.Replace, 102 | compareFunction: CompareFunction.Always, 103 | colorWriteMask: showGraphics ? ColorWriteMask.All : 0, 104 | readMask: 0, 105 | writeMask: tutorialBit 106 | ); 107 | StencilMaterial.Remove(_highlightMaterial); 108 | _highlightMaterial = highlightMat; 109 | } 110 | 111 | return _highlightMaterial; 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /Runtime/TutorialObject.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f6b273dd3b84b0c9ac80b5a86a1da23 3 | timeCreated: 1716640758 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.codewriter.tutorial-mask", 3 | "displayName": "UI Tutorial Mask", 4 | "description": "UI Tutorial Mask is a component for highlighting specific objects over darkened background for Unity UI (uGUI)", 5 | "version": "1.0.0", 6 | "unity": "2021.3", 7 | "license": "MIT", 8 | "keywords": [ 9 | "unity" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/codewriter-packages/TutorialMaskForUGUI.git" 14 | }, 15 | "author": "CodeWriter (https://github.com/orgs/codewriter-packages)", 16 | "homepage": "https://github.com/codewriter-packages/TutorialMaskForUGUI#readme", 17 | "dependencies": {} 18 | } -------------------------------------------------------------------------------- /package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 21e0517344b3afa45995cd201636d365 3 | PackageManifestImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | --------------------------------------------------------------------------------