Скрипты именования
Важно тщательно выбирать имена для файлов скриптов и классов, объявляемых в них. Использование соответствующих имен файлов и организация классов в пространствах имен помогает обеспечить, чтобы компилятор мог идентифицировать ваши классы без ошибок.
Имена файлов скриптов
Имя файла, которое вы задаёте при создании скрипта, используется и как имя объявленного внутри класса. Хорошая практика — чтобы имя файла скрипта совпадало с именем объявленного в нём класса.
Для скриптов, полученных из встроенных типов Unity MonoBehaviour и ScriptableObject, Unity всё равно может определить тип класса, объявленный в вашем скрипте, даже если имя файла не совпадает, но есть ограничения:
- Если в вашем скрипте объявлено несколько классов, Unity выбирает класс, имя которого совпадает с именем файла.
- Если вы используете C#
partialключевое слово, чтобы объявить один класс, производный от MonoBehaviour, в нескольких файлах, — только файл с тем же именем, что иpartialкласс можно использовать как Компонент.
Примечание: во всех случаях, когда имя класса невозможно однозначно сопоставить с конкретным файлом, Unity выводит предупреждение.
Имена классов и пространства имен
Конфликты имён возникают, когда в разных частях проекта объявлены несколько классов с одинаковым именем. Вероятность таких конфликтов растёт вместе с масштабом проекта и числом участников. Например, один разработчик пишет код для управления главным персонажем, а другой — аналогичный код для противника. Если оба назовут свой основной класс Controller, компилятор не сможет определить, к какому классу относятся использования Controller в коде.
Чтобы избежать конфликтов имён классов, в программировании на C# принято раскладывать классы по пространствам имён. Пространство имён — это набор классов, и его префикс перед именем класса даёт полный и однозначный способ на него сослаться. См. документацию Microsoft по теме пространства имен для больше информации.
В приведённом ниже примере классы Controller1 и Controller2 являются членами пространства имен Enemy:
namespace Enemy {
public class Controller1 : MonoBehaviour {
...
}
public class Controller2 : MonoBehaviour {
...
}
}
Ссылаться на эти классы в коде однозначно можно по их полному имени. Полное имя — это пространство имён плюс имя класса, в данном случае Enemy.Controller1 и Enemy.Controller2 соответственно. Объявление пространства имён можно обернуть вокруг существующих объявлений классов, и тогда переименовывать каждый класс по отдельности не придётся. Объявления пространств имён можно добавлять вокруг классов везде, где они встречаются, даже если эти классы находятся в разных исходных файлах.
Вы можете избежать необходимости повторного ввода префикса пространства имен, добавив директиву using в начале файла.
using Enemy;
Это заставляет компилятор разрешать ссылки в этом файле на Controller1 и Controller2 как Enemy.Controller1 и Enemy.Controller2Если скрипт также должен ссылаться на классы с одинаковым именем из другого пространства имен (например, класс с именем Player), то необходимо указывать префиксы пространств имён. Если два пространства имён с конфликтующими именами классов импортируются через using директив в одном и том же файле, компилятор сообщает об ошибке.
Ограничение для нескольких пространств имен
В Unity есть особое ограничение, связанное с пространствами имён и классами MonoBehaviour или ScriptableObject. Если файл содержит определение класса MonoBehaviour или ScriptableObject, использовать в нём несколько пространств имён нельзя.
Unity выдает следующее предупреждение в консоли:
Class MyClass can not exist in multiple namespaces in the same file, even if one is excluded with preprocessor directives. Please move these to separate files if this is the case.
Если у вас есть файл, который определяет MonoBehaviour в одном пространстве имен, а другие классы в другом пространстве имен в одном файле, Unity не распознает класс MonoBehaviour, и вы не сможете использовать его на GameObject. Это ограничение введено в Unity 2020.1 ради ускорения импорта и компиляции, поэтому некоторые старые пакеты из Asset Store, написанные до его появления, могут из-за этого работать неправильно. Чтобы устранить связанные с этим проблемы, разнесите код классов каждого пространства имён по отдельным файлам.