Android 中是否有与 Unity 兼容的命名空间,可以“监听文件系统更改通知并在目录或目录中的文件发生更改时引发事件”?
例如:
这对事件来说是否很好,见下文。
快速研究使我相信 Android.OS.FileObserver是合适的解决方案,但似乎无法找到任何关于 Unity 的使用示例。
在 Unity 手册中读到“可以使用 Android 插件从他们的 C# 脚本调用在 Unity 之外创建的代码,从而允许他们访问操作系统调用等功能,否则 Unity 将无法使用这些功能”。
我们可以在 Android Unity 应用程序上使用文件观察器吗?
注意:虽然我们设法找到了 FileObserver.java,但寻找 FileObserver.jar 文件并没有被证明是有用的。适用于 Android 5.0。
代码
private void PrototypeFileWatcher_Created(object sender, FileSystemEventArgs e)
{
Debug.Log("FileWatcher created");
ReadFiles();
// prevent file access while it is still being written
while (IsFileLocked(e.FullPath))
{
}
UnityMainThreadDispatcher.Instance().Enqueue(() => GenerateMdls());
}
private void PrototypeFileWatcher_Changed(object sender, FileSystemEventArgs e)
{
Debug.Log("FileWatcher changed");
}
private void PrototypeFileWatcher_Deleted(object sender, FileSystemEventArgs e)
{
Debug.Log("FileWatcher deleted");
// prevent file access errors
while (IsFileLocked(e.FullPath))
{
}
if (e.ChangeType == WatcherChangeTypes.Deleted)
{
UnityMainThreadDispatcher.Instance().Enqueue(() => RemoveMdl(e.FullPath));
}
}
/* Credit for below:
* https://stackoverflow.com/questions/10982104/wait-until-file-is-completely-written
*/
const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
//check that problem is not in destination file
if (File.Exists(file) == true)
{
FileStream stream = null;
try
{
stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception ex2)
{
//_log.WriteLog(ex2, "Error in checking whether file is locked " + file);
int errorCode = System.Runtime.InteropServices.Marshal.GetHRForException(ex2) & ((1 << 16) - 1);
if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION))
{
return true;
}
}
finally
{
if (stream != null)
stream.Close();
}
}
return false;
}
最佳答案
在 Unity 中执行此操作的正确方法之一是创建一个 Android Plugin (例如图书馆/AAR)。
在那里您可以使用 FileObserver 实现您的需求你提到过的。然后,您可以使用 AndroidJavaClass
和 AndroidJavaObject
从 Unity 调用您定义的方法(在 Google 上搜索 unity call java method
)。
只需从您的 Android 插件向您场景中的任何 GameObject 发送一条消息,其中包含您需要的信息。检查 UnitySendMessage 函数部分 in this link .我认为整篇文章对您有所帮助。
关于c# - Unity Android 中的文件观察者/观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503615/