我无法在iOS版本中使用Unity Assetbundles。

在Unity中,我建立了 Assets 捆绑包:

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中运行它并收到此错误:



它可能以某种方式与设置正确的路径有关,但是当我之后将assetbundle文件夹复制到Xcode项目时,问题仍然存在。

最佳答案

在下面的示例中,我将演示如何将名为“dog” 的新 Assets 添加到名为“animals” 的AssetBundle中,并进行构建,然后在运行时加载它。

设置构建文件夹:

1 。选择 Assets ,例如图像文件。在这种情况下,这就是“dog.jpeg” 文件。请参见“检查器”选项卡中的菜单。有时,隐藏它的AssetBundle选项,将其向上拖动以显示它。有关如何操作,请参见下面的gif动画。默认的AssetBundle为“无”。单击“无” 选项,然后转到"new" 选项并创建新的AssetBundle并将其命名为“animals”

c# - 在Unity中构建和加载Assetbundles-LMLPHP

2 。在Assets文件夹中创建一个名为StreamingAssets的文件夹。这是我们要在其中建立AssetBundle的文件夹。拼写很重要,并且区分大小写,因此请确保正确命名。

c# - 在Unity中构建和加载Assetbundles-LMLPHP

3 。在StreamingAssets文件夹中创建子文件夹以保存AssetBundle。对于此示例,将此文件夹命名为AssetBundles,以便您可以使用它来识别其中的内容。

c# - 在Unity中构建和加载Assetbundles-LMLPHP

建筑 Assets 捆绑包:

4 。下面是构建脚本。

一个。创建一个名为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();
    }
}

c# - 在Unity中构建和加载Assetbundles-LMLPHP

B 。通过转到Assets-> Build AssetBundle菜单来构建您的AssetBudle。

您应该在Assets/StreamingAssets/AssetBundles目录中看到已构建的AssetBundles。如果不是,请刷新“项目”选项卡。

c# - 在Unity中构建和加载Assetbundles-LMLPHP

在运行时加载AssetBundle :

5 。加载它时,应使用Application.streamingAssetsPath访问StreamingAssets文件夹。要访问所有文件夹,请使用Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension;AssetBundleAssetBundleRequest 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

B 。我们要从动物Assetbundle中加载的 Assets /对象的名称为dog。这是狗的简单jpg。

c# - 在Unity中构建和加载Assetbundles-LMLPHP

C 。加载很简单,如下所示:
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";

public RawImage image;

void Start()
{
    StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}

关于c# - 在Unity中构建和加载Assetbundles,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47030894/

10-11 01:09