Schedules an AssetDatabase.Refresh to occur on the next Editor application tick.
This method provides a better alternative to AssetDatabase.Refresh
for situations where script assets, and other assets which depend on those scripts (such as prefabs) are modified at the same time.
This method is used internally by the package manager code when updating package samples to avoid duplicated imports. You only need to use this method if you are writing editor code which modifies or imports changes to script assets and assets which depend on those scripts at the same time.
In situations where you write scripts that modify only non-script assets, calling AssetDatabase.Refresh is sufficient, and causes your modified assets to be imported immediately.
However, in the scenario where you modify assets and the scripts they depend on, calling AssetDatabase.Refresh is not ideal because the dependent assets (such as prefabs) get imported twice. This occurs because AssetDatabase.Refresh runs immediately within your own script, and the Editor can't reload the scripting domain while your own C# code is running. Therefore only your non-script assets are imported in the refresh. The Editor then reloads the scripting domain after your script completes, triggering a second import on those assets which depend on the modified scripts.
Scheduling an AssetDatabase refresh on the next application tick instead of using AssetDatabase.Refresh means the refresh does not occur while your C# code is running, therefore the domain reload occurs first, and all assets are imported only once, after the domain reload.
Additional resources: AssetDatabase.Refresh
using System.IO; using UnityEngine; using UnityEditor;
public class Sample : MonoBehaviour { [MenuItem("Sample/Copy Assets")] static void CopyAssets() { CopyDirectory("Backup", "Assets"); AssetDatabase.ScheduleRefresh(); }
static void CopyDirectory(string source, string destination) { Directory.CreateDirectory(destination);
var sourceInfo = new DirectoryInfo(source); foreach (var nestedSource in sourceInfo.GetDirectories()) { CopyDirectory(nestedSource.FullName, Path.Combine(destination, nestedSource.Name)); }
foreach (var sourceFile in sourceInfo.GetFiles()) { File.Copy(sourceFile.FullName, Path.Combine(destination, sourceFile.Name), true); } } }