Files
Fishing2/Assets/Plugins/vInspector/VInspectorData.cs
2025-05-10 12:49:47 +08:00

185 lines
4.4 KiB
C#

#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEditor;
using UnityEditor.ShortcutManagement;
using System.Reflection;
using System.Linq;
using UnityEngine.UIElements;
using UnityEngine.SceneManagement;
using UnityEditor.SceneManagement;
using Type = System.Type;
using static VInspector.VInspectorState;
using static VInspector.Libs.VUtils;
using static VInspector.Libs.VGUI;
namespace VInspector
{
public class VInspectorData : ScriptableObject, ISerializationCallbackReceiver
{
public List<Item> items = new();
[System.Serializable]
public class Item
{
public GlobalID globalId;
public Type type => Type.GetType(_typeString) ?? typeof(DefaultAsset);
public string _typeString;
public Object obj
{
get
{
if (_obj == null && !isSceneGameObject)
_obj = globalId.GetObject();
return _obj;
// updating scene objects here using globalId.GetObject() could cause performance issues on large scenes
// so instead they are batch updated in VInspector.UpdateBookmarkedObjectsForScene()
}
}
public Object _obj;
public bool isSceneGameObject;
public bool isAsset;
public bool isLoadable => obj != null;
public bool isDeleted
{
get
{
if (!isSceneGameObject)
return !isLoadable;
if (isLoadable)
return false;
if (!AssetDatabase.LoadAssetAtPath<SceneAsset>(globalId.guid.ToPath()))
return true;
for (int i = 0; i < EditorSceneManager.sceneCount; i++)
if (EditorSceneManager.GetSceneAt(i).path == globalId.guid.ToPath())
return true;
return false;
}
}
public string assetPath => globalId.guid.ToPath();
public Item(Object o)
{
globalId = o.GetGlobalID();
id = Random.value.GetHashCode();
isSceneGameObject = o is GameObject go && go.scene.rootCount != 0;
isAsset = !isSceneGameObject;
_typeString = o.GetType().AssemblyQualifiedName;
_name = o.name;
_obj = o;
}
public float width => VInspectorNavbar.expandedItemWidth;
public string name
{
get
{
if (!isLoadable) return _name;
if (assetPath.GetExtension() == ".cs")
_name = obj.name.Decamelcase();
else
_name = obj.name;
return _name;
}
}
public string _name { get => state._name; set => state._name = value; }
public string sceneGameObjectIconName { get => state.sceneGameObjectIconName; set => state.sceneGameObjectIconName = value; }
public ItemState state
{
get
{
if (!VInspectorState.instance.itemStates_byItemId.ContainsKey(id))
VInspectorState.instance.itemStates_byItemId[id] = new ItemState();
return VInspectorState.instance.itemStates_byItemId[id];
}
}
public int id;
}
public void OnAfterDeserialize() => VInspectorNavbar.repaintNeededAfterUndoRedo = true;
public void OnBeforeSerialize() { }
[CustomEditor(typeof(VInspectorData))]
class Editor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
var style = EditorStyles.label;
style.wordWrap = true;
SetGUIEnabled(false);
BeginIndent(0);
Space(10);
EditorGUILayout.LabelField("This file stores bookmarks from vInspector's navigation bar", style);
EndIndent(10);
ResetGUIEnabled();
// Space(15);
// base.OnInspectorGUI();
}
}
}
}
#endif