WWW.LoadFromCacheOrDownload 在 android phone 上的增强现实应用程序中无法使用 unity

WWW.LoadFromCacheOrDownload is not working in augmented reality app on android phone using unity

我正在尝试构建一个增强现实应用程序,并且在该应用程序中我想要动态加载一些预制件。因此,我在 unity store 上使用一些 3d 模型预制件创建了 myasset.unity3d 。我正在使用 WWW.LoadFromCacheOrDownload 下载那个 unity3d 文件并使用它。

当我在我的笔记本电脑上调试时,文件正在下载,我正在按我想要的方式使用它,但是当我添加构建并在 android phone 上尝试时,下载没有发生。

我用来下载的代码是

IEnumerator DownloadAndCache() {
         while (!Caching.ready)
             yield return null;

         string bundleURL = "http://s3-ap-southeast-1.amazonaws.com/cf-export/sofa.unity3d";

         www = WWW.LoadFromCacheOrDownload (bundleURL, 1);
         yield return www;

         Debug.Log (www.assetBundle);

         AssetBundle bundle = www.assetBundle;
 }

所以请帮助我。

我也试过其他方法,但还是没成功

IEnumerator Start () {
    WWW www = WWW.LoadFromCacheOrDownload (BundleURL, 1);
    yield return www;
    AssetBundle bundle = www.assetBundle;
    AssetBundleRequest request = bundle.LoadAssetAsync (AssetName, typeof(GameObject));
    yield return request;
    GameObject obj = request.asset as GameObject;
    Instantiate (obj);
    bundle.Unload(false);
    www.Dispose();
}

以上两种方法在 unity IDE 中测试时有效,但如果我使用 android 构建并将其安装在 android 设备中,则无法正常工作。我在构建时授予应用程序互联网访问权限

我在手机中使用文本打印了错误,请查看下面的屏幕截图

第一个错误文本是 www(用于下载的变量),第二个是 www.error(实际错误)。我不明白那个错误是什么意思。所以请帮助我

尝试检查您的 androidManifest.xml 以获取连接到外部服务器的权限。 然后,如果一切正常但仍然无法正常工作,我的建议是为 Unity 编辑器下载 Device Console 插件,这是访问内部 Android 调试器的一种非常好的方式。

https://www.assetstore.unity3d.com/en/#!/content/44935

或者如果你真的很勇敢:在终端中使用 logcat...

问题是资产包版本与应用程序版本不同步。因此,在制作资产包时,我添加了一些小代码,使我的代码可以正常工作。要制作资产包,我的代码是

using UnityEditor;

public class CreateAssetBundles
{
    [MenuItem ("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles ()
    {
        BuildPipeline.BuildAssetBundles ("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.Android);
    }
}

为移动平台使用 AssetBuundle:

  1. 在创建 AssetBundle 时,它​​必须是平台特定的。对于 Android 使用以下脚本创建 AssetBundle。把它放在 "Editor"

    里面
     using UnityEngine;
        using System.Collections;
        using UnityEditor;
        public class ExportAssetBundles : Editor {
            [MenuItem("Assets/Build AssetBundle")]
            static void ExportResource()
            {
                string path = "Assets/AssetBundle/myAssetBundle.unity3d";
                Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
                BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
                                               BuildAssetBundleOptions.CollectDependencies
                                             | BuildAssetBundleOptions.CompleteAssets,BuildTarget.Android);
            }
        }
    
    1. 然后在 Asset

      中创建文件夹 "AssetBundle"

      当您创建 Assetbundle 时,AssetBundle.unity3d 文件将存储在此文件夹中


    现在您需要在运行时使用 Created Assetbundle。为此,

    1. 编写脚本 AssetBundleAugmenter

      public class AssetBundleAugmenter : MonoBehaviour {
      
      public string AssetName;
      public int Version;
      private GameObject mBundleInstance = null;
      private bool mAttached = false;
      void Start() {
          StartCoroutine(DownloadAndCache());
      
      }
      // Update is called once per frame
      IEnumerator DownloadAndCache() {
          while(!Caching.ready)
              yield return null;
          //you can use remote URL like: www.arprabhu.com/assetBundle OR Local URL
          // example URL of file on PC filesystem (Windows)
          // string bundleURL = "file:///D:/Unity/AssetBundles/MyAssetBundle.unity3d";
          // example URL of file on Android device SD-card
      
          string bundleURL = System.IO.File.ReadAllText("/mnt/sdcard/filepath.txt");
          Debug.Log ("Asset Loaded");
          using (WWW www = WWW .LoadFromCacheOrDownload(bundleURL, Version)) {
              yield return www;
              if (www .error != null)
                  throw new UnityException("WWW Download had an error: " + www .error);
              AssetBundle bundle = www .assetBundle;
      
              if (AssetName == "")
                  Instantiate(bundle.mainAsset);
              else
                  Instantiate(bundle.LoadAsset(AssetName));
              // Unload the AssetBundles compressed contents to conserve memory
              bundle.Unload(false);
      
          }
      }}
      
  2. 将此脚本附加到场景中的空游戏对象


恭喜!您可以开始了。