Как загрузить assetBundle из локальной папки Android? - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь загрузить AssetBunddle из папки Android из Unity.но это не работает ...

Я думал, что URL неправильный.

Много раз менялся URL, рекомендуется или спецификация документа Unity, но каждый случай не удался

ВотМой код.

    public string BundleURL;
    public int version;

    void Start()
    {
        CleanCache();
        BundleURL = "file://"+Application.persistentDataPath + " /BundleTest";

        StartCoroutine(LoadAssetBundle(BundleURL));
        version = 0;
    }

Я думал, что BundleURL неправильный или имеет проблему

    IEnumerator LoadAssetBundle(string BundleURL)
    {
        //BundleURL = "file://" + path ;
        GameObject obj;
        //ARLog.d ("LoadAssetBundle" + BundleURL);
        while (!Caching.ready)
            yield return null;
        using (WWW www = WWW.LoadFromCacheOrDownload(BundleURL, version))
        {
            yield return www;

            AssetBundle bundle = www.assetBundle;

            String[] mPath = bundle.GetAllAssetNames();
            String bundleName = null;

            if (bundleName != null)
            {
                AssetBundleRequest request = bundle.LoadAssetAsync(bundleName, typeof(GameObject));
                yield return request;

                obj = Instantiate(request.asset) as GameObject;

                bundle.Unload(false);
                www.Dispose();
            }
        } 
    }
}

Я хочу модель экземпляра в моей сцене (из папки BundelTest в Androind)

1 Ответ

1 голос
/ 01 апреля 2019

У вас есть дополнительное место в

BundleURL = "file://"+Application.persistentDataPath + " /BundleTest";

в " /BundleTest"!

Для путей в общем случае вы всегда должны использовать Path.Combine вместоконкатенация строк вручную:

    BundleURL = Path.Combine(Application.persistentDataPath,"BundleTest");

. Это гарантирует, что в результирующем пути автоматически используется правильный разделитель пути (/ или \) для соответствующей системы atrget.

Чемобратите внимание, что WWW устарел и не так быстро → вы должны взглянуть на AssetBundle.LoadFromFileAsync, есть пример того, как его использовать

    public void IEnumerator LoadBundle()
    {
        var bundleLoadRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, "BundleTest"));
        yield return bundleLoadRequest;

        var myLoadedAssetBundle = bundleLoadRequest.assetBundle;
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }

        var assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync<GameObject>("MyObject");
        yield return assetLoadRequest;

        GameObject prefab = assetLoadRequest.asset as GameObject;
        Instantiate(prefab);

        myLoadedAssetBundle.Unload(false);
    }

Если выпредпочитаю вместо проверки синхронную загрузку AssetBundle.LoadFromFile.


Еще одно замечание: если вы используете

using (WWW www = WWW.LoadFromCacheOrDownload(BundleURL, version))
{
    ....
}

, у вас нетиспользовать Dispose в том виде, в каком он расположен в блоке using автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...