유니티 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 부분 확인하면 알수 있다