我无法让Unity Assetbundles在iOS版本中运行。
在Unity中我构建了assetsbundles:
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 /式IO / lchairanimations
它可能与设置正确的路径有关,但由于我之后将assetbundle文件夹复制到Xcode项目,问题仍然存在。
答案 0 :(得分:11)
在下面的示例中,我将演示如何将名为“dog”的新资产添加到名为“animals”的AssetBundle中,并构建它然后在运行期间加载它时间。
设置构建文件夹:
<强> 1 即可。选择图像文件等资产。在这种情况下,这是“dog.jpeg”文件。请参阅“检查器”选项卡中的菜单。有时,它被隐藏的AssetBundle选项,将其拖动以显示它。请参阅下面的动画gif,了解如何执行此操作。 默认的AssetBundle是“无”。点击“无”选项,然后转到“新建”选项并创建新的AssetBundle并将其命名为“animals”
<强> 2 即可。在Assets文件夹中创建名为StreamingAssets
的文件夹。这是我们要将AssetBundle构建到的文件夹。拼写计数并且区分大小写,因此请确保正确命名。
第3 即可。在StreamingAssets
文件夹中创建子文件夹以保存AssetBundle。对于此示例,请将此文件夹命名为AssetBundles
,以便您可以使用它来识别其中的内容。
构建AssetBundle:
<强> 4 即可。下面是构建脚本。
<强> A 即可。创建一个名为ExportAssetBundles
的脚本并将其放在Assets文件夹中名为“Editor”的文件夹中,然后将其中的代码复制到其中:
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();
}
}
<强>乙即可。转到资产 - &gt;构建您的AssetBudle 构建AssetBundle 菜单。
您应该在Assets/StreamingAssets/AssetBundles
目录中看到构建的AssetBundle。如果没有,请刷新“项目”选项卡。
在运行时加载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;
}
加载注释之前的事情:
<强> A 即可。 Assetbundle的名称是animals
。
<强>乙即可。我们想要从动物Assetbundle加载的资产/对象的名称是dog
这是一只狗的简单jpg。
<强> C 即可。加载很简单:
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";
public RawImage image;
void Start()
{
StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}
答案 1 :(得分:0)
我也有一个建议,对于像我这样想要更多基于.Net的开发人员而言,它可能会更合适。您可能会考虑使用Unity构建“启动器”。我会使用Unity构建它,因此它仍然可以跨平台使用。接下来,由于Unity支持.Net框架,请考虑将更新捆绑在DLL中,或者将它们作为映像存储在Web文件夹中。您可以使用Webclient来获取数据。此处的文章:
启动器可能是获取或更新内容的更好方法。自从我玩《指环王》在线游戏以来,我就一直在想这个主意,我喜欢他们的《发射器》。所以我想为自己的游戏做一个。在您的代码中,您将使用“ DownloadFile(Uri,String)”来获取数据。我会使用API或其他方法来首先检查您的游戏或DLL等的当前版本。然后检查数据库的最新版本。最终,API或某些东西可以构建所需的新文件或所需的更新文件的列表,然后遍历请求文件并下载所需的内容。