unity中监听文件夹并且创建文件夹后做资源更新
有时候我们在设计的时候,可能对项目的文件内容进行监听,也可能需要在监听某个文件夹的操作,并且做出相对应的处理,例如项目资源的大小监听等,以下就提供两种常用的方式:
- FileSystemWatcher;
- ProjectWindowUtil.StartNameEditingIfProjectWindowExists;
FileSystemWatcher
侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
1.常用的几个基本属性:
(1) Path :设置要监视的目录的路径。
(2) IncludeSubdirectories :设置是否级联监视指定路径中的子目录。
(3) Filter :设置筛选字符串,用于确定在目录中监视哪些类型的文件。
(4) NotifyFilter :设置文件的哪些属性的变动会触发Changed事件,同时监控多个属性变动可以按“或”组合。
(5) EnableRaisingEvents :设置是否开始监控。(默认为false)
2.常用事件:
(1) Changed :当更改文件和目录时发生,可以通过NotifyFilter属性设置触发该事件的需要文件更改的属性。
(2) Created : 当创建文件和目录时发生。
(3) Deleted : 删除文件或目录时发生。
(4) Renamed :重命名文件或目录时发生。
(5) FileSystemEventArgs :文件更改/创建/删除监听参数
(6) RenamedEventArgs :重名名监听参数
基本代码片段如下:
public class FileSystemWatcherProgram
{
//创建一个文件监听类
private FileSystemWatcher watcher;
/// <summary>
/// 开始监听
/// </summary>
/// <param name="path">监听路径</param>
public void BeginWatch(string path)
{
if (watcher == null)
{
watcher = new FileSystemWatcher();
}
//初始化监听
watcher.BeginInit();
//设置是否启用监听?
watcher.EnableRaisingEvents = true;
//设置需要监听的类型:文件夹名称 | 文件大小
watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.Size;
//设置监听的路径
watcher.Path = path;
//指定文件夹创建监听事件
watcher.Created += new FileSystemEventHandler(OnCreated);
//...这里还可以创建其他监听
//结束初始化
watcher.EndInit();
}
private void OnCreated(object sender, FileSystemEventArgs e)
{
// 这里做需要执行的处理...
// 需要注意的是监听是多线程监听,所以如果想要到其他线程去做处理,需要用到委托
watcher.EnableRaisingEvents = false;
watcher.Dispose();
}
}
注意:在Unity中如果是监听创建文件,并且希望在OnCreated 函数中做资源更改,在做AssetBaseData.Refresh(),会无效;因为这里是多线程,需要在手动更新一下文件。
如果需要在OnCreate()中创建文件,推荐ProjectWindowUtil.StartNameEditingIfProjectWindowExists
ProjectWindowUtil.StartNameEditingIfProjectWindowExists
查看源代码可以知道这个类可以帮助我们创建模板,在游戏开发中,比较常见的就是创建lua,cs模板。
但是如果需要对业务逻辑模块进行批量处理,即创建文件夹后,自动创建xxData.cs,xxView.cs文件时,则需要对文件夹做处理
(1)核心代码块
public class Program
{
...
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(
//InstanceID
0,
// EndAction
ScriptableObject.CreateInstance<DoCreateFolder>(),
// FileName
"New Folder",
//Img
EditorGUIUtility.IconContent(EditorResources.emptyFolderIconName).image as Texture2D,
//Resource Path
null);
...
internal class DoCreateFolder : EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)
{
string guid = AssetDatabase.CreateFolder(Path.GetDirectoryName(pathName), Path.GetFileName(pathName));
//做你需要做的事情
TryCreateLuaFile(pathName);
TryCreateCsFile(pathName);
AssetDatabase.Refresh();
UnityEngine.Object o = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid), typeof(UnityEngine.Object));
ProjectWindowUtil.ShowCreatedAsset(o);
}
private void TryCreateLuaFile(string folderName)
{
....
}
private void TryCreateCsFile(string folderName)
{
....
}
}
}
用这个就可以进行在Unity中创建文件夹后,进行创建后的处理,做资源更改处理