Использование слоев, тегов и других констант Unity из кода

Unity позволяет настраивать имена слоев, тегов, осей ввода и других констант через визуальное редактирование в редакторе. Как мы можем получить все эти данные из кода?

Это странно, но у нас нет полного доступа к подобной информации из кода, мы должны сами каким-то образом определять эти данные через строковые константы. использование строк-констант прямо в коде - не очень хорошая практика, лучше сделать отдельный класс-справочник, содержащий всю подобную информацию. Это позволит использовать именованные константы в intellisense редактора и даже рефакторить их в дальнейшем.

Хорошо, будем использовать константы как поля класса. Но ручное создание, проверка на актуальность, чистка старых значений руками каждый раз - слишком утомительно, как мне кажется. По этой причине я написал специальный генератор данных констант в виде расширения редактора - он сэкономил мне кучу времени. Генератор является частью моей библиотеки и доступен через главное меню редактора Unity:

После запуска появится окно с настройками, каждая из которых может быть уникальной для текущего проекта. Можно указать путь до файла с константами относительно папки “Assets”, пространство имен для конечного класса и указать папки, которые должны быть проигнорированы при сканировании (Пути должны быть разделены знаком “;”).

Когда все настройки выставлены и нажата кнопка “Generate” - все значения будут автоматически сохранены в настройках проекта и будут восстановлены при следующем открытии окна - полезная особенность для следующей перегенерации констант с теми же настройками. По сути, перегенерация делается одной кнопкой.

Настройка “Options” определяет - что мы хотим получить в коде:

  • Layers - Слои камеры / физики.
  • Tags - Теги.
  • Scenes - Сцены. Будут добавлены только те сцены, которые есть в списке BuildSettings.
  • Animators - Парметры из графов Animator-а.
  • Axes - Оси ввода.
  • Shaders - Параметры шейдеров. Параметры шейдеров, имена которых начинаются на “Hidden”, будут проигнорированы. Параметры с атрибутом HideFromInspector будут проигнорированы тоже.
  • SortingLayers - Слои сортировки в 2D-режиме.

Результатом сканирования и генерации будет файл с новым C#-классом внутри (содержимое файла будет полностью перезаписываться при каждой перегенерации):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Auto generated code, dont change it manually!

using UnityEngine;

namespace Client.Common {
public static partial class UnityIdents {
public const int SortingLayerDefault = 0;

public const string AxisCancel = "Cancel";

public const string AxisFire1 = "Fire1";

public const string AxisFire2 = "Fire2";

public const string AxisFire3 = "Fire3";

public const string AxisHorizontal = "Horizontal";

public const string AxisJump = "Jump";

public const string AxisMouseScrollWheel = "Mouse ScrollWheel";

public const string AxisMouseX = "Mouse X";

public const string AxisMouseY = "Mouse Y";

public const string AxisSubmit = "Submit";

public const string AxisVertical = "Vertical";

public const string TagEditorOnly = "EditorOnly";

public const string TagFinish = "Finish";

public const string TagGameController = "GameController";

public const string TagMainCamera = "MainCamera";

public const string TagPlayer = "Player";

public const string TagRespawn = "Respawn";

public const string TagUntagged = "Untagged";

public static readonly int LayerDefault = LayerMask.NameToLayer ("Default");

public static readonly int LayerIgnoreRaycast = LayerMask.NameToLayer ("Ignore Raycast");

public static readonly int LayerTransparentFX = LayerMask.NameToLayer ("TransparentFX");

public static readonly int LayerUI = LayerMask.NameToLayer ("UI");

public static readonly int LayerWater = LayerMask.NameToLayer ("Water");

public static readonly int MaskLayerDefault = 1 << LayerDefault;

public static readonly int MaskLayerIgnoreRaycast = 1 << LayerIgnoreRaycast;

public static readonly int MaskLayerTransparentFX = 1 << LayerTransparentFX;

public static readonly int MaskLayerUI = 1 << LayerUI;

public static readonly int MaskLayerWater = 1 << LayerWater;
}
}

Итак, мы можем использовать слои, теги, оси ввода из кода и через intellisense без опасений, что опечатаемся или будем использовать несуществующие данные.

Оформить подписку можно здесь: