从服务器加载文件到内存
AB资源打包后有一个目录文件AssetBundle,他保存了所有AB资源的路径与名称,
通过aLLAssetBundleURL链接路径 组拼 从目录文件获得的AB资源的名字,然后再协程方法内编写相关代码,从而实现从服务器加载资源的功能。详细见代码。
using SystemCollections;
using SystemCollectionsGeneric;
using UnityEngine;
using UnityEngineNetworking;
using SystemIO;
public class DownLoadAssetBundle : MonoBehaviour
{
//AB资源文件保存在服务器中的位置(我的服务器寄了,加载不到了)
private string mainAssetBundleURL = @"http://1202490173/Luademo/AssetBundles/AssetBundles";
private string aLLAssetBundleURL = @"http://1202490173/Luademo/AssetBundles/";
void Start()
{
StartCoroutine("DownLoadMainAssetBundle");
}
void Update()
{
if (InputGetKeyDown(KeyCodeSpace))
{
LoadAssetBundle();
}
}
/// <summary>
/// 下载主[目录]AssetBundle文件
/// </summary>
IEnumerator DownLoadMainAssetBundle()
{
//创建一个获取 AssetBundle 文件的 web 请求
UnityWebRequest request = UnityWebRequestAssetBundleGetAssetBundle(mainAssetBundleURL);
//发送这个 web 请求
yield return requestSendWebRequest();
//从 web 请求中获取内容,会返回一个 AssetBundle 类型的数据
AssetBundle ab = DownloadHandlerAssetBundleGetContent(request);
if (ab == null)
{
DebugLog("not ab");
}
//从这个“目录文件 AssetBundle”中获取 manifest 数据
AssetBundleManifest manifest = abLoadAsset<AssetBundleManifest>("AssetBundleManifest");
//获取这个 manifest 文件中所有的 AssetBundle 的名称信息
string[] names = manifestGetAllAssetBundles();
for (int i = 0; i < namesLength; i++)
{
//组拼出下载的路径链接
DebugLog(aLLAssetBundleURL + names[i]);
//下载单个AssetBundle文件加载到场景中
//StartCoroutine(DownLoadSingleAssetBundle(aLLAssetBundleURL + names[i]));
//下载AssetBundle并保存到本地
StartCoroutine(DownLoadAssetBundleAndSave(aLLAssetBundleURL + names[i]));
}
}
/// <summary>
/// 下载单个AssetBundle文件加载到场景中
/// </summary>
IEnumerator DownLoadSingleAssetBundle(string url)
{
UnityWebRequest request = UnityWebRequestAssetBundleGetAssetBundle(url);
yield return requestSendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundleGetContent(request);
//通过获取到的 AssetBundle 对象获取内部所有的资源的名称(路径),返回一个数组
string[] names = abGetAllAssetNames();
for (int i = 0; i < namesLength; i++)
{
//DebugLog(names[i]);
//截取路径地址中的文件名,且无后缀名 需要引入 SystemIO 命名空间
string tempName = PathGetFileNameWithoutExtension(names[i]);
DebugLog(tempName);
//实例化
GameObject obj = abLoadAsset<GameObject>(tempName);
GameObjectInstantiate<GameObject>(obj);
}
}
/// <summary>
/// 下载AssetBundle并保存到本地
/// </summary>
IEnumerator DownLoadAssetBundleAndSave(string url)
{
//UnityWebRequestAssetBundleGetAssetBundle(string uri)使用这个API下载回来的资源它是不支持原始数据访问的
UnityWebRequest request = UnityWebRequestGet(url);
yield return requestSendWebRequest();
//表示下载状态是否完毕
if (requestisDone)
{
//使用 IO 技术把这个 request 对象存储到本地(需要后缀)
//SaveAssetBundle(PathGetFileName(url), requestdownloadHandlerdata, requestdownloadHandlerdataLength);
SaveAssetBundle2(PathGetFileName(url), request);
}
}
/// <summary>
/// 方法1
/// 存储AssetBundle为本地文件
/// </summary>
private void SaveAssetBundle(string fileName, byte[] bytes, int count)
{
//创建一个文件信息对象
FileInfo fileInfo = new FileInfo(ApplicationstreamingAssetsPath + "//" + fileName);
//通过文件信息对象的“创建”方法,得到一个文件流对象
FileStream fs = fileInfoCreate();
//通过文件流对象,往这个文件内写入信息
//fsWrite(字节数组, 开始位置, 数据长度);
fsWrite(bytes, 0, count);
//文件写入存储到硬盘,关闭文件流对象,销毁文件对象
fsFlush();
fsClose();
fsDispose();
DebugLog(fileName + "下载完毕");
}
/// <summary>
/// 方法2
/// 存储AssetBundle为本地文件
/// </summary>
private void SaveAssetBundle2(string fileName, UnityWebRequest request)
{
//构造文件流
FileStream fs = FileCreate(ApplicationstreamingAssetsPath + "//" + fileName);
//将字节流写入文件里,requestdownloadHandlerdata可以获取到下载资源的字节流
fsWrite(requestdownloadHandlerdata, 0, requestdownloadHandlerdataLength);
//文件写入存储到硬盘,关闭文件流对象,销毁文件对象
fsFlush();
fsClose();
fsDispose();
DebugLog(fileName + "下载完毕");
}
/// <summary>
/// 从本地加载 AB 资源并实例化
/// </summary>
private void LoadAssetBundle()
{
//从本地加载 AB 资源到内存
AssetBundle assetBundle = AssetBundleLoadFromFile(ApplicationstreamingAssetsPath + "/player1ab");
//从 AB 资源中获取资源
GameObject player = assetBundleLoadAsset<GameObject>("Necromancer");
GameObjectInstantiate<GameObject>(player, Vector3zero, Quaternionidentity);
}
}
本网络故障可以通过修改hosts文件来修复,具体过程如下:
打开hosts文件,(路径C:\windows\]system32\drivers\etc),更改文件属性,一般都是“只读”,右单击把那个“只读”的勾去掉,然后以记事本的方式打开文件,删除全部内容,然后保存,最后把属性改回“只读”,一般问题就可以解决了。
还有一种方法是修改DNS服务器; 进入“网络与共享中心”,选择左侧的“更改适配器设置”,右单击已链接上的网络,点属性,选择“网络”选项卡,然后找到“Internet协议版本4”,如图
然后在打开的窗口中设置DNS服务器,按图中的设置即可!
0条评论