unity-vendor-packages/vfolders2/vHierarchy/VHierarchyDataComponent.cs

142 lines
3.8 KiB
C#
Raw Normal View History

2025-08-19 10:13:59 +08:00
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.ShortcutManagement;
using System.Reflection;
using System.Linq;
using UnityEngine.UIElements;
using UnityEngine.SceneManagement;
using UnityEditor.SceneManagement;
using UnityEditor.Experimental.SceneManagement;
using Type = System.Type;
using static VHierarchy.VHierarchyData;
using static VHierarchy.Libs.VUtils;
using static VHierarchy.Libs.VGUI;
// using static VTools.VDebug;
namespace VHierarchy
{
[ExecuteInEditMode]
public abstract class VHierarchyDataComponent : MonoBehaviour, ISerializationCallbackReceiver
{
public void Awake()
{
void register()
{
VHierarchy.dataComponents_byScene[gameObject.scene] = this;
}
void handleSceneDuplication()
{
if (sceneData == null) return;
if (!sceneData.goDatas_byGlobalId.Any()) return;
var curSceneGuid = gameObject.scene.path.ToGuid();
var dataSceneGuid = sceneData.goDatas_byGlobalId.Keys.First().guid;
if (curSceneGuid == dataSceneGuid) return;
var newDic = new SerializableDictionary<GlobalID, GameObjectData>();
foreach (var kvp in sceneData.goDatas_byGlobalId)
newDic[new GlobalID(kvp.Key.ToString().Replace(dataSceneGuid, curSceneGuid))] = kvp.Value;
sceneData.goDatas_byGlobalId = newDic;
EditorSceneManager.MarkSceneDirty(gameObject.scene);
EditorSceneManager.SaveScene(gameObject.scene);
}
register();
handleSceneDuplication();
}
public SceneData sceneData;
public void OnBeforeSerialize() => VHierarchy.goDataCache.Clear();
public void OnAfterDeserialize() => VHierarchy.goDataCache.Clear();
[CustomEditor(typeof(VHierarchyDataComponent), true)]
class Editor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
var style = new GUIStyle(EditorStyles.label) { wordWrap = true };
void teamModeOn()
{
if (!VHierarchyData.teamModeEnabled) return;
SetGUIEnabled(false);
BeginIndent(0);
Space(4);
EditorGUILayout.LabelField("This component stores vHierarchy's data about which icons and colors are assigned to objects in this scene", style);
// Space(6);
// EditorGUILayout.LabelField("You can disable Team Mode to store icon/color data in vHierarchy Data scriptable object, as it is done by default", style);
Space(2);
EndIndent(10);
ResetGUIEnabled();
// Space(10);
// if (!GUILayout.Button("Disable Team Mode", GUILayout.Height(27))) return;
// VHierarchy.data?.DisableTeamMode();
}
void teamModeOff()
{
if (VHierarchyData.teamModeEnabled) return;
SetGUIEnabled(false);
BeginIndent(0);
Space(4);
EditorGUILayout.LabelField("Enable Team Mode to store icon/color data for this scene in this component", style);
Space(2);
EndIndent(10);
ResetGUIEnabled();
Space(4);
if (!GUILayout.Button("Enable Team Mode", GUILayout.Height(27))) return;
VHierarchy.data?.EnableTeamMode();
}
teamModeOn();
teamModeOff();
}
}
}
}
#endif