using UnityEngine; using UnityEditor; using System.IO; using UnityEngine.UIElements; [CustomEditor(typeof(Readme))] [InitializeOnLoad] sealed class ReadmeEditor : Editor { const string k_ShowedReadmeSessionStateName = "ReadmeEditor.showedReadme"; const string k_ReadmeSourceDirectory = "Assets/TutorialInfo"; static ReadmeEditor() => EditorApplication.delayCall += SelectReadmeAutomatically; static void SelectReadmeAutomatically() { if (!SessionState.GetBool(k_ShowedReadmeSessionStateName, false)) { var readme = SelectReadme(); SessionState.SetBool(k_ShowedReadmeSessionStateName, true); if (readme && !readme.loadedLayout) { EditorUtility.LoadWindowLayout(Path.Combine(Application.dataPath, "TutorialInfo/Layout.wlt")); readme.loadedLayout = true; } } } static Readme SelectReadme() { var ids = AssetDatabase.FindAssets("Readme t:Readme"); if (ids.Length != 1) { Debug.Log("Couldn't find a readme"); return null; } var readmeObject = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(ids[0])); Selection.objects = new UnityEngine.Object[] { readmeObject }; return (Readme)readmeObject; } void RemoveTutorial() { if (EditorUtility.DisplayDialog("Remove Readme Assets", $"All contents under {k_ReadmeSourceDirectory} will be removed, are you sure you want to proceed?", "Proceed", "Cancel")) { if (Directory.Exists(k_ReadmeSourceDirectory)) { FileUtil.DeleteFileOrDirectory(k_ReadmeSourceDirectory); FileUtil.DeleteFileOrDirectory(k_ReadmeSourceDirectory + ".meta"); } else { Debug.Log($"Could not find the Readme folder at {k_ReadmeSourceDirectory}"); } var readmeAsset = SelectReadme(); if (readmeAsset != null) { var path = AssetDatabase.GetAssetPath(readmeAsset); FileUtil.DeleteFileOrDirectory(path + ".meta"); FileUtil.DeleteFileOrDirectory(path); } AssetDatabase.Refresh(); } } //Remove ImGUI protected sealed override void OnHeaderGUI() { } public sealed override void OnInspectorGUI() { } public override VisualElement CreateInspectorGUI() { var readme = (Readme)target; VisualElement root = new(); root.styleSheets.Add(readme.commonStyle); root.styleSheets.Add(EditorGUIUtility.isProSkin ? readme.darkStyle : readme.lightStyle); VisualElement ChainWithClass(VisualElement created, string className) { created.AddToClassList(className); return created; } //Header VisualElement title = new(); title.AddToClassList("title"); title.Add(ChainWithClass(new Image() { image = readme.icon }, "title__icon")); title.Add(ChainWithClass(new Label(readme.title), "title__text")); root.Add(title); //Content foreach (var section in readme.sections) { VisualElement part = new(); part.AddToClassList("section"); if (!string.IsNullOrEmpty(section.heading)) part.Add(ChainWithClass(new Label(section.heading), "section__header")); if (!string.IsNullOrEmpty(section.text)) part.Add(ChainWithClass(new Label(section.text), "section__body")); if (!string.IsNullOrEmpty(section.linkText)) { var link = ChainWithClass(new Label(section.linkText), "section__link"); link.RegisterCallback(evt => Application.OpenURL(section.url)); part.Add(link); } root.Add(part); } var button = new Button(RemoveTutorial) { text = "Remove Readme Assets" }; button.AddToClassList("remove-readme-button"); root.Add(button); return root; } }