我有一个移动项目,可通过移动应用程序向用户显示各种AR体验。该应用程序是在Unity中制作的。
在这个Unity项目旁边,我们还有另一个项目专门存储资产捆绑包。每个AR体验都是一个标有唯一资产捆绑名称的预制件。这些捆绑软件在线存储,并在相关时下载到主移动应用程序中。我们在正确更新这些捆绑包时遇到问题,当在预制件上更改诸如缩放或旋转之类的内容时,它们不会反映在重建的资产捆绑包中。
下面是我们用于重建资产的过程,它只是一个简单的脚本。
[MenuItem("Spiff/Build AssetBundles")]
static void BuildAllAssetBundles()
{
// BuildPlatformBundles(BuildTarget.iOS);
BuildPlatformBundles(BuildTarget.Android);
}
static void BuildPlatformBundles(BuildTarget platform)
{
// We convert the passed platform enum to a string.
string platformFolder = platform.ToString();
string assetBundleDirectory = "Assets/AssetBundles/" + platformFolder;
// Build our bundles out to the relevent platform specific folder.
if (!AssetDatabase.IsValidFolder(assetBundleDirectory))
{
AssetDatabase.CreateFolder("Assets/AssetBundles/", platformFolder);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, platform);
}
当前,我们使用“ BuildAssetBundleOptions.None”。我们还尝试了ForceRebuild标志,但这无效。我是否可以假设Unity具有为资产捆绑包保留的某种内部缓存?如果是这样,我们能否以某种方式清除此问题,以便我可以确保100%保证我正在构建的捆绑包基于标有该标签的预制件是最新的?
答案 0 :(得分:1)
已加载的资产捆绑包确实已缓存,并且将一直保持缓存状态,直到调用AssetBundle.Unload()
释放与资产相关的所有内存为止。
在资产unloaded之后,可以下载新版本的资产捆绑包并用新值实例化(假设下载的文件具有所有更新的信息),否则它将从缓存中加载数据(如果有)
在旁注:您似乎仍在使用旧的Assetbundle管道。 Unity有一个称为here的Assetbundle浏览器,可以使Assetbundle工作流程变得相当容易,它具有一个插件工具。它带有一种简便的UI,用于构建捆绑包和检查捆绑包,开源和非常可定制的管道。可能值得一试。
答案 1 :(得分:0)
就像提到的remy_rm一样,请尝试使用Unity Asset Bundle Browser工具。它提供了对捆绑中资产的更多控制。
如果您确保两件事,就可以解决您的问题:
1-当您对预制件进行更改并创建新的捆绑包时,是否确实通过上述更改创建了捆绑包? (再次使用该工具将使检查更加容易)
2-在主应用程序中下载的捆绑软件是新捆绑软件,而不是旧的缓存捆绑软件。例如,在Unity Webgl中,您需要清除浏览器缓存,以100%确保应用程序下载了新的资产捆绑包,并且未在浏览器缓存中使用旧的资产捆绑包。