Application这个类如果用得好,可以产生很多意想不到的程序效果!
先说说Application里面包含的四大路径
Application.dataPath
Debug.Log(Application.dataPath);//只读路径,指向项目资源文件夹。//编辑器模式:项目根目录下的 Assets 文件夹。//发布后:安装包内的资源路径//Windows C:/Build/XXX_Data文件夹//macOS /Applications/XXX.app/Contents/Resources/Data//Android /data/app/[包名]/base.apk(APK内部不能直接访问)//iOS/var/containers/Bundle/Application/[APP_UUID]/XXX.app/Data//WebGL 服务器资源路径(通过 HTTP 访问)//仅编辑器:读取Assets目录下的配置文件、资源。//发布后:通常不可写,且路径受平台限制,不建议直接使用。可运用场景:// 编辑器下读取 Assets/Config中的文件//#if UNITY_EDITOR// string configPath = Path.Combine(Application.dataPath, "Config/settings.json");// string json = File.ReadAllText(configPath);//#endif
Application.persistentDataPath
Debug.Log(Application.persistentDataPath);//可读写,适合保存用户生成的数据存档。//Windows/macOS:user/Administrator/AppData/Local)//Android/iOS:应用沙盒内的私有目录(如 /data/data/com.xxx.game/files)// 保存用户存档//string savePath = Path.Combine(Application.persistentDataPath, "save.dat");//File.WriteAllText(savePath, "PlayerLevel=10");可运用场景:一般单机游戏用来存放关卡分数较多//// 读取存档//if (File.Exists(savePath))//{// string data = File.ReadAllText(savePath);//}
优点
跨平台可靠:
persistentDataPath在所有平台均可读写,且路径由系统自动管理。
数据持久化:
文件会保留在用户目录中,即使应用更新或重装也不会丢失。
无需特殊权限:
系统已为应用分配了合法的可读写目录。
值得注意的是,PlayerPrefs存放的数据是在用户的平台注册表里,而非此目录
Application.streamingAssetsPath
Debug.Log(Application.streamingAssetsPath);//存放只读资源的路径,打包时原样包含在安装包中(只读)//Windows / macOS / Android:直接通过文件路径访问。出的包体里面包含StreamingAssets文件夹//iOS:资源在 .app 包内,需使用 UnityWebRequest 加载可运用场景//初始配置文件、视频、音频等无需修改的资源// 读取StreamingAssets中的JSON文件(跨平台方式)string configPath = Path.Combine(Application.streamingAssetsPath, "config.json");// Android/iOS 需用 UnityWebRequest#if UNITY_ANDROID || UNITY_IOS StartCoroutine(LoadStreamingAsset(configPath));#else string json = File.ReadAllText(configPath);#endifIEnumerator LoadStreamingAsset(string path) { using (UnityWebRequest request = UnityWebRequest.Get(path)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { string json = request.downloadHandler.text; } }}
各平台下 streamingAssetsPath 的路径和写入验证
值得注意的是,虽然上面路径说是只读,但是我们Pc包中能通过流式写入,原因在于
Unity 在 Windows 平台的特殊处理 和 安装目录权限宽松 导致的,但这种行为不可靠、不跨平台且不符合 Unity 设计规范。如果将游戏安装在非系统目录(如D:\Games\YourGame),Windows 默认允许当前用户对安装目录进行读写操作。此时,Application.streamingAssetsPath指向的路径(如XXX_Data\StreamingAssets)可能允许代码写入文件。使用File.Create()和StreamWriter直接操作文件系统,绕过了 Unity 的资源管理机制。在 Windows 这种权限宽松的平台上,这种操作可能被系统允许。
当然有一种情况代码会报错,这种就是直接写入:
string filePath = Path.Combine(Application.streamingAssetsPath, "test.txt");File.WriteAllText(filePath, "Hello"); // 抛出异常:Access Denied
另外通过流式写入其实还有几个弊端
1. 跨平台不可靠
移动端(Android/iOS):
Application.streamingAssetsPath在移动端指向安装包内部(APK/IPA),严格只读,代码写入会直接失败。
WebGL:
浏览器环境禁止直接文件操作,代码会抛出异常。
macOS:
如果应用安装在/Applications等系统目录,可能因权限不足导致写入失败。
2. 用户环境不可控
管理员权限依赖:
如果普通用户没有安装目录的写入权限(例如游戏安装在C:\Program Files),你的代码会因权限不足失败。
杀毒软件/系统保护:
部分安全软件可能拦截对安装目录的写入操作,导致文件创建失败。
最好的办法还是将文件保存到Application.persistentDataPath
//使用 persistentDataPath 而非 streamingAssetsPathstring path = Path.Combine(Application.persistentDataPath, "Info.txt");if (File.Exists(path)){ File.Delete(path);}using (StreamWriter sr = new StreamWriter(path, false, Encoding.UTF8)){ sr.WriteLine("张三");}
Application.temporaryCachePath
Debug.Log(Application.temporaryCachePath);//可读写路径,存放临时文件(如下载的缓存文件)。//平台差异:系统可能自动清理此目录(如 iOS 低存储时)//Windows C:/Users/[用户名]/AppData/Local/Temp/[公司名]/[游戏名]//macOS /var/folders/xx/xxxxx/T/[公司名]/[游戏名]//Android /data/data/[包名]/cache//iOS/var/mobile/Containers/Data/Application/[APP_UUID]/Library/Caches//WebGL 浏览器内存缓存(无持久化路径)可运用场景//临时下载文件、运行时生成的中间数据。//下载图片到临时缓存IEnumerator DownloadImage(string url) { using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(url)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Texture2D texture = DownloadHandlerTexture.GetContent(request); byte[] bytes = texture.EncodeToPNG(); string tempPath = Path.Combine(Application.temporaryCachePath, "temp_image.png"); File.WriteAllBytes(tempPath, bytes); Debug.Log("图片已保存到临时路径: " + tempPath); } }}
运行后,上述四个日志
路径对比与总结
persistentData Application.streamingAssetsPathPath
领取专属 10元无门槛券
私享最新 技术干货