Сборка и загрузка пакетов активов в Unity
Я не могу заставить Unity Assetbundles работать в сборке iOS.
В Unity я строю пакеты активов:
using UnityEditor;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.iOS);
}
}
И они прекрасно работают в Unity. используя их с
AssetBundle bundleLoadRequest = AssetBundle.LoadFromFile("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString());
и / или
WWW wwww = WWW.LoadFromCacheOrDownload("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString(), 4);
(Без префикса file:// пакеты не будут работать ни в Unity, ни в Xcode)
Я строю проект для XCode и запускаю его в XCode и получаю эту ошибку:
Невозможно открыть файл архива: / Пользователи / Пользователь / Документы / Рабочие пространства /unityproject/ Активы /AssetBundles/iOS/lchairanimations
Это может быть как-то связано с установкой правильного пути, но, поскольку я скопировал папку assetbundle впоследствии в проект Xcode, проблема остается.
1 ответ
В этом примере ниже я покажу, как добавить новый актив под названием "собака" в наш AssetBundle с именем "животные" и построить его, а затем загрузить его во время выполнения.
Настройка папок сборки:
1 Выберите ресурс, такой как файл изображения. В данном случае это файл "dog.jpeg". См. Меню на вкладке "Инспектор". Иногда, опция AssetBundle скрыта, перетащите ее вверх, чтобы показать. Смотрите анимационный GIF ниже, чтобы узнать, как это сделать. По умолчанию AssetBundle - "Нет". Нажмите "Нет", затем перейдите к "Новый", создайте новый AssetBundle и назовите его "животные".
2 Создать папку с именем StreamingAssets
в папке "Активы". Это папка, в которую мы собираемся встроить AssetBundle. Орфография имеет значение, и она чувствительна к регистру, поэтому не забудьте назвать ее правильно.
3 Создать подпапку в StreamingAssets
папка для хранения AssetBundle. Для этого примера назовите эту папку AssetBundles
так что вы можете использовать его, чтобы узнать, что в нем.
Сборка AssetBundle:
4 Ниже приведен скрипт сборки.
А. Создать скрипт с именем ExportAssetBundles
и поместите его в папку с именем "Editor" в папке "Assets", затем скопируйте код ниже:
using System.IO;
using UnityEditor;
using UnityEngine;
public class ExportAssetBundles
{
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource()
{
string folderName = "AssetBundles";
string filePath = Path.Combine(Application.streamingAssetsPath, folderName);
//Build for Windows platform
BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
//Uncomment to build for other platforms
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.iOS);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.Android);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.WebGL);
//BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
//Refresh the Project folder
AssetDatabase.Refresh();
}
}
Б. Создайте свой AssetBudle, перейдя в меню Assets -> Build AssetBundle.
Вы должны увидеть встроенные AssetBundles внутри Assets/StreamingAssets/AssetBundles
каталог. Если нет, обновите вкладку Project.
Загрузка AssetBundle во время выполнения:
5 При загрузке, Application.streamingAssetsPath
следует использовать для доступа к StreamingAssets
папка. Для доступа ко всем папкам используйте, Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension;
, AssetBundle
а также AssetBundleRequest
API используются для загрузки AssetBundle. Так как это изображение, Texture2D
передается им. Если вы используете префаб, пройдите GameObject
вместо этого создайте его экземпляр. Смотрите комментарий в коде, где эти изменения должны быть сделаны. Рекомендуется использовать Path.Combine
объединить имена путей, так что код ниже должен использовать это вместо этого.
Ниже приведена простая функция загрузки:
IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
{
string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles");
filePath = System.IO.Path.Combine(filePath, assetBundleName);
//Load "animals" AssetBundle
var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath);
yield return assetBundleCreateRequest;
AssetBundle asseBundle = assetBundleCreateRequest.assetBundle;
//Load the "dog" Asset (Use Texture2D since it's a Texture. Use GameObject if prefab)
AssetBundleRequest asset = asseBundle.LoadAssetAsync<Texture2D>(objectNameToLoad);
yield return asset;
//Retrieve the object (Use Texture2D since it's a Texture. Use GameObject if prefab)
Texture2D loadedAsset = asset.asset as Texture2D;
//Do something with the loaded loadedAsset object (Load to RawImage for example)
image.texture = loadedAsset;
}
Вещи перед загрузкой заметки:
А. Имя Assetbundle является animals
,
Б. Название актива / объекта, который мы хотим загрузить из животных. dog
Это простой JPG собаки.
C. Загрузка проста, как это:
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";
public RawImage image;
void Start()
{
StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}
У меня также есть предложение, которое может быть более подходящим для таких разработчиков, как я, которые хотят чего-то более основанного на.Net. Вы можете подумать о создании "Launcher" с помощью Unity. Я бы построил его с помощью Unity, чтобы он оставался кроссплатформенным. Затем рассмотрите возможность объединения ваших обновлений в DLL, поскольку Unity поддерживает платформу.Net или сохраните их как изображение в веб-папке. Вы можете получить свои данные с помощью Webclient. Статья здесь:
https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient.downloadfile?view=netframework-4.8
Программа запуска может быть лучшим способом получить или обновить ваш контент. Я раздумывал над этой идеей с тех пор, как играл в "Властелин колец онлайн", и мне нравится их пусковая установка. Поэтому я хотел сделать его для своих игр. В вашем коде вы должны использовать "DownloadFile(Uri, String)" для получения данных. Я бы использовал API или что-то еще, чтобы сначала проверить вашу текущую версию игры или DLL и т. Д. Затем проверьте базу данных на предмет последней версии. Наконец, API или что-то в этом роде может составить список необходимых новых файлов или обновленных файлов и просто циклически запросить файлы и загрузить то, что вам нужно.