устаревшие: Хотя этот ответ был вполне действительным на момент написания, содержащаяся в нем информация устарела. Есть лучший способ сделать это сейчас, см. this answer. Ответ был сохранен по историческим причинам, пожалуйста, подумайте об этом перед голосованием.
ОБНОВЛЕНИЕ:
я улучшил раствор, описанный ниже, в широком масштабе и сделал проект с открытым исходным кодом (лицензия MIT) размещен на GitHub из него. С первого взгляда он не только обеспечивает доступ к пакетной версии текущего приложения, но и отслеживает историю предыдущей версии пакета довольно приятным образом - по крайней мере, с тех пор, как требуется установка плагина или некоторые ручные настройки.
Так что смотрите на:
BundleVersionChecker at github
Usage and more details
Я просто нашел другую и очень удобное решение. Требуются 2 класса:
Первый класс класса, проверяющий текущий PlayerSettings.bundleVersion
. Я назвал его BundleVersionChecker
и он должен быть помещен в Assets/Editor.Он функционирует как генератор кода, который просто генерирует очень простой статический класс, содержащий только строку версии, если версия расслоения изменилась:
using UnityEngine;
using UnityEditor;
using System.IO;
[InitializeOnLoad]
public class BundleVersionChecker
{
/// <summary>
/// Class name to use when referencing from code.
/// </summary>
const string ClassName = "CurrentBundleVersion";
const string TargetCodeFile = "Assets/Scripts/Config/" + ClassName + ".cs";
static BundleVersionChecker() {
string bundleVersion = PlayerSettings.bundleVersion;
string lastVersion = CurrentBundleVersion.version;
if (lastVersion != bundleVersion) {
Debug.Log ("Found new bundle version " + bundleVersion + " replacing code from previous version " + lastVersion +" in file \"" + TargetCodeFile + "\"");
CreateNewBuildVersionClassFile (bundleVersion);
}
}
static string CreateNewBuildVersionClassFile (string bundleVersion) {
using (StreamWriter writer = new StreamWriter (TargetCodeFile, false)) {
try {
string code = GenerateCode (bundleVersion);
writer.WriteLine ("{0}", code);
} catch (System.Exception ex) {
string msg = " threw:\n" + ex.ToString();
Debug.LogError (msg);
EditorUtility.DisplayDialog ("Error when trying to regenerate class", msg, "OK");
}
}
return TargetCodeFile;
}
/// <summary>
/// Regenerates (and replaces) the code for ClassName with new bundle version id.
/// </summary>
/// <returns>
/// Code to write to file.
/// </returns>
/// <param name='bundleVersion'>
/// New bundle version.
/// </param>
static string GenerateCode (string bundleVersion) {
string code = "public static class " + ClassName + "\n{\n";
code += System.String.Format ("\tpublic static readonly string version = \"{0}\";", bundleVersion);
code += "\n}\n";
return code;
}
}
2-й класса называется CurrentBundleVersion
. Это вышеупомянутый простой класс, созданный BundleVersionChecker
, и доступен из вашего кода. Он будет регенерирован BundleVersionChecker
автоматически, если его строка версии не равна той, которая найдена в PlayerSettings
.
public static class CurrentBundleVersion
{
public static readonly string version = "0.8.5";
}
Поскольку это сгенерированный код, вам не нужно заботиться об этом, просто передайте его в вашу систему контроля версий.
Так в любом месте вашего кода, вы можете просто написать:
if (CurrentBundleVersion != "0.8.4") {
// do migration stuff
}
В настоящее время я работаю над более сложной версией. Это будет содержать некоторую версию отслеживания, чтобы сделать что-то вроде
if (CurrentBundleVersion.OlderThan (CurrentBundleVersion.Version_0_8_5) //...
Комплект, на котором он расположен: на вашем собственном сервере или размещен контент для покупок в приложении? В чем ответственность за комплект? Реальные активы или просто информация о версии для запуска обновления приложения? – Kay
Посмотрите на мой udpated ответ ниже, если вам все еще нравится иметь решение для получения версии пакета. – Kay
Я уже выпустил игру, но посмотрю на нее для будущих проектов! Благодаря! – Sunkas