Unity文件操作
最近想自己写个简单的资源导入插件,写了到关键部分之后发现,文件夹由于权限问题,不能跨区移动,但是文件可以,(问:为什么要导入文件夹而不是文件呢? 答:这样做会导致纹理材质丢失的问题,因为只导入文件,一些相关联的内容部分会丢失,就拿FBX格式模型来举例吧!如果只导入FBX格式模型文件,那么这个模型就会出现材质丢失,当然了 肯定不止这些东西了,为了避免这样的问题出现,所以我们才会在导入模型的时候选择相关联的内容全部导Unity中,这样才算一个该资源的全部内容,当然了 你也可以这么想 我可以框选所有相关联的文件内容导进来啊!这当然可以,但是我们写工具就是为了便携,更快的协助我们进行项目的开发的)。OK,到此为止,下面直接上代码。
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
class TestScript : MonoBehaviour {
public List<string> folderVessel = new List<string>();
public List<string> fileVessel = new List<string>();
private protected string sourcePath = @"G:\TestFolder";//自定义路径
private protected string targetPath = @"D:\use\Unity\UnityProjectPath\ToLeadModel\Assets\FBX\";//自定义路径
private string _fn = null;
private string fn = null;
private void Start()
{
if (Directory.Exists(targetPath))
{
string[] folderName = sourcePath.Split('\\');
for (int i = 0; i < folderName.Length; i++)
{
if (folderName.Length - i == 1)
{
_fn = string.Concat(targetPath, "\\", folderName[i]);
}
else
{
string ls = folderName[i];
fn = fn + ls + '\\';
}
}
print(fn);//打印合并的路径是否正确
Directory.CreateDirectory(_fn);
getSourceFolder(sourcePath);
for (int i = 0; i < folderVessel.Count; i++)
{
string tp = folderVessel[i].Replace(fn, targetPath);
Directory.CreateDirectory(tp);
}
for (int i = 0; i < fileVessel.Count; i++)
{
string tf = fileVessel[i].Replace(fn, targetPath);
File.Move(fileVessel[i], tf);
}
UnityEditor.AssetDatabase.Refresh();
}
else
{
return;
}
}
void getSourceFolder(string folder)
{
getSourceFile(folder);
string[] _dir = Directory.GetDirectories(folder);
for (int i = 0; i < _dir.Length; i++)
{
folderVessel.Add(_dir[i]);
getSourceFolder(_dir[i]);
}
}
void getSourceFile(string path)
{
string[] files = Directory.GetFiles(path);
for (int i = 0; i < files.Length; i++)
{
fileVessel.Add(files[i]);
}
}
}
这里我们文件夹需要在新的区上创建相对应的,而且还要存储好这些路径结构,而文件则可以直接move。当然了,我相信肯定会有更好及更高效的解决方案,这里还网众多看官指点。