使用旧数据重建 Unity Asset Bundles
Unity Asset Bundles Rebuilding with Old Data
我有一个移动项目,它通过移动应用程序向用户展示各种增强现实体验。此应用程序是在 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% 确保我正在构建的捆绑包将根据标记有它的预制件是最新的?
加载的 Assetbundle 确实被缓存了,并且会保持缓存状态,直到调用 AssetBundle.Unload()
以释放与该资产相关的所有内存。
在资产 unloaded 之后,可以下载更新版本的资产包并使用新值实例化(假设下载的文件具有所有更新信息),否则它将从缓存中加载数据如果有的话。
附带说明:您似乎仍在使用旧的 assetbundle 管道。 Unity 有一个插件工具,它使 assetbundle 工作流程变得相当容易,称为 assetbundle browser found here。它带有一种更容易 UI 的方式来构建捆绑包和检查捆绑包、开源和非常可定制的管道。可能值得一试。
如 remy_rm 所述,请尝试使用 Unity Asset Bundle Browser 工具。它可以更好地控制捆绑包中的资产。
如果您确保两点,您的问题就可以解决:
1-当您对预制件进行更改并创建新的捆绑包时,它确实是使用上述更改创建的吗? (再次使用该工具会使检查更容易)
2- 您在主应用程序中下载的包是新包,而不是旧的缓存包。例如在 Unity Webgl 中,您需要清除浏览器缓存以 100% 确保应用程序下载新资产包并且不使用浏览器缓存中的旧资产包。
我有一个移动项目,它通过移动应用程序向用户展示各种增强现实体验。此应用程序是在 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% 确保我正在构建的捆绑包将根据标记有它的预制件是最新的?
加载的 Assetbundle 确实被缓存了,并且会保持缓存状态,直到调用 AssetBundle.Unload()
以释放与该资产相关的所有内存。
在资产 unloaded 之后,可以下载更新版本的资产包并使用新值实例化(假设下载的文件具有所有更新信息),否则它将从缓存中加载数据如果有的话。
附带说明:您似乎仍在使用旧的 assetbundle 管道。 Unity 有一个插件工具,它使 assetbundle 工作流程变得相当容易,称为 assetbundle browser found here。它带有一种更容易 UI 的方式来构建捆绑包和检查捆绑包、开源和非常可定制的管道。可能值得一试。
如 remy_rm 所述,请尝试使用 Unity Asset Bundle Browser 工具。它可以更好地控制捆绑包中的资产。
如果您确保两点,您的问题就可以解决:
1-当您对预制件进行更改并创建新的捆绑包时,它确实是使用上述更改创建的吗? (再次使用该工具会使检查更容易)
2- 您在主应用程序中下载的包是新包,而不是旧的缓存包。例如在 Unity Webgl 中,您需要清除浏览器缓存以 100% 确保应用程序下载新资产包并且不使用浏览器缓存中的旧资产包。