├── .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 [](#) [](#) 
2 |
3 | UI Tutorial Mask is a component for highlighting specific objects over darkened background for Unity UI (uGUI)
4 |
5 | 
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 |
--------------------------------------------------------------------------------