• WWW
    • 描述
    • WWW.LoadFromCacheOrDownload 从缓存或下载加载(异步方法)

    WWW

    描述

    简单的访问网页的类。

    这是一个检索URL内容的小工具模块。

    你通过连接WWW(url)在后台开始下载,并且返回一个新的WWW对象。

    你可以检查isDone属性来查看是否已经下载完成,或者yield自动等待下载物体,直到它被下载完成(不会影响游戏的其余部分)。

    如果你想从web服务器上获取一些数据,例如高分列表或者调用主页,可以使用这个,也有一些功能可以使用从web上下载的图片来创建一个纹理,或者下载或加载新的web播放器数据文件。

    WWW类可以用来发送GET和POST请求到服务器,WWW类默认使用GET方法,并且如果提供一个postData参数可用POST方法。

    参见: WWWForm为postData参数构建可用的表单数据。

    注意,URL传递到WWW类,必须是%编码。

    注意:iPhone支持http://, https:// 和 file://协议;ftp://协议的支持仅限于匿名下载。其他协议不被支持。

    注意,当在windows和Windows Store Apps使用文件协议来访问本地文件,需要使用file:///(带有三个斜线)。

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";
    5. IEnumerator Start() {
    6. WWW www = new WWW(url);
    7. yield return www;
    8. renderer.material.mainTexture = www.texture;
    9. }
    10. }
    变量说明
    assetBundleAssetBundle的数据流,可以包含项目文件夹中的任何类型资源。
    audioClip从下载的数据,返回一个AudioClip。(只读)
    bytes以字节组的形式返回获取到的网络页面中的内容(只读)。
    bytesDownloaded通过该WWW查询已下载的字节数(只读)。
    error返回一个错误消息,在下载期间如果产生了一个错误的话。(只读)
    isDone判断下载是否已经完成(只读)?
    movie从下载的数据,返回一个MovieTexture(只读)。
    progress下载进度有多少(只读)?
    text通过网页获取并以字符串的形式返回内容(只读)。
    texture从下载的数据返回一个Texture2D(只读)。
    textureNonReadable从下载的数据返回一个非可读的Texture2D(只读)。
    threadPriorityAssetBundle解压缩线程的优先级。
    uploadProgress上传进度有多少(只读)。
    url此WWW请求的URL(只读)。
    函数说明
    GetAudioClip从下载数据,返回一个AudioClip(只读)。
    LoadImageIntoTexture利用一个从下载数据中的图像来替换现有Texture2D。
    LoadUnityWeb加载新的web播放器数据文件。
    静态函数说明
    EscapeURL转义字符串中的字符。
    LoadFromCacheOrDownload从缓存加载带有指定版本号的AssetBundle。如果AssetBundle不在当前缓存,它将自动下载并储存在缓存,以便以后从本地存储检索。移动平台缓存大小是4G,Web平台的缓存是需要购买的。
    UnEscapeURL将URL的转义字符恢复正常的文本。

    WWW.LoadFromCacheOrDownload 从缓存或下载加载(异步方法)

    建议使用AssetBundle.CreatFromFile 它是一个同步方法。现在IOS 和 android 都支持了,强烈建议用。打包的时候需要选择不压缩。

    1. //打包场景
      BuildPipeline.BuildStreamedSceneAssetBundle(levels, path, target, BuildOptions.UncompressedAssetBundle))
      //打包资源
      BuildPipeline.BuildAssetBundle(null, assets, path, BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.CollectD


    因为不压缩, 所以就需要我们自己来压缩资源了, 可以用LZMA 和 GZIP来进行压缩。1.打包出来的Assetbundle我们自己用LZMA压缩,上传到服务器上。2.IOS或者Android下载这些assetbundle3.解压缩这些assetbundle并且保存在Application.persistentDataPath 目录下。4.以后通过AssetBundle.CreatFromFile 读取assetbundle。
    1. static WWW LoadFromCacheOrDownload(string url, int version, uint crc = 0);
    2. |参数|说明|
    3. |:--|:--|
    4. |url|如果资源包在缓存不存在,那么从URL来下载AssetBundle。必须是'%'转义的|
    5. |version|AssetBundle的版本。如果已下载的带有相同参数的版本,该文件仅从硬盘加载。通过你的应用程序递增版本号,能强制缓存从URL下载一个新的AssetBunlde拷贝。|
    6. |crc|可选,未压缩内容的CRC-32校验。如果为非零,则内容会在加载之前比较校验值,如果不匹配给出错误。你可以用这个来避免从下载或用户在硬盘的缓存文件篡改导致数据损坏。如果CRC不匹配,Unity将尝试重新下载数据,如果CRC在服务器不匹配将会报错。查看返回的错误字符串,查看正确的CRC值用于AssetBundle。|
    7. **Returns 返回**
    8. WWWWWW的实例,一旦加载或下载操作完成,可以用来访问数据。
    9. **Description 描述**
    10. 从缓存加载带有指定版本号的AssetBundle。如果AssetBundle不在当前缓存,它将自动下载并储存在缓存,以便以后从本地存储检索。
    11. LoadFromCacheOrDownload()必须用来替代“new WWW (url),为了利用缓存功能。
    12. 缓存的AssetBundle通过文件名和版本号唯一标识。URL上的全部域名和路径信息被缓存忽略。由于缓存的资源包由文件名识别而不是完整的URL,在资源包下载之后,你可以在任何时候更改目录。这通常用于游戏推出新版本,确保文件是没有被浏览器或CDN错误的缓存。对于WebPlayer应用程序是使用共享缓存,缓存增加了独特的识别相同的命名资源的信息以防止应用程序之间的命名冲突。
    13. 如果缓存文件夹没有剩余空间来缓存增加的文件,LoadFromCacheOrDownload 将从缓存中迭代删除最近最少使用资源包,直到有足够的空间可用来存储新的资源包。如果剩余空间是不可能的(因为硬盘满了,或当前缓存文件都在使用),LoadFromCacheOrDownload()将绕过缓存并下载文件流到内存就像”new WWW()“ 调用。
    14. 这个函数仅用于访问AssetBundles。不会有其他类型或内容被缓存。
    15. 注意,URL必须是'%'转义的。
    16. ```csharp
    17. using UnityEngine;
    18. using System.Collections;
    19. public class ExampleClass : MonoBehaviour{
    20. IEnumerator Start()
    21. {
    22. var www = WWW.LoadFromCacheOrDownload("http://myserver.com/myassetBundle.unity3d", 5);
    23. yield return www;
    24. if (!string.IsNullOrEmpty(www.error))
    25. {
    26. Debug.Log(www.error);
    27. yield break;
    28. }
    29. var myLoadedAssetBundle = www.assetBundle;
    30. var asset = myLoadedAssetBundle.mainAsset;
    31. }
    32. }

    WWW bundle = new WWW(path);

    这样的做法是通过一个路径进行下载(无论是服务器路径还是本地路径下载操作都一样)但是bundle只能保存在内存中,也就是退出游戏在进入还得重新下,很显然在游戏中我们不能使用这种方式。

    1. private IEnumerator LoadMainCacheGameObject(string path)
    2. {
    3. WWW bundle = WWW.LoadFromCacheOrDownload(path,5);
    4. yield return bundle;
    5. //加载到游戏中
    6. yield return Instantiate(bundle.assetBundle.mainAsset);
    7. bundle.assetBundle.Unload(false);
    8. }

    使用的方法是WWW.LoadFromCacheOrDownload(path,5);

    参数1:服务器或者本地下载地址

    参数2:版本号

      Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2 那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。

      在移动平台下Assetbundle里面放的脚本是不会被执行的,还记得我们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。

    ?