将assetbundle资源包存放到服务器上。
IEnumerator SaveAssetBundle(string path, string filename, Action DownLoad = null)
{
//服务器上的文件路径
string originPath = path + filename;
Debug.Log("originPath:"+originPath);
using (webRequest = UnityWebRequest.Get(originPath))
{
yield return webRequest.SendWebRequest();
Debug.Log(webRequest);
if (webRequest.isNetworkError)
{
Debug.Log("Download Error:" + webRequest.error);
}
else{
//下载完成后执行的回调
if (webRequest.isDone)
{
byte[] results = webRequest.downloadHandler.data;
string savePath = Application.persistentDataPath + "/screen";
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
Debug.Log("savepath:" + savePath + "/" + filename);
FileInfo fileInfo = new FileInfo(savePath + "/" + filename);
FileStream fs = fileInfo.Create();
//fs.Write(字节数组, 开始位置, 数据长度);
fs.Write(results, 0, results.Length);
fs.Flush(); //文件写入存储到硬盘
fs.Close(); //关闭文件流对象
fs.Dispose(); //销毁文件对象
if (DownLoad != null)
{
DownLoad();
}
}
}
}
}
使用 UnityWebRequest.Get(url),将资源下载到本地路径下。
我是要发布带ios平台上的,所以要将模型下载到可以进行读写的文件加下,
ios下经常使用的路径为:
Application.dataPath /var/containers/Bundle/Application/app sandbox/xxx.app/Data
Application.streamingAssetsPath /var/containers/Bundle/Application/app sandbox/test.app/Data/Raw
Application.temporaryCachePath /var/mobile/Containers/Data/Application/app sandbox/Library/Caches
Application.persistentDataPath /var/mobile/Containers/Data/Application/app sandbox/Documents
dataPath是app程序包安装路径,app本身就在这里,此目录是只读的。streamingAssetsPath是dataPath下的Raw目录。
app的独立数据存储目录下有三个文件夹:Documents,Library和tmp。
Documents目录,这个目录用于存储需要长期保存的数据,比如我们的热更新内容就写在这里。需要注意的是,iCloud会自动备份此目录,如果此目录下写入的内容较多,审核的可能会被苹果拒掉。
Library目录,这个目录下有两个子目录,Caches和Preferences。
Caches是一个相对临时的目录,适合存放下载缓存的临时文件,空间不足时可能会被系统清除,Application.temporaryCachePath返回的就是此路径。我把热更新的临时文件写在这里,等一个版本的所有内容更新完全后,再把内容转移到Documents目录。
Preferences用于应用存储偏好设置,用NSUserDefaults读取或设置。
tmp目录,临时目录,存放应用运行时临时使用的数据。
需要注意的是,以上无论临时、缓存或者普通目录,如果不需要的数据,都请删除。不要占用用户的存储空间,像微信就是坏榜样。
经过分析:我们要将资源下载到Application.persistentDataPath 下
public void DownLoad() {
AssetBundle chashi = AssetBundle.LoadFromFile(Application.persistentDataPath + "/screen/chashi.molion");
GameObject chashipre = chashi.LoadAsset<GameObject>("Cube");
GameObject.Instantiate(chashipre, Vector3.zero, Quaternion.identity);
}
加载资源到场景中。
StartCoroutine(SaveAssetBundle("服务器地址", "chashi.molion", DownLoad));
接下来就是将工程发布到ios设备上。
运行程序可能会出现程序闪退的问题,可能是unity开启Strip Engine Code选项后带来的崩溃问题,所以需要打包的时候将player Settings->other Settings下的Strip Engine Code*勾去掉,重新打包发布
加载成功