Как заставить плагин Unity поддерживать старые версии Unity? - PullRequest
0 голосов
/ 04 июля 2019

Я разрабатываю плагин для Unity.Скажем, на моей машине установлена ​​самая последняя версия Unity (сейчас это 2019.1.8).Однако я также хочу, чтобы плагин поддерживал более старые версии Unity, предпочтительно даже очень старые версии (например, 4.x или 5.x).Как этого добиться?

Я бы подумал, что на моей машине должны быть установлены отдельные версии Unity.Например, с помощью Unity Hub или вручную переименовывая установочные папки Unity каждый раз, когда я хочу сохранить версию перед установкой новой (как описано здесь: https://support.unity3d.com/hc/en-us/articles/210001066-Can-I-activate-more-than-one-version-of-Unity-on-the-same-machine-).

При выпуске плагина на Unity AssetStore, мне также нужно было бы загрузить несколько *.unitypackage файлов, и Unity Asset Store доставит соответствующий файл каждому покупателю, в зависимости от версии установленного Unity Editor на компьютере покупателя.

Начиная с Unityверсии могут иметь существенные различия, по сути, мне придется разрабатывать несколько проектов параллельно. И (особенно на более поздних этапах разработки) одно изменение кода придется вручную копировать во все другие версии проекта. Это имеет смысл, поскольку в некоторыхв некоторых случаях это будет не просто копирование и вставка, а настройка кода для работы с вещами, которые не закрывались в более старых версиях, были переименованы, устарели и т. д.

Для меня это выглядит невероятно накладнымиДелают ли разработчики плагина Unity на самом деле все это или нет?здесь какой-то более простой способ?Если я просто соберусь с последней версией Unity и загрузлю только один файл *.unitypackage, то только некоторые из самых последних версий Unity (обычно не более 1 года) смогут правильно импортировать и использовать его, верно

1 Ответ

1 голос
/ 05 июля 2019

В geenral в вашем коде вы можете использовать c # препроцессоры , чтобы компилировать код или условно комментировать некоторые глобальные определения.

Unity предлагает Версия и платформаспециальные препроцессоры

Начиная с Unity 2.6.0 и далее, вы можете компилировать код выборочно.Доступные параметры зависят от версии редактора, над которым вы работаете.Учитывая номер версии XYZ (например, 2.6.0), Unity предоставляет три глобальные директивы #define в следующих форматах: UNITY_X, UNITY_X_Y и UNITY_X_Y_Z.

и

Начиная с Unity 5.3.4, вы можете скомпилировать код выборочно на основе самой ранней версии Unity, необходимой для компиляции или выполнения заданной части кода.Учитывая тот же формат версии, что и выше (X.Y.Z), Unity предоставляет один глобальный #define в формате UNITY_X_Y_OR_NEWER, который можно использовать для этой цели.

Таким образом, вы можете точно контролировать, какойверсия кода должна использоваться для конкретной целевой платформы, версии Unity, версии .Net и т. д.


Вы можете заключить код, например, в

#if UNITY_2017_1_OR_NEWER
    /* Code that only compiles under newer version */
#elif UNITY_5
    /* Code that compiles for Unity 5.x.y */
#elif UNITY_4
    /* Code that compiles for Unity 4.x.y */
#else
    /* apparently some older stuff */
#endif

Затем вы можете упаковатьвсе это в одном *.unitypackage, и пользователь даже не заметит.Поскольку закомментированный материал удаляется во встроенном приложении, он не увеличивает размер сборки.

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

Чтобы сделать его максимально простым для меня, я бы, вероятно, использовал структуру папок, например

YourPlugIn
|-- General
|-- Unity4
|-- Unity5
|-- Unity2017

, и использовал ключевое слово partial, чтобы реализовать полное поведение, вместо этого включив иотключение отдельных блоков кода, например

General / MyBehaviour.cs

public partial class MyBehaviour : MonoBehaviour
{
    // this is the script users should be dragging onto objects
}

Unity4 / MyBehaviour_4.cs

#if UNITY_4
// Extends the general MyBehaviour for Unity 4.x.y
public partial class MyBehaviour
{
    public string InitialValue;

    private void Start()
    {
        Debug.Log(InitialValue);
    }
}
#endif

Unity5 / MyBehaviour_5.cs

#if UNITY_5
// Extends the general MyBehaviour for Unity 5.x.y
public partial class MyBehaviour
{
    public int InitialValue;

    private void Start()
    {
        Debug.Log(InitialValue.ToString());
    }
}
#endif

Unity2017 / MyBehaviour_2017.cs

#if UNITY_2017
// Extends the general MyBehaviour for Unity 2017.x.y
public partial class MyBehaviour
{
    public Vector3 InitialValue;

    private void Start()
    {
        Debug.Log(InitialValue.ToString());
    }
}
#endif

Но , тогда вы не можете использовать ни одно из, например, UNITY_X_Y_OR_NEWER определений, поскольку вы получите дубликаты;)

Конечно, есть много других проблемных зон, таких как, например, переименование ваших классов позже или в более новой версии, оборачивая их в интерфейсы и т. Д., Но я надеюсь, что я ясно изложил свою идею.


Я бы тоже рискнулTo утверждать, что этого должно быть достаточно, чтобы поддерживать только «последние» версии Unity и не делать плагин обратно совместимым вплоть до Unity 2.6 ... кто все равно будет использовать этот старый материал?

В настоящее время вHUB - последняя версия, предлагаемая для установки, - 2017.1.5f1, поэтому я утверждаю, что достаточно иметь обратную поддержку до этой версии, а не дальше.


К вопросу об управлении версиями:Github предлагает довольно полный .gitignore для Unity .Там вы можете видеть, что существует намного больше, чем папка Temp, которую следует игнорировать .. особенно Library.

В этот пост Я тожеописал быстрый и безопасный способ удаления всех сгенерированных файлов с помощью одной команды git.Лично мне нравится исключать все Library/*.asset файлы из игнорируемого (поэтому они контролируются версией), так как здесь хранятся некоторые вещи, такие как пользовательские макеты, текущая цель сборки и т. Д.

...