static void SetupWatchers()
        {
            if (fileSystemWatchers != null)
            {
                UdonSharpSettings settings = UdonSharpSettings.GetSettings();

                bool watcherEnabled = settings == null || settings.autoCompileOnModify;

                if (watcherEnabled != lastEnabledState)
                {
                    lastEnabledState = watcherEnabled;
                    foreach (FileSystemWatcher watcher in fileSystemWatchers)
                    {
                        if (watcher != null)
                        {
                            watcher.EnableRaisingEvents = watcherEnabled;
                        }
                    }
                }

                return;
            }

            AssemblyReloadEvents.beforeAssemblyReload += CleanupWatchers;

            string[] blacklistedDirectories = UdonSharpSettings.GetScannerBlacklist();

            string[] directories = Directory.GetDirectories("Assets/", "*", SearchOption.AllDirectories).Append("Assets/")
                                   .Select(e => e.Replace('\\', '/'))
                                   .Where(e => !blacklistedDirectories.Any(name => name.TrimEnd('/') == e.TrimEnd('/') || e.StartsWith(name)))
                                   .ToArray();

            List <string> sourceDirectories = new List <string>();

            foreach (string directory in directories)
            {
                if (Directory.GetFiles(directory, "*.cs").Length > 0)
                {
                    sourceDirectories.Add(directory);
                }
            }

            fileSystemWatchers = new FileSystemWatcher[sourceDirectories.Count];

            for (int i = 0; i < sourceDirectories.Count; ++i)
            {
                FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(sourceDirectories[i], "*.cs");
                fileSystemWatcher.IncludeSubdirectories = false;
                fileSystemWatcher.InternalBufferSize    = 1024; // Someone would need to modify 64 files in a single directory at once to hit this

                fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;
                fileSystemWatcher.Changed     += OnSourceFileChanged;

                fileSystemWatchers[i] = fileSystemWatcher;
            }
        }