Advertisement
Serious07

Custom Odin Window

Apr 19th, 2021
934
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.45 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEditor;
  3. using Sirenix.OdinInspector;
  4. using Sirenix.OdinInspector.Editor;
  5. using Sirenix.Utilities.Editor;
  6. using GameData;
  7. using System.Collections.Generic;
  8.  
  9. public class ConfigsEditor : OdinMenuEditorWindow
  10. {
  11.     [OnValueChanged("StateChage")]
  12.     [LabelText("Game data:")]
  13.     [LabelWidth(100f)]
  14.     [EnumToggleButtons]
  15.     [ShowInInspector]
  16.     private ConfigsState currentState;
  17.  
  18.     private int enumIndex = 0;
  19.     private bool treeRebuild = false;
  20.  
  21.     private DrawSelected<InteractZoneData> drawZoneData = new DrawSelected<InteractZoneData>();
  22.     private DrawSelected<NPCLevelsData> drawNPCLevelData = new DrawSelected<NPCLevelsData>();
  23.     private DrawSelected<MovieData> drawMovieData = new DrawSelected<MovieData>();
  24.     private DrawSelected<ShopData> drawShopData = new DrawSelected<ShopData>();
  25.     private DrawSelected<UINPCUnlockData> drawNPCUnlockData = new DrawSelected<UINPCUnlockData>();
  26.     private DrawSelected<UpgradeData> drawUpgradeData = new DrawSelected<UpgradeData>();
  27.     private DrawSelected<UpgradesSettings> drawUpgradeSettings = new DrawSelected<UpgradesSettings>();
  28.  
  29.     //paths to ScriptbleObjects in project
  30.     private string zoneDataPath = "Assets/Configs/InteractZones";
  31.     private string NPCLevelDataPath = "Assets/Configs/NPCs/Levels";
  32.     private string moviesDataPath = "Assets/Configs/Movies";
  33.     private string shopDataPath = "Assets/Configs/ShopItems";
  34.     private string NPCUnlockDataPath = "Assets/Configs/NPCs/NPCs";
  35.     private string upgradeData = "Assets/Configs/Upgrades/Data";
  36.     private string upgradesSettings = "Assets/Configs/Upgrades";
  37.  
  38.     [MenuItem("Tools/Configs")]
  39.     private static void OpenWindow()
  40.     {
  41.         GetWindow<ConfigsEditor>().Show();
  42.     }
  43.  
  44.     private void StateChage()
  45.     {
  46.         treeRebuild = true;
  47.     }
  48.  
  49.     protected override void Initialize()
  50.     {
  51.         drawZoneData.SetPath(zoneDataPath);
  52.         drawNPCLevelData.SetPath(NPCLevelDataPath);
  53.         drawMovieData.SetPath(moviesDataPath);
  54.         drawShopData.SetPath(shopDataPath);
  55.         drawNPCUnlockData.SetPath(NPCUnlockDataPath);
  56.         drawUpgradeData.SetPath(upgradeData);
  57.         drawUpgradeSettings.SetPath(upgradesSettings);
  58.     }
  59.  
  60.     protected override void OnGUI()
  61.     {
  62.         if (treeRebuild && Event.current.type == EventType.Layout) {
  63.             ForceMenuTreeRebuild();
  64.             treeRebuild = false;
  65.         }
  66.  
  67.         SirenixEditorGUI.Title("Настройки игры", "Здесь можно настроить игровой контент и параметры игры.", TextAlignment.Center, true);
  68.         EditorGUILayout.Space();
  69.  
  70.         //switch (currentState) {
  71.         //    case ConfigsState.NPCsLevelingData:
  72.         //    case ConfigsState.NPCsUnlockData:
  73.         //    case ConfigsState.InteractZonesData:
  74.         //    case ConfigsState.UpgradesData:
  75.         //    case ConfigsState.UpgradesSettings:
  76.         //    case ConfigsState.MoviesData:
  77.         //    case ConfigsState.ShopData:
  78.         //        DrawEditor(enumIndex);
  79.         //        break;
  80.         //    default:
  81.         //        break;
  82.         //}
  83.  
  84.         EditorGUILayout.Space();
  85.  
  86.         base.OnGUI();
  87.     }
  88.  
  89.     protected override void DrawEditors()
  90.     {
  91.         switch (currentState) {
  92.             case ConfigsState.NPCsLevelingData:
  93.                 drawNPCLevelData.SetSelected(this.MenuTree.Selection.SelectedValue);
  94.                 break;
  95.             case ConfigsState.NPCsUnlockData:
  96.                 drawNPCUnlockData.SetSelected(this.MenuTree.Selection.SelectedValue);
  97.                 break;
  98.             case ConfigsState.InteractZonesData:
  99.                 drawZoneData.SetSelected(this.MenuTree.Selection.SelectedValue);
  100.                 break;
  101.             case ConfigsState.UpgradesData:
  102.                 drawUpgradeData.SetSelected(this.MenuTree.Selection.SelectedValue);
  103.                 break;
  104.             case ConfigsState.UpgradesSettings:
  105.                 drawUpgradeSettings.SetSelected(this.MenuTree.Selection.SelectedValue);
  106.                 break;
  107.             case ConfigsState.MoviesData:
  108.                 drawMovieData.SetSelected(this.MenuTree.Selection.SelectedValue);
  109.                 break;
  110.             case ConfigsState.ShopData:
  111.                 drawShopData.SetSelected(this.MenuTree.Selection.SelectedValue);
  112.                 break;
  113.             default:
  114.                 break;
  115.         }
  116.  
  117.         DrawEditor((int)currentState);
  118.     }
  119.  
  120.     protected override IEnumerable<object> GetTargets()
  121.     {
  122.         List<object> targets = new List<object>();
  123.         targets.Add(drawNPCLevelData);
  124.         targets.Add(drawNPCUnlockData);
  125.         targets.Add(drawZoneData);
  126.         targets.Add(drawUpgradeData);
  127.         targets.Add(drawUpgradeSettings);
  128.         targets.Add(drawMovieData);
  129.         targets.Add(drawShopData);
  130.         targets.Add(base.GetTargets());
  131.         enumIndex = targets.Count - 1;
  132.  
  133.         return targets;
  134.     }
  135.  
  136.     protected override void DrawMenu()
  137.     {
  138.         switch (currentState) {
  139.             case ConfigsState.NPCsLevelingData:
  140.             case ConfigsState.NPCsUnlockData:
  141.             case ConfigsState.InteractZonesData:
  142.             case ConfigsState.UpgradesData:
  143.             case ConfigsState.UpgradesSettings:
  144.             case ConfigsState.MoviesData:
  145.             case ConfigsState.ShopData:
  146.                 base.DrawMenu();
  147.                 break;
  148.             default:
  149.                 break;
  150.         }
  151.     }
  152.  
  153.     protected override OdinMenuTree BuildMenuTree()
  154.     {
  155.         OdinMenuTree tree = new OdinMenuTree();
  156.  
  157.         switch (currentState) {
  158.             case ConfigsState.NPCsLevelingData:
  159.                 tree.AddAllAssetsAtPath("NPCs Leveling Data", NPCLevelDataPath, typeof(NPCLevelsData));
  160.                 break;
  161.             case ConfigsState.NPCsUnlockData:
  162.                 tree.AddAllAssetsAtPath("NPCs Unlock Data", NPCLevelDataPath, typeof(UINPCUnlockData));
  163.                 break;
  164.             case ConfigsState.InteractZonesData:
  165.                 tree.AddAllAssetsAtPath("Interact zones Data", NPCLevelDataPath, typeof(InteractZoneData));
  166.                 break;
  167.             case ConfigsState.UpgradesData:
  168.                 tree.AddAllAssetsAtPath("Upgrades Data", NPCLevelDataPath, typeof(UpgradeData));
  169.                 break;
  170.             case ConfigsState.UpgradesSettings:
  171.                 tree.AddAllAssetsAtPath("Upgrades Settings Data", NPCLevelDataPath, typeof(UpgradesSettings));
  172.                 break;
  173.             case ConfigsState.MoviesData:
  174.                 tree.AddAllAssetsAtPath("Movies Data", NPCLevelDataPath, typeof(MovieData));
  175.                 break;
  176.             case ConfigsState.ShopData:
  177.                 tree.AddAllAssetsAtPath("Shop items Data", NPCLevelDataPath, typeof(ShopData));
  178.                 break;
  179.         }
  180.  
  181.         return tree;
  182.     }
  183.  
  184.     public enum ConfigsState
  185.     {
  186.         NPCsLevelingData,
  187.         NPCsUnlockData,
  188.         InteractZonesData,
  189.         UpgradesData,
  190.         UpgradesSettings,
  191.         MoviesData,
  192.         ShopData
  193.     }
  194. }
  195.  
  196. public class DrawSelected<T> where T : ScriptableObject
  197. {
  198.     private static readonly string controlAssetsGroup = "CreateNew/Horizontal";
  199.  
  200.     [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)]
  201.     public T selected;
  202.  
  203.     [LabelWidth(100)]
  204.     [PropertyOrder(-1)]
  205.     [HorizontalGroup("$controlAssetsGroup")]
  206.     public string nameForNew;
  207.  
  208.     private string path;
  209.  
  210.     [HorizontalGroup("$controlAssetsGroup")]
  211.     [GUIColor(0f, 0.7f, 0f)]
  212.     [Button]
  213.     public void CreateNew()
  214.     {
  215.         if (nameForNew == "") return;
  216.  
  217.         T newItem = ScriptableObject.CreateInstance<T>();
  218.         newItem.name = "New " + typeof(T).ToString();
  219.  
  220.         if (path == "") path = "Assets/Configs";
  221.  
  222.         AssetDatabase.CreateAsset(newItem, path + "\\" + nameForNew + ".asset");
  223.         AssetDatabase.SaveAssets();
  224.  
  225.         nameForNew = "";
  226.     }
  227.  
  228.     [HorizontalGroup("$controlAssetsGroup")]
  229.     [GUIColor(0.7f, 0f, 0f)]
  230.     [Button]
  231.     public void DeleteSelected()
  232.     {
  233.         if(selected != null) {
  234.             string _path = AssetDatabase.GetAssetPath(selected);
  235.             AssetDatabase.DeleteAsset(_path);
  236.             AssetDatabase.SaveAssets();
  237.         }
  238.     }
  239.  
  240.     public void SetSelected(object item)
  241.     {
  242.         var attempt = item as T;
  243.         if (attempt != null) this.selected = attempt;
  244.     }
  245.  
  246.     public void SetPath(string path)
  247.     {
  248.         this.path = path;
  249.     }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement