Unity文件操作路径

74 篇文章 29 订阅

一、Application几个关键的Path

Unity的Application有几个关键的Path:Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath、Application.temporaryCachePath。 

在个平台下的具体路径如下:

 Application.dataPathApplication.streamingAssetsPathApplication.persistentDataPathApplication.temporaryCachePath 
iOSApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/DataApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/RawApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/DocumentsApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
Android/data/app/xxx.xxx.xxx.apkjar:file:///data/app/xxx.xxx.xxx.apk/!/assets/data/data/xxx.xxx.xxx/files/data/data/xxx.xxx.xxx/cache
Windows/Assets/Assets/StreamingAssetsC:/Users/xxxx/AppData/LocalLow/CompanyName/ProductNameC:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
Mac/Assets/Assets/StreamingAssets/Users/xxxx/Library/Caches/CompanyName/Product Name/var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name
Windows Web Playerfile:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹)   

 

二、关于Resources目录

Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤掉这两张不被用的贴图,这样发布包就会小一些了。 

三、关于StreamingAssets目录

StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就下面的所有资源不会被加密,是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。 在移动平台,StreamingAssets只能用过www类来读取!!

StreamingAssets在不同的平台上面 (Windows、iOS、Android),该目录最终发布的位置不同,所以读取的方法也不同。

 windowsiOSAndroid
IO读取路径Application.StreamingAssetPath+"/myfile.txt"Application.StreamingAssetPath+"/myfile.txt"不支持
WWW读取路径"file://"+Application.StreamingAssetPath+"/myfile.txt""file://"+Application.StreamingAssetPath+"/myfile.txt"Application.StreamingAssetPath+"/myfile.txt"

四、WWW加载资源

WWW是异步加载所以执行加载命令式不能直接执行读取解析操作,要等待

WWW www = new WWW(filePath);
yield return www; // while (!www.isDone) {}
result = www.text;

Android之所以不支持C# IO流 方式读取StreamingAssets下的文件,是因为Android手机中,StreamingAssets下的文件都包含在压缩的.jar文件中(这基本上与标准的zip压缩文件的格式相同)。不能直接用读取文件的函数去读,而要用WWW方式。具体做法如下: 
1.把你要读取的文件放在Unity项目的Assets/StreamingAssets文件夹下面,没有这个文件夹的话自己建一个。 
2.读取的代码(假设名为"文件.txt") 

//用来存储读入的数据
byte[] bytes;       
//判断当前程序是否运行在安卓下                                                                                                   
if (Application.platform == RuntimePlatform.Android)                                            
{ 
    
    string fpath= "jar:file://" + Application.dataPath + "!/assets/" + "文件.txt"; 
    //等价于string fpath = Application.StreamingAssetPath+"/文件.txt"; 
    
    WWW www = new WWW(fpath);                                                                
    //WWW是异步读取,所以要用循环来等待 
    while(!www.isDone){}                                                                       
    //存到字节数组里 
    bytes= www.bytes;                                                                           
    

} 
else 
{ 
    //其他平台的读取代码 
}

 

五、各目录权限

1、StreamingAssets文件夹(只读)

#if UNITY_EDITOR
    string filepath = Application.dataPath +"/StreamingAssets/"+"my.xml";
#elif UNITY_IOS
    string filepath = Application.dataPath +"/Raw/"+"/my.xml";
#elif UNITY_ANDROID
    string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"my.xml;
#endif

2、Resources文件夹(只读)

可以使用Resources.Load("名字"); 把文件夹中的对象加载出来

3、Application.dataPath文件夹(只读)

可以使用Application.dataPath进行读操作

Application.dataPath: 只可读不可写,放置一些资源数据

4、Application.persistentDataPath文件夹(读写)

iOS与android平台都可以使用这个目录下进行读写操作,可以存放各种配置文件进行修改之类的。

在PC上的地址是:C:\Users\用户名 \AppData\LocalLow\DefaultCompany\test

六、总结

一. 在项目根目录中创建Resources文件夹来保存文件。
可以使用Resources.Load("文件名字,注:不包括文件后缀名");把文件夹中的对象加载出来。
注:此方可实现对文件实施“增删查改”等操作,但打包后不可以更改了

二. 直接放在项目根路径下来保存文件
在直接使用Application.dataPath来读取文件进行操作。
注:移动端是没有访问权限的。

三. 在项目根目录中创建StreamingAssets文件夹来保存文件。
1.可使用Application.dataPath来读取文件进行操作。

#if UNITY_EDITOR
    string filepath = Application.dataPath +"/StreamingAssets/"+"my.xml";
#elif UNITY_IOS
    string filepath = Application.dataPath +"/Raw/"+"my.xml";
#elif UNITY_ANDROID
    string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"my.xml;
#endif

// 上面三个平台各自判断,其实不用那么麻烦,直接统一使用Application.streamingAssets即可
// string filepath = Application.streamingAssets + "/my.xml";

2.直接使用Application.streamingAssetsPath来读取文件进行操作。
注:此方法在pc/Mac电脑中可实现对文件实施“增删查改”等操作,但在移动端只支持读取操作。

四. 使用Application.persistentDataPath来操作文件
该文件存在手机沙盒中,因此不能直接存放文件,
1. 通过服务器直接下载保存到该位置,也可以通过md5码比对下载更新新的资源
2. 没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过Application.persistentDataPath来读取操作。
注:在Windows / Mac电脑 以及Android、iPad、iPhone都可对文件进行任意操作,另外在iOS上该目录下的东西可以被iCloud自动备份

Unity 中,可以使用 `EditorUtility.OpenFilePanel` 方法来打开一个弹窗选择文件,并获取选择的文件路径。具体步骤如下: 1. 在 Unity 编辑器中,创建一个按钮或其他 UI 元素,用于触发选择文件操作。 2. 在按钮或 UI 元素的点击事件中,调用 `EditorUtility.OpenFilePanel` 方法。 3. 在 `EditorUtility.OpenFilePanel` 方法中传入弹窗的标题、默认目录、默认文件名和文件类型过滤器等参数。 4. 在方法调用完成后,判断用户是否选择了文件,如果选择了文件,则获取选择的文件路径。 下面是一个示例代码: ```c# using UnityEditor; public class FileSelectionExample { [MenuItem("Examples/Select File")] public static void SelectFile() { string title = "Select a file"; string directory = "Assets/"; string defaultName = "example.txt"; string extension = "txt"; string filter = $"Text files (*.{extension})|*.{extension}"; string filePath = EditorUtility.OpenFilePanel(title, directory, extension); if (!string.IsNullOrEmpty(filePath)) { Debug.Log($"Selected file: {filePath}"); } else { Debug.Log("No file selected"); } } } ``` 在上面的代码中,我们定义了一个名为 `SelectFile` 的静态方法,并在该方法上添加了 `MenuItem` 属性,用于在 Unity 编辑器中创建一个菜单,当用户点击该菜单时,会触发 `SelectFile` 方法。 在 `SelectFile` 方法中,我们调用了 `EditorUtility.OpenFilePanel` 方法,并传入了弹窗的标题、默认目录、默认文件名、文件类型过滤器等参数。如果用户选择了文件,则会得到选择的文件路径,并在控制台输出该路径。如果用户没有选择文件,则会输出 "No file selected"。 注意:`EditorUtility.OpenFilePanel` 方法只能在 Unity 编辑器中使用,不能在游戏运行时使用。如果需要在游戏运行时选择文件,可以使用 `System.Windows.Forms.OpenFileDialog` 等其他方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值