unity几个路径以及热更新原理

来源:互联网 发布:淘宝部分退款如何受理 编辑:程序博客网 时间:2024/06/03 16:19

1.Resources 路径 只读 不能动态的修改

存放内容 预制体(prefabs) - 不容易变化的预制体

prefabs打包的时候 会自动过滤不需要的资源 有利于减小资源大小

主线程加载

Resources类的Load方法

文件夹中的内容打包的时候会被压缩和加密


2.streamingAssetsPath 内容会原封不动的打入包中

一般建议存放一些二进制文件 (配置文件,unity资源包(AB文件)等)

特点

只读 不可写

主要存放二进制文件

通过WWW类 读取文件(移动端)


3.persistentDataPath 特殊路径 唯一可读写的路径

这个路径在IOS平台是 应用程序的沙盒

但是在安卓Android平台上 它可以是程序的沙盒 也可以是SDcard

并且在打包输出的时候可以设置为沙盒或者SDcard

projectsettings - otherSettings - writePermission

可读写 不同平台路径不同 这个路径下的文件夹 首次运行程序时自动创建

热更新解决方案 将易变资源 还有逻辑 (1.0版本)放在streamingAssetsPath(资源包AB文件 配置表 Lua文本文件)

从网络端下载版本文件 读取出数据 对比当前服务器版本和本地版本版号 例如1.1版本 从服务器下载最新版本

更新的内容 大小等相关数据 MD5验证


包含游戏数据文件夹的路径 只读 - D:/Unity/SaveData/Assets

Debug.Log(Application.dataPath);

包含一个到StreamingAssets文件夹的路径 只读 - D:/Unity/SaveData/Assets/StreamingAssets

Debug.Log(Application.streamingAssetsPath);

包含一个持久数据目录的路径(只读) unity唯一的可读写路径 C:/Users/Administrator/AppData/LocalLow/DefaultCompany/Space Shooter

Debug.Log(Application.persistentDataPath);


Application.streamingAssetsPath 两种加载方式

引入命名空间 system.io;

void ReadData() {

string fileAddress = Path.Combine(Application.streamingAssetsPath, "Test.txt");

FileInfo m_info = new FileInfo(fileAddress);

string str = "";

if (m_info.Exists) {

StreamReader strR = new StreamReader(fileAddress);

str = strR.ReadToEnd();

Debug.Log("str = " + str);

}

}


// 通过WWW加载

string _dataStr;

IEnumerator LoadWWW() {

string path = Application.streamingAssetsPath + "/Test.txt";

if ( !path.Contains("file://") ) {

path = "file://" + path;// 必须要加 确保必须要加

}

WWW www = new WWW(path);

yield return www;

// 加载完成

_dataStr = www.text;

Debug.Log("_dataStr = " + _dataStr);

}


热更新原理

string test = "Test.txt";// 带文件后缀

string test_1 = "Test_1.txt";


private void Start()

{

string[] paths = new string[] {

test,

test_1

// 添加其他需要拷贝的数据

};

LoadByPath(paths);

}


// 根据多个文件路径加载并拷贝数据

private void LoadByPath(string[] paths)

{

StartCoroutine(CopyFile(paths));

}

协程

public IEnumerator CopyFile(string[] paths)

{

for (int i = 0; i < paths.Length; ++i) {

string fileName = paths[i];

string streamPath = Path.Combine(Application.streamingAssetsPath, fileName);

if (!streamPath.Contains("file://")) {

streamPath = "file://" + streamPath;

}

WWW www = new WWW(streamPath);

yield return www; //等待www对象加载完成

// 将读取的数据写入沙盒文件夹 以备后续逻辑调用

string writePath = Path.Combine(Application.persistentDataPath, fileName);

WriteByPath(www.bytes,writePath);

}

}


写数据的方法 (将数据写入沙盒路径)

private void WriteByPath(byte[] bytes, string writePath)

{

// 判断文件(这里是Test.txt是否存在) 防止老版本覆盖新版本

if (!File.Exists(writePath)) {

// 写数据

FileStream stream = new FileStream(writePath,FileMode.Create);

stream.Write(bytes, 0, bytes.Length);

stream.Flush();// 释放所有相关资源

stream.Close();// 关闭数据流

}

}

原创粉丝点击