1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】操作不要・完全自動でファイルのバックアップを保存するアセットを公開してみる

Last updated at Posted at 2024-07-09

Unity のバックアップを全自動で保存する
Unity のアセットを作成しました。
皆さんの役に立てればと思い
公開してみたいと思います。

本体はこちら(Unity Asset Store)
本体はこちら(BOOTH)
本体はこちら(Google Drive)


このアセットの説明

ファイルが更新されるたびに自動的にバックアップを保存します。
このアセットをインポートする以外の操作は必要ありません。

Assets フォルダがある階層に Assets_BackUP フォルダが自動的に生成されます。
Assets フォルダ内のファイルが更新されるたびに、そこにバックアップが自動的に保存されます。

バックアップファイル名には更新日が含まれるため、特定の時点に戻したい場合はファイル名で判別できます。

Assets_BackUP フォルダを削除すると、現在の状態のバックアップのみを含む新しい Assets_BackUP フォルダが再生成されます。
Assets_BackUP フォルダのサイズが大きくなりすぎた場合は、削除することを検討してください。

このアセットが Assets フォルダ内の
ファイルを書き換える事は絶対にありません。
このアセットは Assets_BackUP フォルダのみを触ります。
なのでこのアセットがバグを引き起こす事はありえません。
安心してご利用下さい。

image1.png
image2.png
image3.png


このアセットのコード

ver0.0.0 は以下のコードで動作しています。
ver1.0.0 では 4 作業日以上前のバックアップファイルを
ある程度削除する機能が盛り込まれていますが
コードが長いため ver0.0.0 のコードを載せます。

SephirothAutoBackUPMonitoring.cs を新規作成して
コードを下記のコードに差し替えて
Editor フォルダに入れても
ver0.0.0 の状態で動作すると思います。

SephirothAutoBackUPMonitoring.cs
using System.Threading.Tasks;

namespace SephirothTools
{
    public class SephirothAutoBackUPMonitoring
    {
        private static readonly object Lock = new();
        private static bool isExec = false;
        private static string DateString;

        public const bool isCSharpFileOnly = false;

        [UnityEditor.InitializeOnLoadMethod]
        private static void Exec()
        {
            lock (Lock)
            {
                if (isExec)
                {
                    return;
                }
                isExec = true;
                Task.Run(() => TaskExec(System.DateTime.Now.ToString("yyyyMMdd-HHmmss")));
            }
        }

        private static void TaskExec(string date)
        {
            DateString = date;
            while (true)
            {
                try
                {
                    ExecOneTime();
                }
                catch
                {

                }
                System.Threading.Thread.Sleep(5000); // A thread for SephirothAutoBackUPMonitoring is generated and put into sleep, so the main thread is not stopped.
                if(date != DateString)
                {
                    break;
                }
            }
        }

        private static void ExecOneTime()
        {
            string targetPath = System.IO.Directory.GetCurrentDirectory() + "\\Assets_BackUP";
            if (!System.IO.Directory.Exists(targetPath))
            {
                System.IO.Directory.CreateDirectory(targetPath);
            }

            foreach (string onePath in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory() + "\\Assets", "*", System.IO.SearchOption.AllDirectories))
            {
                try
                {
                    if (isCSharpFileOnly && !onePath.EndsWith(".cs"))
                    {
                        continue;
                    }

                    string oneTargetDirectory = System.IO.Directory.GetCurrentDirectory() + "\\Assets_BackUP" + onePath.Substring((System.IO.Directory.GetCurrentDirectory() + "\\Assets").Length);
                    oneTargetDirectory = oneTargetDirectory.Substring(0, oneTargetDirectory.LastIndexOf("\\"));

                    string oneTargetFileName = System.IO.File.GetLastWriteTime(onePath).ToString("yyyyMMdd-HHmmss") + "_" + System.IO.Path.GetFileName(onePath);

                    string target = oneTargetDirectory + "\\" + oneTargetFileName;

                    if (!System.IO.File.Exists(target))
                    {
                        string[] pathMove = oneTargetDirectory.Split("\\");
                        string folderPath = pathMove[0];

                        for (int i = 1; i < pathMove.Length; i++)
                        {
                            folderPath = folderPath + "\\" + pathMove[i];
                            if (!System.IO.Directory.Exists(folderPath))
                            {
                                System.IO.Directory.CreateDirectory(folderPath);
                            }
                        }

                        System.IO.File.Copy(onePath, target);
                    }
                }
                catch
                {

                }
            }
        }
    }
}

以上 Unity のバックアップを
全自動で保存するアセットを公開しました。

Git による管理の場合
コミットを長期間忘れる傾向にある人は
是非こちらを併用する事を検討してみてはいかがでしょうか?
その場合は Assets_BackUP フォルダを Git の対象外にして下さい。

皆さんの開発の助けになれますように
閲覧ありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?