检测文件变化

上一篇讲在Lua文件变化的时候实现自动重载。有2种方式

一、assetpostprocessor

ssetPostProcessor是一个编辑器类,一个资源导入的一个管理器,在资源导入之前和之后可以根据导入的资源做一些设置和一些数据的修改,比如网格,纹理的压缩,模型添加组件等。当资源导入之前和之后都会发送通知,可以根据不同的资源类型,在导入之前和之后做不同的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class LuaReLoadProcessor : AssetPostprocessor
{
protected const string LUA_MAIN_PATH = "Assets/Scripts/Lua/";
public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
if (Application.isPlaying)
{
for (int i = 0; i < importedAsset.Length; i++)
{
bool isLuaFile = importedAsset[i].EndsWith(".lua");//这个地方根据各自项目调整
if (isLuaFile)
{
//根据路径名称解析得到对应的文件名称,执行热重载的逻辑
var sharedStringBuilder = SharedStringBuilder.Get();
sharedStringBuilder.Append(importedAsset[i]);
sharedStringBuilder.Replace(LUA_MAIN_PATH, "");
sharedStringBuilder.Replace(".lua", "");
sharedStringBuilder.Replace("/", ".");
Debug.LogError("执行热重载- >"+ sharedStringBuilder.ToString());
}
}
}
}
}
}

在修改后,保存文件(ctrl+s)。就可以看到对应的修改文件路径的Log日志

特殊情况:Auto ReResh(Editor->General)不勾选的话,还要额外键盘按下(ctrl+r),刷新下。

二、C#基于FileSystemWatcher

FileSystemWatcher监控指定文件或目录的文件的创建、删除、改动、重命名等活动。可以动态地定义需要监控的文件类型及文件属性改动的类型。

  • IncludeSubdirectories 是否包含子文件。
  • Path 目标路径。
  • NotifyFilter 设置文件的哪些属性的变动会触发
  • Changed事件。这里设置成了当文件内容发生变化时会触发。
  • Filter 设置筛选字符串,用于确定在目录中监视哪些类型的文件。这里只需要筛选 .lua后缀文件即可。
  • Changed 文件发生改变时的监听事件,需要一个FileSystemEventHandler 类型的委托。除了Changed外还可以监听Renamed、Deleted、Created。
  • EnableRaisingEvents 设置是否开始监控,默认为false
  • InternalBufferSize 能够监听的改动大小。如果监听事件没有触发,请把这个值设得大一点。
  • 还有一些其他属性,详细看MSDN关于FileSystemWatcher

详细代码到下面给出案例

【Lua运行时热重载①】检测Lua文件发生变化 - 水曜日鸡的文章 - 知乎

总结

目前项目中是选中第一种实现方式,第二种是有大佬提了一下,但没去尝试,少了一个踩坑的环节,看到有知乎的水曜日鸡用了这样的实现方式。

参考

文章目录
  1. 1. 一、assetpostprocessor
  2. 2. 二、C#基于FileSystemWatcher
  3. 3. 总结
  4. 4.
|