Advertisement
jamieTheCoder

ConnectedAssetScriptableObjectHandler

Jan 30th, 2023
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.93 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. #endif
  6. using UnityEngine;
  7. using System;
  8. using System.IO;
  9. using UnityEditor.UIElements;
  10. using UnityEngine.UIElements;
  11. using System.Linq;
  12.  
  13. public class ConnectedAssetScriptableObjectHandler : ScriptableObject {
  14.     public List<ConnectedAssetSO> connectedAssetList;
  15.  
  16.     public void RenameConnectedAssets(string newName) {
  17.         foreach (ConnectedAssetSO asset in connectedAssetList) {
  18.             asset.NameExtension = newName + asset.BasePathType.ToString();
  19.             asset.RenameConnectedAsset(newName);
  20.             AssetDatabase.SaveAssets();
  21.             AssetDatabase.Refresh();
  22.         }
  23.     }
  24.     public void CreateConnectedAssets() {
  25.         foreach (ConnectedAssetSO asset in connectedAssetList) {
  26.             bool doOnce = false;
  27.             if (doOnce == false) {
  28.                 asset.CreateConnectedAsset(out doOnce);
  29.             }
  30.         }
  31.         AssetDatabase.SaveAssets();
  32.         AssetDatabase.Refresh();
  33.         foreach (ConnectedAssetSO asset in connectedAssetList) {
  34.             bool doOnce = false;
  35.             if (doOnce == false) {
  36.                 asset.FinalObject = AssetDatabase.LoadAssetAtPath(asset.FinalPath, asset.BasePathType);
  37.             }
  38.         }
  39.     }
  40. #if UNITY_EDITOR
  41.     public virtual void Awake() {
  42.         //We want to Open the connected assets window then create assets specified on button click.
  43.  
  44.     }
  45. #endif
  46. }
  47. #if UNITY_EDITOR
  48. public class ConnectedAssetDatabase : EditorWindow {
  49.     //private ConnectedAssetScriptableObjectHandler connectedAssetScriptableObject;
  50.  
  51.     private static List<ConnectedAssetSO> m_ConnectedAssetDatabase = new List<ConnectedAssetSO>();
  52.     private VisualElement m_ConnectedAssetsTab;
  53.     private static VisualTreeAsset m_ConnectedAssetRowTemplate;
  54.     private ScrollView m_DetailSection;
  55.  
  56.     private ListView m_ConnectedAssetListView;
  57.     private ConnectedAssetSO m_activeItem;
  58.  
  59.     private int m_ItemHeight = 60;
  60.     [MenuItem("WUG/Connected Asset Database")]
  61.     public static void Init() {
  62.         ConnectedAssetDatabase wnd = GetWindow<ConnectedAssetDatabase>();
  63.         wnd.titleContent = new GUIContent("Connected Asset Database");
  64.  
  65.         Vector2 size = new Vector2(1000, 475);
  66.         wnd.minSize = size;
  67.         wnd.maxSize = size;
  68.     }
  69.     public void CreateGUI() {
  70.         // Import the UXML Window
  71.         var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Connected Assets/Editor/ConnectedAssetDatabase.uxml");
  72.         VisualElement rootFromUXML = visualTree.Instantiate();
  73.         rootVisualElement.Add(rootFromUXML);
  74.  
  75.         // Import the stylesheet
  76.         var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Connected Assets/Editor/ConnectedAssetDatabase.uss");
  77.         rootVisualElement.styleSheets.Add(styleSheet);
  78.  
  79.         //Import the ListView Connected Asset Template
  80.         m_ConnectedAssetRowTemplate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Connected Assets/Editor/ConnectedAssetRowTemplate.uxml");
  81.         //TODO Replace this with some sort of indicator for Connected Assets
  82.  
  83.         //Get references for later
  84.         //this is how we query our created "template?" i am not sure since rootVisualElement is never "set"
  85.         // this will query rootVisualElement (still not sure how this references our created data) for ScrollViewDetails
  86.         m_DetailSection = rootVisualElement.Q<ScrollView>("ScrollView_Details");
  87.         //This will query m_DetailSection(IE ScrollView_Details) for an element Named Icon
  88.         //m_LargeDisplayIcon = m_DetailSection.Q<VisualElement>("Icon");
  89.  
  90.         //Load all existing item assets
  91.         LoadAllConnectedAssets();
  92.  
  93.         //Populate the listview
  94.         m_ConnectedAssetsTab = rootVisualElement.Q<VisualElement>("ConnectedAssetsTab");
  95.         Debug.Log(m_ConnectedAssetsTab);
  96.         GenerateListView();
  97.  
  98.         //Hook up button click events
  99.         rootVisualElement.Q<Button>("Btn_AddItem").clicked += AddItem_OnClick;
  100.         rootVisualElement.Q<Button>("Btn_DeleteItem").clicked += DeleteItem_OnClick;
  101.  
  102.         //Register Value Changed Callbacks for new items added to the ListView
  103.         //m_DetailSection.Q<TextField>("ItemName").RegisterValueChangedCallback(evt => {
  104.         //    m_activeItem.FriendlyName = evt.newValue;
  105.         //    m_ConnectedAssetListView.Refresh();
  106.         //});
  107.  
  108.         //m_DetailSection.Q<ObjectField>("IconPicker").RegisterValueChangedCallback(evt => {
  109.         //    Sprite newSprite = evt.newValue as Sprite;
  110.         //    m_activeItem.Icon = newSprite == null ? m_DefaultItemIcon : newSprite;
  111.         //    m_LargeDisplayIcon.style.backgroundImage = newSprite == null ? m_DefaultItemIcon.texture : newSprite.texture;
  112.  
  113.         //    m_ConnectedAssetListView.Refresh();
  114.  
  115.         //});
  116.  
  117.     }
  118.     /// <summary>
  119.     /// Look through all items located in Assets/Data and load them into memory
  120.     ///
  121.     /// We should change this purpose since we have our list on
  122.     /// </summary>
  123.     private void LoadAllConnectedAssets() {
  124.         m_ConnectedAssetDatabase.Clear();
  125.  
  126.         string[] allPaths = Directory.GetFiles("Assets/Connected Assets/Created Connected Assets", "*.asset", SearchOption.AllDirectories);
  127.  
  128.         foreach (string path in allPaths) {
  129.             string cleanedPath = path.Replace("\\", "/");
  130.             m_ConnectedAssetDatabase.Add((ConnectedAssetSO)AssetDatabase.LoadAssetAtPath(cleanedPath, typeof(ConnectedAssetSO)));
  131.         }
  132.     }
  133.     /// <summary>
  134.     /// Create the list view based on the asset data
  135.     /// </summary>
  136.     private void GenerateListView() {
  137.         //Defining what each item will visually look like. In this case, the makeItem function is creating a clone of the ItemRowTemplate.
  138.         Func<VisualElement> makeItem = () => m_ConnectedAssetRowTemplate.CloneTree();
  139.  
  140.         //Define the binding of each individual Item that is created. Specifically,
  141.         //it binds the Icon visual element to the scriptable object’s Icon property and the
  142.         //Name label to the FriendlyName property.
  143.         Action<VisualElement, int> bindItem = (e, i) => {
  144.             e.Q<TextField>("SOName").text = m_ConnectedAssetDatabase[i].SOName;
  145.         };
  146.  
  147.         //Create the listview and set various properties
  148.         m_ConnectedAssetListView = new ListView(m_ConnectedAssetDatabase, m_ItemHeight, makeItem, bindItem);
  149.         m_ConnectedAssetListView.selectionType = SelectionType.Single;
  150.         m_ConnectedAssetListView.style.height = m_ConnectedAssetDatabase.Count * m_ItemHeight + 5;
  151.         m_ConnectedAssetsTab.Add(m_ConnectedAssetListView);
  152.  
  153.         m_ConnectedAssetListView.onSelectionChange += ListView_onSelectionChange;
  154.         m_ConnectedAssetListView.SetSelection(0);
  155.     }
  156.     /// <summary>
  157.     /// Delete the active Item asset from the Asset/Data folder
  158.     /// </summary>
  159.     private void DeleteItem_OnClick() {
  160.         //Get the path of the fie and delete it through AssetDatabase
  161.         string path = AssetDatabase.GetAssetPath(m_activeItem);
  162.         AssetDatabase.DeleteAsset(path);
  163.  
  164.         //Purge the reference from the list and refresh the ListView
  165.         m_ConnectedAssetDatabase.Remove(m_activeItem);
  166.         m_ConnectedAssetListView.Refresh();
  167.  
  168.         //Nothing is selected, so hide the details section
  169.         m_DetailSection.style.visibility = Visibility.Hidden;
  170.  
  171.     }
  172.  
  173.     /// <summary>
  174.     /// Add a new Item asset to the Asset/Data folder
  175.     /// Crashed unity
  176.     /// </summary>
  177.     private void AddItem_OnClick() {
  178.         //Create an instance of the scriptable object
  179.         ConnectedAssetSO connectedAsset = CreateInstance<ConnectedAssetSO>();
  180.  
  181.         //Create the asset
  182.         AssetDatabase.CreateAsset(connectedAsset, $"Assets/Connected Assets/Created Connected Assets/{connectedAsset.iD}.asset");
  183.         //Add it to the item list
  184.         m_ConnectedAssetDatabase.Add(connectedAsset);
  185.         //Refresh the ListView so everything is redrawn again
  186.         m_ConnectedAssetListView.Refresh();
  187.         m_ConnectedAssetListView.style.height = m_ConnectedAssetDatabase.Count * m_ItemHeight + 5;
  188.  
  189.         m_ConnectedAssetListView.SetSelection(m_ConnectedAssetDatabase.Count - 1);
  190.     }
  191.     /// <summary>
  192.     ///
  193.     /// </summary>
  194.     /// <param name="selectedItems"></param>
  195.     private void ListView_onSelectionChange(IEnumerable<object> selectedItems) {
  196.         //Get the first item in the selectedItems list.
  197.         //There will only ever be one because SelectionType is set to Single
  198.         m_activeItem = (ConnectedAssetSO)selectedItems.First();
  199.  
  200.         //Create a new SerializedObject and bind the Details VE to it.
  201.         //This cascades the binding to the children
  202.         SerializedObject so = new SerializedObject(m_activeItem);
  203.         m_DetailSection.Bind(so);
  204.  
  205.         //Set the icon if it exists
  206.         //if (m_activeItem.Icon != null) {
  207.         //    m_LargeDisplayIcon.style.backgroundImage = m_activeItem.Icon.texture;
  208.         //}
  209.  
  210.         //Make sure the detail section is visible. This can turn off when you delete an item
  211.         m_DetailSection.style.visibility = Visibility.Visible;
  212.     }
  213.  
  214.     public void SaveScriptableObject(ConnectedAssetSO saveObj) {
  215.         // If for some reason there is no current object you are recording changes into
  216.         // then create a new instance to save your info into
  217.         if (saveObj == null) {
  218.             saveObj = ScriptableObject.CreateInstance<ConnectedAssetSO>();
  219.             AssetDatabase.CreateAsset(saveObj, $"Assets/YourSavePath/YourObject.asset");
  220.         }
  221.  
  222.         // Next Load it up with all your data, for example through some config function
  223.  
  224.  
  225.         // Now flag the object as "dirty" in the editor so it will be saved
  226.         EditorUtility.SetDirty(saveObj);
  227.  
  228.         // And finally, prompt the editor database to save dirty assets, committing your changes to disk.
  229.         AssetDatabase.SaveAssets();
  230.     }
  231.  
  232. }
  233. #endif
  234.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement