유니티 Save Selection을 즐겨 사용하는데 이게 유니티를 재시작하면 다 없어지는 불편함이 있다

재시작시에도 유지될수 있는 방법을 찾아서 공유한다.

 

아래 스크립트를 Asset/Editor 안에

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.ShortcutManagement;

public class SelectionSaver
{
    const string SELECTION_PATH = "Main Menu/Edit/Selection/";

    // 에디터가 로드될 때 단축키를 초기화합니다.
    [InitializeOnLoadMethod]
    static void SaveHotkeys()
    {
        foreach (var item in ShortcutManager.instance.GetAvailableShortcutIds())
        {
            if (item.StartsWith(SELECTION_PATH))
            {
                ShortcutManager.instance.RebindShortcut(item, new ShortcutBinding());
            }
        }
    }

    // 선택을 저장하고 불러오는 단축키를 정의합니다.
    [Shortcut("save_selection_1", KeyCode.Alpha1, ShortcutModifiers.Control, displayName = "Save Selection 1")]
    static void SaveSelection1()
    {
        SaveSelection("1");
    }

    [Shortcut("load_selection_1", KeyCode.Alpha1, ShortcutModifiers.None, displayName = "Load Selection 1")]
    static void LoadSelection1()
    {
        LoadSelection("1");
    }

    [Shortcut("save_selection_2", KeyCode.Alpha2, ShortcutModifiers.Control, displayName = "Save Selection 2")]
    static void SaveSelection2()
    {
        SaveSelection("2");
    }

    [Shortcut("load_selection_2", KeyCode.Alpha2, ShortcutModifiers.None, displayName = "Load Selection 2")]
    static void LoadSelection2()
    {
        LoadSelection("2");
    }

    [Shortcut("save_selection_3", KeyCode.Alpha3, ShortcutModifiers.Control, displayName = "Save Selection 3")]
    static void SaveSelection3()
    {
        SaveSelection("3");
    }

    [Shortcut("load_selection_3", KeyCode.Alpha3, ShortcutModifiers.None, displayName = "Load Selection 3")]
    static void LoadSelection3()
    {
        LoadSelection("3");
    }

    [Shortcut("save_selection_4", KeyCode.Alpha4, ShortcutModifiers.Control, displayName = "Save Selection 4")]
    static void SaveSelection4()
    {
        SaveSelection("4");
    }

    [Shortcut("load_selection_4", KeyCode.Alpha4, ShortcutModifiers.None, displayName = "Load Selection 4")]
    static void LoadSelection4()
    {
        LoadSelection("4");
    }

    [Shortcut("save_selection_5", KeyCode.Alpha5, ShortcutModifiers.Control, displayName = "Save Selection 5")]
    static void SaveSelection5()
    {
        SaveSelection("5");
    }

    [Shortcut("load_selection_5", KeyCode.Alpha5, ShortcutModifiers.None, displayName = "Load Selection 5")]
    static void LoadSelection5()
    {
        LoadSelection("5");
    }

    [Shortcut("save_selection_6", KeyCode.Alpha6, ShortcutModifiers.Control, displayName = "Save Selection 6")]
    static void SaveSelection6()
    {
        SaveSelection("6");
    }

    [Shortcut("load_selection_6", KeyCode.Alpha6, ShortcutModifiers.None, displayName = "Load Selection 6")]
    static void LoadSelection6()
    {
        LoadSelection("6");
    }

    [Shortcut("save_selection_7", KeyCode.Alpha7, ShortcutModifiers.Control, displayName = "Save Selection 7")]
    static void SaveSelection7()
    {
        SaveSelection("7");
    }

    [Shortcut("load_selection_7", KeyCode.Alpha7, ShortcutModifiers.None, displayName = "Load Selection 7")]
    static void LoadSelection7()
    {
        LoadSelection("7");
    }

    [Shortcut("save_selection_8", KeyCode.Alpha8, ShortcutModifiers.Control, displayName = "Save Selection 8")]
    static void SaveSelection8()
    {
        SaveSelection("8");
    }

    [Shortcut("load_selection_8", KeyCode.Alpha8, ShortcutModifiers.None, displayName = "Load Selection 8")]
    static void LoadSelection8()
    {
        LoadSelection("8");
    }

    [Shortcut("save_selection_9", KeyCode.Alpha9, ShortcutModifiers.Control, displayName = "Save Selection 9")]
    static void SaveSelection9()
    {
        SaveSelection("9");
    }

    [Shortcut("load_selection_9", KeyCode.Alpha9, ShortcutModifiers.None, displayName = "Load Selection 9")]
    static void LoadSelection9()
    {
        LoadSelection("9");
    }

    [Shortcut("save_selection_0", KeyCode.Alpha0, ShortcutModifiers.Control, displayName = "Save Selection 0")]
    static void SaveSelection0()
    {
        SaveSelection("0");
    }

    [Shortcut("load_selection_0", KeyCode.Alpha0, ShortcutModifiers.None, displayName = "Load Selection 0")]
    static void LoadSelection0()
    {
        LoadSelection("0");
    }

    // 선택된 객체들을 JSON으로 저장하는 메서드
    static void SaveSelection(string key)
    {
        if (Selection.assetGUIDs == null || Selection.assetGUIDs.Length == 0) return;

        string json = JsonUtility.ToJson(new GUIDArray { guids = Selection.assetGUIDs });
        if (string.IsNullOrEmpty(json)) return;

        EditorPrefs.SetString(key, json);
    }

    // JSON으로 저장된 객체들을 불러오는 메서드
    static void LoadSelection(string key)
    {
        string json = EditorPrefs.GetString(key);
        if (string.IsNullOrEmpty(json)) return;

        GUIDArray guidArray = JsonUtility.FromJson<GUIDArray>(json);
        if (guidArray == null || guidArray.guids.Length == 0) return;

        bool resave = false;
        List<Object> objects = new List<Object>();
        foreach (string guid in guidArray.guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            if (string.IsNullOrEmpty(path))
            {
                Debug.LogWarning($"Object with guid ({guid}) no longer exists. It will be resaved");
                resave = true;
                continue;
            }

            Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
            var asset = AssetDatabase.LoadAssetAtPath<Object>(path);

            Selection.activeObject = asset;
            EditorGUIUtility.PingObject(asset);
            
            if (obj == null) continue;

            objects.Add(obj);
        }

        Selection.objects = objects.ToArray();

        // 존재하지 않는 객체가 있을 경우 다시 저장
        if (resave)
        {
            EditorPrefs.SetString(key, JsonUtility.ToJson(new GUIDArray { guids = guidArray.guids }));
        }
    }

    // GUID 배열을 저장하기 위한 클래스
    [System.Serializable]
    public class GUIDArray
    {
        public string[] guids;
    }
}

SelectionSaver.cs 로 저장하면 끝.

 

Save Selection을 해서 사용후 유니티를 껐다 켜도 유지되는것을 볼수 있다.

 

PS. 단축키는 코드에서 변경해야함. 코드에서 Shortcut 부분 확인하면 알수 있다