从服务器加载文件到内存
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);
}
}
项目合作关系。万代就是甲方(出资、推广、运营),fs就相当于EPC总承包方(游戏开发设计、制作)fs是开发,万代南梦宫是发行,所以是合作关系。万代南梦宫游戏,是位于日本的街机、手机与家用电子游戏发行商。
1、结构不同:
SAN结构中,文件管理系统(FS)还是分别在每一个应用服务器上;而NAS则是每个应用服务器通过网络共享协议(如:NFS、CIFS)使用同一个文件管理系统。换句话说:NAS和SAN存储系统的区别是NAS有自己的文件系统管理。
2、目标不同:
NAS是将目光集中在应用、用户和文件以及它们共享的数据上。SAN是将目光集中在磁盘、磁带以及联接它们的可靠的基础结构。将来从桌面系统到数据集中管理到存储设备的全面解决方案将是NAS加SAN。
扩展资料:
SAN的优点:
SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSI和IP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。
SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。
NAS优点:
NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内。
NAS设备的物理位置同样是灵活的。它们可放置在工作组内,靠近数据中心的应用服务器,或者也可放在其他地点,通过物理链路与网络连接起来。无需应用服务器的干预,NAS设备允许用户在网络上存取数据,这样既可减小CPU的开销,也能显著改善网络的性能。
--存储区域网络
--NAS (网络附属存储)
0条评论