У меня есть простое приложение, в котором используются 3D-модели, и я хочу загрузить их из AssetBundle
.Я создал несколько AssetBundles
для каждой категории моделей (например, автомобили, лодки, деревья ...)
Я уже сделал это, но когда я начинаю свою игру, и все модели загружаются из AssetBundle
количество FPS падает.Игра зависает до тех пор, пока не загружены все модели.
Я пытался скрыть это с открывающим видео, но даже видео застряло.
Очевидно, я не могу использовать систему Threads, потому что Unity APIне является потокобезопасным.
Мой вопрос: Есть ли лучший (более эффективный) способ загрузки активов?
Мой код:
Создание AssetBundle
:
[MenuItem("Assets/Create assetbundle")]
static void CreateAssetBundle()
{
// this list of categories is read from a file, and I loop through it.
// this is a bit older version, but the loop is the only difference...
AssetBundleBuild carBuild = new AssetBundleBuild();
AssetBundleBuild boatBuild = new AssetBundleBuild();
string[] paths = AssetDatabase.GetAllAssetPaths();
List<string> carAssets = new List<string>();
List<string> boatAssets = new List<string>();
foreach (var item in paths)
{
if (item.EndsWith(".ma") && item.StartsWith("Car")) // find all car models
{
carAssets.Add(item);
}
else if(item.EndsWith(".ma") && item.StartsWith("Boat")) // find all boat models
{
boatAssets.Add(item);
}
}
carBuild.assetBundleName = "cars";
carBuild.assetNames = carAssets.ToArray();
boatBuild.assetBundleName = "boats";
boatBuild.assetNames = boatAssets.ToArray();
BuildPipeline.BuildAssetBundles("Assets/Test", new AssetBundleBuild[] { carBuild, boatBuild}, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
Загрузка моделей:
private IEnumerator LoadAssetsBundle()
{
yield return null;
List<string> categories = ReadFromAFile(); // the list is being loaded from a file
yield return null;
foreach(var category in categories)
{
using(WWW loader = WWW.LoadFromCacheOrDownload(@"file://D:\Test\"+category, 1))
{
yield return loader;
AssetBundle bundle = loader.assetBundle;
var temp = bundle.LoadAllAssetsAsync();
yield return temp;
foreach (var item in temp.allAssets)
{
Instantiate(item);
yield return null;
}
bundle.Unload(false);
yield return null;
}
}
}
РЕДАКТИРОВАТЬ Здесь нет ни результатов, ни ответов на единство,Я думаю, что это лучший способ ...
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ Я нашел решение, и оно отлично работало