diff options
author | Neil Kollack <nkollack@gmail.com> | 2022-04-18 13:22:11 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-18 13:22:11 -0500 |
commit | 41e8678c463b7606dfaf292d67d05244ff044878 (patch) | |
tree | 4bad1628cc223bbd40bd5a593c8bf9576fda0402 /Assets/Plugins | |
parent | a8e4db0544c6b2ac370693ad32e0e4adc01ef32e (diff) | |
parent | b11db6ce1af50c7f76f17b3797c76275f81801d2 (diff) |
Merge pull request #6 from MontanaJohns/develop
Prototype
Diffstat (limited to 'Assets/Plugins')
13 files changed, 1033 insertions, 0 deletions
diff --git a/Assets/Plugins/AutoSave Scenes.meta b/Assets/Plugins/AutoSave Scenes.meta new file mode 100644 index 0000000..1295ed5 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65a02c50b63126b479875d88553bab83 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs b/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs new file mode 100644 index 0000000..5f846ac --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs @@ -0,0 +1,911 @@ +using System; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using System.IO; +using UnityEditorInternal; +using UnityEngine.UIElements; +using System.Reflection; +using System.Collections.Generic; + +namespace EM.AutoSave.Editor +{ + + + + + class Root + { + internal static string WIKI_2 = "https://emem.store/wiki?AutoSave%20Free&%5B%20Getting%20Started&Usage"; + + static internal bool USE_AUTOSAVE_MOD { + get { return GET("USE_AUTOSAVE_MOD", true); } + set { + var r = USE_AUTOSAVE_MOD; SET("USE_AUTOSAVE_MOD", value); + AutoSaveHelper.Subscribe(); + } + } + + static internal int AS_SAVE_INTERVAL_IN_MIN { get { return Mathf.Clamp(GET("AS_SAVE_INTERVAL_IN_MIN", 5), 1, 60); } set { var r = AS_SAVE_INTERVAL_IN_MIN; SET("AS_SAVE_INTERVAL_IN_MIN", value); } } + static internal bool AS_LOG { get { return GET("AS_LOG", false); } set { var r = AS_LOG; SET("AS_LOG", value); } } + static internal int AS_SAVE_INTERVAL_IN_SEC { + get { return (int)AS_SAVE_INTERVAL_IN_MIN * 60; } + set { AS_SAVE_INTERVAL_IN_MIN = (value / 60); ; } + } + static internal int AS_FILES_COUNT { get { return GET("AS_FILES_COUNT", 10); } set { var r = AS_FILES_COUNT; SET("AS_FILES_COUNT", value); } } + static internal string AS_LOCATION { + get { + var res = GET("AS_LOCATION", "AutoSave"); + if (string.IsNullOrEmpty(res)) return "AutoSave"; + return res; + } + set { var r = AS_LOCATION; SET("AS_LOCATION", value); } + } + static internal int AS_FILES_STYLE { get { return GET("AS_FILES_STYLE", 1); } set { var r = AS_FILES_STYLE; SET("AS_FILES_STYLE", value); } } + + + internal const string PREFS_KEY = "EM.AutoSave."; + + internal static void SET(string m_registryKey, int value) + { + EditorPrefs.SetInt(PREFS_KEY + m_registryKey, value); + } + internal static void SET(string m_registryKey, bool value) + { + EditorPrefs.SetBool(PREFS_KEY + m_registryKey, value); + } + internal static int GET(string m_registryKey, int m_boolDefaultValue) + { + return EditorPrefs.GetInt(PREFS_KEY + m_registryKey, m_boolDefaultValue); + } + internal static bool GET(string m_registryKey, bool m_boolDefaultValue) + { + return EditorPrefs.GetBool(PREFS_KEY + m_registryKey, m_boolDefaultValue); + } + + internal static void SET(string m_registryKey, string m_str) + { + EditorPrefs.SetString(PREFS_KEY + m_registryKey, m_str); + } + internal static string GET(string m_registryKey, string m_str) + { + return EditorPrefs.GetString(PREFS_KEY + m_registryKey, m_str); + } + + + + + const string MENU_PATH = "Tools/AutoSave Free/"; + [MenuItem(MENU_PATH + "Enable", true)] + public static bool EnableV() { return !USE_AUTOSAVE_MOD; } + [MenuItem(MENU_PATH + "Enable", false)] + public static void Enable() + { + USE_AUTOSAVE_MOD = (!USE_AUTOSAVE_MOD); + } + [MenuItem(MENU_PATH + "Disable", true)] + public static bool DisableV() { return USE_AUTOSAVE_MOD; } + [MenuItem(MENU_PATH + "Disable", false)] + public static void Disable() + { + USE_AUTOSAVE_MOD = (!USE_AUTOSAVE_MOD); + } + [MenuItem(MENU_PATH + "Settings", priority = 50)] + public static void Settings() + { + AutoSaveMod.SELECT(); + } + + } + + + internal class AutoSaveHelper + { + + + + + static float AS_LAST_SAVE_TIME_IN_SEC { + get { return SessionState.GetFloat("EMX_AS_LAST_SAVE_TIME_IN_SEC", -1); } + set { SessionState.SetFloat("EMX_AS_LAST_SAVE_TIME_IN_SEC", value); } + } + static float AS_PLAY_LAUNCH_TIME { + get { return SessionState.GetFloat("EMX_AS_PLAY_LAUNCH_TIME", -1); } + set { SessionState.SetFloat("EMX_AS_PLAY_LAUNCH_TIME", value); } + } + + static float lastSave { + get { return AS_LAST_SAVE_TIME_IN_SEC; } + set { + if (AS_LAST_SAVE_TIME_IN_SEC != (value)) + AS_LAST_SAVE_TIME_IN_SEC = (value); + } + } + static float EDITOR_TIMER { + get { return (float)(EditorApplication.timeSinceStartup % 1000000); } + } + + + + + [InitializeOnLoadMethod] + internal static void Subscribe() + { + if (!Root.USE_AUTOSAVE_MOD) + { + EditorApplication.update -= UpdateCS; + return; + } + EditorApplication.update += UpdateCS; + } + + const string FE = ".unity"; + static string ghtrhr() + { + return DateTime.Now.Minute.ToString("D2"); + } + + static string _dataPath = null; + internal static string dataPath { + get { + return _dataPath ?? (_dataPath = System.IO.Directory.GetCurrentDirectory().Replace('\\', '/').TrimEnd('/') + "/Assets"); + } + } + + static string autoSaveFileName(string source) + { + // get { + if (!System.IO.Directory.Exists(dataPath + "/" + Root.AS_LOCATION)) + { + System.IO.Directory.CreateDirectory(dataPath + "/" + Root.AS_LOCATION); + AssetDatabase.Refresh(); + } + //if (!AssetDatabase.IsValidFolder("Assets/" + AutoSaveFolder)) AssetDatabase.CreateFolder("Assets", AutoSaveFolder); + + var files = System.IO.Directory.GetFiles(dataPath + "/" + Root.AS_LOCATION).Select(f => f.Replace('\\', '/')).Where(f => + f.EndsWith(".unity", StringComparison.OrdinalIgnoreCase) && f.Substring(f.LastIndexOf('/') + 1).StartsWith("AutoSave", StringComparison.OrdinalIgnoreCase)).ToArray(); + + var as_loc = dataPath + "/" + Root.AS_LOCATION + "/"; + var out_loc = "Assets/" + Root.AS_LOCATION + "/"; + + if (Root.AS_FILES_STYLE == 0) + { + + //var D = Mathf.Max( 2, Root.AS_FILES_COUNT.ToString().Length); + var D = Root.AS_FILES_COUNT.ToString().Length; + var D_string = Enumerable.Repeat(0, D).Select(s => s.ToString()).Aggregate((a, b) => a + b); + + if (files.Length == 0) return out_loc + "AutoSave_" + D_string + ".unity"; + + + DateTime? ta_max = null; + string f_max = null; + var _times = files.Select(f => { + var fa = f.Remove(f.LastIndexOf('.')); + DateTime ta = System.IO.File.GetLastWriteTime(f); + if (!ta_max.HasValue || ta_max < ta) + { + ta_max = ta; + f_max = f; + } + return new { f = fa, t = ta }; + } + ).ToArray(); + + Func<string, string> tryGet = (file) => { + var _ = file.LastIndexOf('_'); + if (_ == -1 || _ == file.Length - 1) return null; + int count; + if (int.TryParse(file.Substring(_ + 1), out count)) //.TrimStart( '0' ) + { + count = (count + 1) % Root.AS_FILES_COUNT; + return out_loc + "AutoSave_" + count.ToString("D" + D.ToString()) + ".unity"; + } + return null; + }; + + // attempt 1 + if (f_max != null) + { + f_max = f_max.Remove(f_max.LastIndexOf('.')); + var res1 = tryGet(f_max); + if (res1 != null) return res1; + } + + + // attempt 2 + var times = files.Select(f => new { f = f.Remove(f.LastIndexOf('.')), t = System.IO.File.GetLastWriteTime(f) }).OrderBy(w => w.t).ToList(); + for (int ind = times.Count - 1; ind >= 0; ind--) + { + var res = tryGet(times[ind].f); + if (res != null) return res; + } + // files = files.Select( n => n.Remove( n.LastIndexOf( '.' ) ) ).ToArray(); + + return out_loc + "AutoSave_" + D_string + ".unity"; + } + else + { + + var shs = ""; + var hihi = 0; + while (File.Exists(as_loc + gggER(source) + sdfgs().Replace("RTTR", ghtrhr()) + shs + FE)) + { + hihi++; + shs = " (" + hihi.ToString() + ")"; + } + var outNewFileName = out_loc + gggER(source) + sdfgs().Replace("RTTR", ghtrhr()) + shs + FE; + var asNewFileName = as_loc + gggER(source) + sdfgs().Replace("RTTR", ghtrhr()) + shs + FE; + + if (files.Length >= Root.AS_FILES_COUNT) + { + //var times = files.Select(f=>new {f = f.Remove( f.LastIndexOf( '.' ) ),t = System.IO.File.GetLastWriteTime(f) } ).ToArray(); + //.OrderBy(w=>w.t).ToList(); + DateTime? ta_max = null; + string f_max = null; + var _times = files.Select(f => { + // var fa = f.Remove( f.LastIndexOf( '.' ) ); + var fa = f; + DateTime ta = System.IO.File.GetLastWriteTime(f); + if (!ta_max.HasValue || ta_max > ta) + { + ta_max = ta; + f_max = f; + } + return new { f = fa, t = ta }; + }).ToArray(); + if (f_max == null) throw new Exception("f_max == null"); + + var f_max_local = f_max.Replace('\\', '/').TrimEnd('/'); + + if (!f_max_local.StartsWith(dataPath, StringComparison.OrdinalIgnoreCase)) throw new Exception("f_max_local | " + dataPath + " | " + f_max_local); + f_max_local = "Assets" + f_max_local.Substring(dataPath.Length); + + + if (!string.IsNullOrEmpty(AssetDatabase.MoveAsset(f_max_local, outNewFileName))) + { + if (!AssetDatabase.DeleteAsset(f_max_local)) + { + File.Delete(f_max); + if (File.Exists(f_max + ".meta")) File.Delete(f_max + ".meta"); + } + } + else + { + AssetDatabase.ImportAsset(outNewFileName, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport); + } + } + + return outNewFileName; + + } + + } + static string gggER(string source) + { + return "AutoSave [" + source + "] "; + } + static string sdfgs() + { + var dt = DateTime.Now; + var tyre = dt.Hour; + return tyre.ToString("D2") + "hRTTRm"; + } + + static float speeder = 0; + + public static void UpdateCS() + { + if (!Root.USE_AUTOSAVE_MOD) return; + + if (Application.isPlaying) + { + if (AS_PLAY_LAUNCH_TIME == -1) AS_PLAY_LAUNCH_TIME = EDITOR_TIMER; + return; + } + + if (AS_PLAY_LAUNCH_TIME != -1) + { + lastSave += (float)(EDITOR_TIMER - AS_PLAY_LAUNCH_TIME); + AS_PLAY_LAUNCH_TIME = -1; + } + + if (Mathf.Abs(speeder - EDITOR_TIMER) < 4) return; + speeder = EDITOR_TIMER; + + if (Mathf.Abs(lastSave - (float)EDITOR_TIMER) >= Root.AS_SAVE_INTERVAL_IN_SEC * 2) + { + lastSave = (float)EDITOR_TIMER; + // resetSet(); + } + + //Debug.Log(lastSave + " : " + (float)EDITOR_TIMER + " : " + Root.AS_SAVE_INTERVAL_IN_SEC); + if (Mathf.Abs(lastSave - (float)EDITOR_TIMER) >= Root.AS_SAVE_INTERVAL_IN_SEC) + { + SaveScene(); + } + //debug(); + } + + public static string GET_SCENE_NAME() + { + var s = EditorSceneManager.GetActiveScene(); + if (!s.IsValid()) return ""; + var scenename = s.name; + if (string.IsNullOrEmpty(scenename)) scenename = "untitled"; + return scenename + ".unity"; + } + public static void SaveScene() + { + + var s = EditorSceneManager.GetActiveScene(); + if (!s.IsValid()) return; + var scenename = GET_SCENE_NAME(); + var fn = autoSaveFileName(scenename); + + //var relativeSavePath = "Assets/" + Root.AS_LOCATION + "/"; + var interval = Root.AS_SAVE_INTERVAL_IN_SEC; + if (EditorSceneManager.SaveScene(s, fn, true)) + { + //AssetDatabase.ImportAsset( fn, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport ); + } + else + { + interval = 10; + } + var dif = (float)EDITOR_TIMER - lastSave - interval; + if (dif > 0) + { + int interator = 0; + while (dif > 0) + { + lastSave = (float)EDITOR_TIMER - dif; + dif = (float)EDITOR_TIMER - lastSave - interval; + interator++; + if (interator > 15) + { + lastSave = (float)EDITOR_TIMER; + break; + } + } + } + else lastSave = (float)EDITOR_TIMER; + + if (Root.AS_LOG) + { + Debug.Log("Auto-Save Current Scene: " + fn + + '\n' + + lastSave + " : " + dif + " : " + interval + " : " + EDITOR_TIMER); + if (interval == 10) Debug.LogWarning("Error save, second attempt"); + } + } + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + class AutoSaveMod : ScriptableObject + { + + static string __FOLDER; + static internal string FOLDER { + get { + if (__FOLDER != null) return __FOLDER; + var o = ScriptableObject.CreateInstance(typeof(AutoSaveMod)); + if (!o) return null; + var s = MonoScript.FromScriptableObject(o); + if (!s) return null; + var candidate = AssetDatabase.GetAssetPath(s); + if (string.IsNullOrEmpty(candidate)) return null; + + try + { + candidate = candidate.Replace('\\', '/'); + candidate = candidate.Remove(candidate.LastIndexOf('/')); + candidate = candidate.Trim(new[] { '/' }) + '/'; + } + catch + { + return null; + } + //PluginInternalFolder = candidate; + //_PluginExternalFolder = UNITY_SYSTEM_PATH + _PluginInternalFolder; + + return __FOLDER = candidate; + } + } + + + static AutoSaveMod __GetInstance = null; + internal static AutoSaveMod GetInstance() + { + if (__GetInstance) return __GetInstance; + var oldId = SessionState.GetInt(Root.PREFS_KEY + "setid", -1); + var load = InternalEditorUtility.GetObjectFromInstanceID(oldId) as AutoSaveMod; + if (!load) + { + if (!Directory.Exists(FOLDER)) Directory.CreateDirectory(FOLDER); + var path = FOLDER + "AutoSaveSettings.asset"; + load = AssetDatabase.LoadAssetAtPath<AutoSaveMod>(path); + if (!load) + { + load = ScriptableObject.CreateInstance(typeof(AutoSaveMod)) as AutoSaveMod; + SessionState.SetInt(Root.PREFS_KEY + "setid", load.GetInstanceID()); + AssetDatabase.CreateAsset(load, path); + AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); + } + + } + __GetInstance = load; + return load; + } + + + internal static void SELECT() + { + Selection.objects = new[] { GetInstance() }; + } + + } + + [CustomEditor(typeof(AutoSaveMod))] + class SETGUI_Autosave : UnityEditor.Editor + { + + internal static string set_text = "AutoSave (Background)";// + internal static string set_key = "USE_AUTOSAVE_MOD"; + public override VisualElement CreateInspectorGUI() + { + return base.CreateInspectorGUI(); + } + public override void OnInspectorGUI() + { + _GUI(); + } + + + + public static void _GUI() + { + Draw.RESET(); + + + var qweqwe = Draw.R2; + Draw.simple_wiki(ref qweqwe, Root.WIKI_2); + var nv = EditorGUI.ToggleLeft(qweqwe, set_text, Root.USE_AUTOSAVE_MOD); + if (nv != Root.USE_AUTOSAVE_MOD) + { + Root.USE_AUTOSAVE_MOD = nv; + } + Draw.Sp(10); + + + + + Root.AS_SAVE_INTERVAL_IN_MIN = Draw.FIELD(Draw.R, "Save Every (Minutes)", Root.AS_SAVE_INTERVAL_IN_MIN, 1, 60); + Root.AS_FILES_COUNT = Draw.FIELD(Draw.R, "Maximum Files Version", Root.AS_FILES_COUNT, 1, 999); + + //Draw.HELP( w, "You already have files that exceed the maximum number of files, you must manually delete the files, otherwise the asset will continue to use them." ); + //if (D) + //var r = Draw.R; + //r.width /= 3; + //var r2 = r; + //r2.width *= 2; + + EditorGUI.TextField(Draw.R, "Assets/" + Root.AS_LOCATION); + if (GUI.Button(Draw.R2, "Change Folder")) + { + var res = EditorUtility.OpenFolderPanel("Change Folder", AutoSaveHelper.dataPath + "/" + Root.AS_LOCATION, ""); + if (!string.IsNullOrEmpty(res)) + { + res = res.Replace('\\', '/').Trim('/'); + if (ValidateFolder(res)) + { + if (!res.StartsWith(AutoSaveHelper.dataPath, StringComparison.OrdinalIgnoreCase) || res.Length <= AutoSaveHelper.dataPath.Length) + { + EditorUtility.DisplayDialog("Failed", "Path should be in the project asset folder", "Ok"); + } + else + { + Root.AS_LOCATION = res.Substring(AutoSaveHelper.dataPath.Length).Replace('\\', '/').Trim('/'); + AssetDatabase.Refresh(); + } + } + } + } + + + + GUI.Label(Draw.R, "File names style:"); + + Root.AS_FILES_STYLE = GUI.Toolbar(Draw.R2, Root.AS_FILES_STYLE, new[] { "Simple counter", "Special names" }); + if (Root.AS_FILES_STYLE == 0) + { + GUI.Label(Draw.R, "Example: 'AutoSave_" + Enumerable.Repeat(0, Root.AS_FILES_COUNT.ToString().Length).Select(a => a.ToString()).Aggregate((a, b) => a + b) + ".unity'"); + } + else + { + GUI.Label(Draw.R, "Example: 'AutoSave [" + AutoSaveHelper.GET_SCENE_NAME() + "] 14h56m.unity'"); + } + + Draw.Sp(10); + Draw.HRx1(); + //Draw.TOG( "Log", "AS_LOG" ); + Root.AS_LOG = EditorGUI.ToggleLeft(Draw.R, "Log", Root.AS_LOG); + if (Root.AS_LOG) + { + if (GUI.Button(Draw.R, "Debug Save Scene Now")) + { + AutoSaveHelper.SaveScene(); + } + } + Draw.HELP("Autosave timer stops during the PlayMode, for example, you set saving in every 5 minutes, and when there will 2 minutes left before saving, and you click PlayMode, and you will play 15 minutes, it will be also remained 2 minutes"); + Draw.Sp(10); + + + } + + static bool ValidateFolder(string p) + { + if (Directory.GetFiles(p).Length != 0) + { + return EditorUtility.DisplayDialog( + "Warning!", + "Folder:\n...-" + p + "\nContains files, so if you will continue, some files started with 'AutoSave*' and ended with '*.unity' may be overwritten.\n\nDo you want to continue?", + "Yes", "Cancel"); + } + return true; + } + } + + + + + + + + + class Draw + { + + + [NonSerialized] + internal static int groupIndex = 0; + [NonSerialized] + internal static float padding = 20; + + //static EventType? _lastResetEvent = null; + internal static int CurrentId; + internal static void RESET() + { + currentViewWidth = (EditorGUIUtility.currentViewWidth - 16); + CurrentId = EditorGUIUtility.GetControlID(FocusType.Passive); + padding = 20; + //Debug.Log( ); + // if ( _lastResetEvent == Event.current.type ) return; + //_lastResetEvent = Event.current.type; + groupIndex = 0; + } + static float currentViewWidth; + static Rect _getRerct(GUILayoutOption gUILayoutOption = null) + { + var res = gUILayoutOption != null ? EditorGUILayout.GetControlRect(gUILayoutOption) : EditorGUILayout.GetControlRect(); + res.x = 0; + res.width = currentViewWidth; + res.x += padding; + res.width -= Math.Min(20, padding) + padding; + return last = res; + } + static Rect PEEK_NEW_WIDHT() + { + Rect res = Rect.zero; + res.x = 0; + res.width = currentViewWidth; + res.x += padding; + res.width -= Math.Min(20, padding) + padding; + return res; + } + static float CALC_PADDING { get { return padding + Math.Min(20, padding); } } + static GUIContent ec = new GUIContent(); + internal static Rect R05 { get { return _getRerct(GUILayout.Height(Mathf.RoundToInt(EditorGUIUtility.singleLineHeight * 0.2f))); } } + internal static Rect R15 { get { return _getRerct(GUILayout.Height(Mathf.RoundToInt(EditorGUIUtility.singleLineHeight * 1.5f))); } } + internal static Rect R { get { return _getRerct(); } } + internal static Rect R2 { get { return _getRerct(GUILayout.Height(EditorGUIUtility.singleLineHeight * 2)); } } + internal static Rect RH(float h) { return _getRerct(GUILayout.Height(h)); } + internal static Rect RH(float h, int shrink, int shrink2) + { + var r = _getRerct(GUILayout.Height(h)); + r.x += shrink; + r.width -= shrink2; + return r; + } + internal static Rect last; + internal static Rect lastPlus { + get { + var r = last; + r.x += 16; + return r; + } + } + + static bool hover { get { return last.Contains(Event.current.mousePosition); } } + static bool press { get { return Event.current.button == 0 && Event.current.isMouse; } } + internal static Rect Sp(float sp) + { + // GUILayout.Space( sp ); + return _getRerct(GUILayout.Height(sp)); + //GUILayout.Space( sp ); + } + + internal static void HRx4RED() + { + Sp(4); + + Draw.HRx2(); + //EditorGUI.DrawRect(Draw.R2, Color.red); + var c = GUI.color; + GUI.color = Color.red; + Draw.HRx2(); + GUI.color = c; + /* var r = R05; + if (Event.current.type == EventType.Repaint) + s("dragHandle").Draw(r, ec, false, false, false, false);*/ + //Sp(12); + Draw.HRx2(); + /* r = R05; + if ( Event.current.type == EventType.Repaint ) + s( "dragHandle" ).Draw( r, ec, false, false, false, false );*/ + Sp(4); + } + + internal static void HRx1(float resize = 0) + { + Sp(4); + var r = R05; + r.width -= resize; + if (Event.current.type == EventType.Repaint) + s("dragHandle").Draw(r, ec, false, false, false, false); + /* r = R05; + if ( Event.current.type == EventType.Repaint ) + s( "dragHandle" ).Draw( r, ec, false, false, false, false );*/ + Sp(4); + } + internal static void HRx1(Rect r) + { + // r.y += r.height / 4; + r.height /= 2; + if (Event.current.type == EventType.Repaint) + s("dragHandle").Draw(r, ec, false, false, false, false); + } + internal static void HRx05(Rect r) + { + r.y += (r.height - 3) / 2; + r.height = 2f; + if (Event.current.type == EventType.Repaint) + s("preToolbar").Draw(r, ec, false, false, false, false); + } + internal static void HRx2() + { + Sp(4); + var r = R05; + if (Event.current.type == EventType.Repaint) + s("dragHandle").Draw(r, ec, false, false, false, false); + Sp(12); + /* r = R05; + if ( Event.current.type == EventType.Repaint ) + s( "dragHandle" ).Draw( r, ec, false, false, false, false );*/ + Sp(4); + } + internal static void EXPAND(string text) + { + GUI.Button(R, text, s("preDropDown")); + } + + internal static Rect Grow(Rect p, int v) + { + v = -v; + p.x += v; + p.y += v; + p.width -= v * 2; + p.height -= v * 2; + return p; + } + + + static Dictionary<string, GUIStyle> _styles = new Dictionary<string, GUIStyle>(); + static Type t; + internal static GUIStyle s(string style) + { + if (_styles.ContainsKey(style)) return _styles[style]; + if (t == null) + { + t = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow+Styles"); + if (t == null) + { + t = typeof(EditorWindow).Assembly.GetType("UnityEditor.PropertyEditor+Styles"); + //if (t == null) throw new Exception("ASD"); + } + } + if (t == null) + _styles.Add(style, EditorStyles.toggle); + else + { + var l = new GUIStyle(t.GetField(style, ~BindingFlags.Instance).GetValue(null) as GUIStyle); + if (style == "addComponentArea") + { + l.fixedHeight = 0; + l.stretchHeight = true; + l.padding.left = 16 + 32; + } + else if (style == "addComponentButtonStyle") + { + l = new GUIStyle(EditorStyles.toolbarButton); + l.fixedWidth = 0; + l.stretchWidth = true; + l.fixedHeight = 0; + l.stretchHeight = true; + } + else if (style == "preToolbar") + { + l.fixedWidth = 0; + l.stretchWidth = true; + l.fixedHeight = 0; + l.stretchHeight = true; + } + else + { + l.padding.left = 16; + } + l.fixedWidth = 0; + l.stretchWidth = true; + l.fixedHeight = 0; + l.stretchHeight = true; + l.alignment = TextAnchor.MiddleLeft; + _styles.Add(style, l); + } + return _styles[style]; + } + + + static Color oldc; + internal static void HELP(string text, Color? c = null, bool drawTog = false) + { + // EditorGUI.LabelField( R, text, s( "previewMiniLabel" ) ); + var _s = s("previewMiniLabel"); + _s.wordWrap = true; + + if (c.HasValue) + { + oldc = GUI.color; + GUI.color *= c.Value; + } + if (drawTog) text = "· " + text; + var ca = _s.normal.textColor; + if (!EditorGUIUtility.isProSkin) _s.normal.textColor = new Color32(20, 20, 20, 255); + EditorGUI.TextArea(CALC_R(_s, text), text, _s); + _s.normal.textColor = ca; + if (c.HasValue) GUI.color = oldc; + // GUI.Label( CALC_R( _s, text ), text, _s ); + + } + static GUIContent _calcContent = new GUIContent(); + static Rect CALC_R(GUIStyle s, string t) + { + _calcContent.text = t; + var h = s.CalcHeight(_calcContent, (EditorGUIUtility.currentViewWidth - 16) - CALC_PADDING); + var r = _getRerct(GUILayout.Height(h)); + return r; + } + + static GUIContent __simple_wiki = new GUIContent(); + const string WIKI_LINK = "\n - Open online documentation page in browser\nLink also will be copied to text os buffer"; + internal static void simple_wiki(ref Rect r, string WIKI) + { + + var wiki_rect = r; + if (WIKI != null) + { + var S = r.height * 4; + + if (Event.current.type != EventType.Repaint) r.width -= S; + wiki_rect.x = wiki_rect.x + wiki_rect.width; + if (Event.current.type == EventType.Repaint) wiki_rect.x -= S; + wiki_rect.width = S; + //Root.SetMouseTooltip( "[ " + text + " ]" + WIKI, wiki_rect ); + } + if (WIKI != null) + { + __simple_wiki.text = "-->wiki?"; + __simple_wiki.tooltip = "[ " + WIKI + " ]" + WIKI_LINK; + + //var cont = CONT( , ); + //Root.SetMouseTooltip( cont.tooltip, wiki_rect ); + if (GUI.Button((Rect)wiki_rect, __simple_wiki, EditorStyles.toolbarButton)) + { + Application.OpenURL(WIKI); + EditorGUIUtility.systemCopyBuffer = WIKI; + } + } + } + internal static int FIELD(Rect rect, string postFix, int value, int min, int max, float labelOffset = 0) + { + + var _R = rect; + var _r = _R; + _R.width /= 1.5f; + GUI.Label(_R, postFix + ":"); + _R.x += _R.width; + _R.width = _r.width - _R.width; + rect = _R; + + var crop = rect; + if (labelOffset == 0) + { + if (crop.width < 160 * 1.5f) + { + crop.width /= 1.5f; + } + else + { + crop.width -= 80; + } + } + else crop.width = labelOffset; + crop.x += crop.width; + crop.width = rect.width - crop.width; + value = EditorGUI.IntField(crop, value); + + var ac = GUI.color; + GUI.color *= Color.clear; + GUI.BeginClip(rect); + rect.y = rect.x = 0; + + rect.x += rect.width; + float viewRect; + viewRect = EditorGUIUtility.labelWidth; + rect.x -= viewRect; + value = EditorGUI.IntField(rect, "ASDaaaaaaaaaaaaaaaaaaaaa", value); + rect.x -= viewRect; + value = EditorGUI.IntField(rect, "ASDaaaaaaaaaaaaaaaaaaaaa", value); + rect.x -= viewRect; + value = EditorGUI.IntField(rect, "ASDaaaaaaaaaaaaaaaaaaaaa", value); + GUI.EndClip(); + GUI.color = ac; + + value = Mathf.Clamp(value, min, max); + + return value; + } + + } + + + + +} diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs.meta b/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs.meta new file mode 100644 index 0000000..e46541c --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveMod.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bfd0d7f2cf4973348b92ddbccaa9f5ae +timeCreated: 1497373144 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset b/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset new file mode 100644 index 0000000..4ff0651 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfd0d7f2cf4973348b92ddbccaa9f5ae, type: 3} + m_Name: AutoSaveModSettings + m_EditorClassIdentifier: diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset.meta b/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset.meta new file mode 100644 index 0000000..2c00853 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveModSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eac39a7e59f8b814d8297077d40bcb30 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset b/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset new file mode 100644 index 0000000..70e6a7e --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfd0d7f2cf4973348b92ddbccaa9f5ae, type: 3} + m_Name: AutoSaveSettings + m_EditorClassIdentifier: diff --git a/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset.meta b/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset.meta new file mode 100644 index 0000000..e47066a --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/AutoSaveSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82ef66a65f755b141b4436a836e6735e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef b/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef new file mode 100644 index 0000000..9e382f6 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "EM.AutoSave.Editor", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +}
\ No newline at end of file diff --git a/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef.meta b/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef.meta new file mode 100644 index 0000000..7869863 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/EM.AutoSave.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4783cf8a4bae8e146b9949b206c35da6 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/ReadMe.txt b/Assets/Plugins/AutoSave Scenes/ReadMe.txt new file mode 100644 index 0000000..4d9446e --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/ReadMe.txt @@ -0,0 +1,5 @@ +AutoSave will save you files every n minutes + +You can find setting in the top menu 'Tools/AutoSave Free/Settings/ + +Online autosave documentation: https://emem.store/wiki?AutoSave%20Free&%5B%20Getting%20Started&Usage diff --git a/Assets/Plugins/AutoSave Scenes/ReadMe.txt.meta b/Assets/Plugins/AutoSave Scenes/ReadMe.txt.meta new file mode 100644 index 0000000..24f7f5f --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/ReadMe.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b55079beec1e174fa726b154a93fc90 +timeCreated: 1493380610 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset b/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset new file mode 100644 index 0000000..26a6611 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfd0d7f2cf4973348b92ddbccaa9f5ae, type: 3} + m_Name: SnapModSettings + m_EditorClassIdentifier: diff --git a/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset.meta b/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset.meta new file mode 100644 index 0000000..47757f9 --- /dev/null +++ b/Assets/Plugins/AutoSave Scenes/SnapModSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1dc665fdc56549c4fbf951d1283662ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: |