c# - Unity Android 中的文件观察者/观察者?

标签 c# android unity-game-engine

Android 中是否有与 Unity 兼容的命名空间,可以“监听文件系统更改通知并在目录或目录中的文件发生更改时引发事件”?

例如:

System.IO.FileSystemWatcher

这对事件来说是否很好,见下文。

快速研究使我相信 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 实现您的需求你提到过的。然后,您可以使用 AndroidJavaClassAndroidJavaObject 从 Unity 调用您定义的方法(在 Google 上搜索 unity call java method)。

只需从您的 Android 插件向您场景中的任何 GameObject 发送一条消息,其中包含您需要的信息。检查 UnitySendMessage 函数部分 in this link .我认为整篇文章对您有所帮助。

关于c# - Unity Android 中的文件观察者/观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503615/

相关文章:

c# - RavenDB 快速子串搜索

c# - 带格式的评估堆栈跟踪

Android 后退按钮如何返回上一个 fragment ?

java - Android:这个应用程序的最佳层次结构是什么?

c# - 使用 NavMesh (Unity) 寻找路径点

c# - 按钮统一切换颜色

c# - 在 MVC 中设置 CaSTLe Windsor

c# - 使用运行时生成的列创建 GridView

java - 地理编码 - 在 GoogleMaps Java 中将地址(以字符串形式)转换为 LatLng

animation - 从 C# 代码在 Unity 4.6 中对图像进行动画/移动/翻译/补间动画