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();// 关闭数据流
}
}