You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.0 KiB

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace qtools.qhierarchy
{
[ExecuteInEditMode]
[AddComponentMenu("")]
public class QObjectList: MonoBehaviour, ISerializationCallbackReceiver
{
public static List<QObjectList> instances = new List<QObjectList>();
public List<GameObject> lockedObjects = new List<GameObject>();
public List<GameObject> editModeVisibileObjects = new List<GameObject>();
public List<GameObject> editModeInvisibleObjects = new List<GameObject>();
public List<GameObject> wireframeHiddenObjects = new List<GameObject>();
public Dictionary<GameObject, Color> gameObjectColor = new Dictionary<GameObject, Color>();
public List<GameObject> gameObjectColorKeys = new List<GameObject>();
public List<Color> gameObjectColorValues = new List<Color>();
public void Awake()
{
checkIntegrity();
foreach (GameObject editModeGameObject in editModeVisibileObjects)
editModeGameObject.SetActive(!Application.isPlaying);
foreach (GameObject editModeGameObject in editModeInvisibleObjects)
editModeGameObject.SetActive(Application.isPlaying);
if (!Application.isEditor && Application.isPlaying)
{
instances.Remove(this);
DestroyImmediate(gameObject);
return;
}
instances.RemoveAll(item => item == null);
if (!instances.Contains(this)) instances.Add(this);
}
public void OnEnable()
{
if (!instances.Contains(this)) instances.Add(this);
#if UNITY_EDITOR
foreach (GameObject wireframeGameObject in wireframeHiddenObjects)
{
Renderer renderer = wireframeGameObject.GetComponent<Renderer>();
if (renderer != null)
{
#if UNITY_5_5_OR_NEWER
EditorUtility.SetSelectedRenderState(renderer, EditorSelectedRenderState.Hidden);
#else
EditorUtility.SetSelectedWireframeHidden(renderer, true);
#endif
}
}
#endif
}
public void OnDestroy()
{
if (!Application.isPlaying)
{
checkIntegrity();
foreach (GameObject gameObject in editModeVisibileObjects)
gameObject.SetActive(false);
foreach (GameObject gameObject in editModeInvisibleObjects)
gameObject.SetActive(true);
foreach (GameObject gameObject in lockedObjects)
gameObject.hideFlags &= ~HideFlags.NotEditable;
instances.Remove(this);
}
}
public void merge(QObjectList anotherInstance)
{
for (int i = anotherInstance.lockedObjects.Count - 1; i >= 0; i--)
{
if (!lockedObjects.Contains(anotherInstance.lockedObjects[i]))
lockedObjects.Add(anotherInstance.lockedObjects[i]);
}
for (int i = anotherInstance.editModeVisibileObjects.Count - 1; i >= 0; i--)
{
if (!editModeVisibileObjects.Contains(anotherInstance.editModeVisibileObjects[i]))
editModeVisibileObjects.Add(anotherInstance.editModeVisibileObjects[i]);
}
for (int i = anotherInstance.editModeInvisibleObjects.Count - 1; i >= 0; i--)
{
if (!editModeInvisibleObjects.Contains(anotherInstance.editModeInvisibleObjects[i]))
editModeInvisibleObjects.Add(anotherInstance.editModeInvisibleObjects[i]);
}
for (int i = anotherInstance.wireframeHiddenObjects.Count - 1; i >= 0; i--)
{
if (!wireframeHiddenObjects.Contains(anotherInstance.wireframeHiddenObjects[i]))
wireframeHiddenObjects.Add(anotherInstance.wireframeHiddenObjects[i]);
}
for (int i = anotherInstance.gameObjectColorKeys.Count - 1; i >= 0; i--)
{
if (!gameObjectColorKeys.Contains(anotherInstance.gameObjectColorKeys[i]))
{
gameObjectColorKeys.Add(anotherInstance.gameObjectColorKeys[i]);
gameObjectColorValues.Add(anotherInstance.gameObjectColorValues[i]);
gameObjectColor.Add(anotherInstance.gameObjectColorKeys[i], anotherInstance.gameObjectColorValues[i]);
}
}
}
public void checkIntegrity()
{
lockedObjects.RemoveAll(item => item == null);
editModeVisibileObjects.RemoveAll(item => item == null);
editModeInvisibleObjects.RemoveAll(item => item == null);
wireframeHiddenObjects.RemoveAll(item => item == null);
for (int i = gameObjectColorKeys.Count - 1; i >= 0; i--)
{
if (gameObjectColorKeys[i] == null)
{
gameObjectColorKeys.RemoveAt(i);
gameObjectColorValues.RemoveAt(i);
}
}
OnAfterDeserialize();
}
public void OnBeforeSerialize()
{
gameObjectColorKeys.Clear();
gameObjectColorValues.Clear();
foreach(KeyValuePair<GameObject, Color> pair in gameObjectColor)
{
gameObjectColorKeys.Add(pair.Key);
gameObjectColorValues.Add(pair.Value);
}
}
public void OnAfterDeserialize()
{
gameObjectColor.Clear();
for(int i = 0; i < gameObjectColorKeys.Count; i++)
gameObjectColor.Add(gameObjectColorKeys[i], gameObjectColorValues[i]);
}
}
}