135 lines
3.8 KiB
C#
135 lines
3.8 KiB
C#
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.Profiling;
|
|
|
|
namespace WeChatWASM.Analysis
|
|
{
|
|
internal class SerializedPropertyDataStore
|
|
{
|
|
private Data[] m_elements;
|
|
|
|
private readonly GatherDelegate m_gatherDel;
|
|
|
|
private Object[] m_objects;
|
|
|
|
private readonly string[] m_propNames;
|
|
|
|
public SerializedPropertyDataStore(string[] propNames, GatherDelegate gatherDel)
|
|
{
|
|
m_propNames = propNames;
|
|
m_gatherDel = gatherDel;
|
|
Repopulate();
|
|
}
|
|
|
|
public Data[] GetElements()
|
|
{
|
|
return m_elements;
|
|
}
|
|
|
|
~SerializedPropertyDataStore()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
public bool Repopulate()
|
|
{
|
|
Profiler.BeginSample("SerializedPropertyDataStore.Repopulate.GatherDelegate");
|
|
var array = m_gatherDel();
|
|
Profiler.EndSample();
|
|
if (m_objects != null)
|
|
{
|
|
if (array.Length == m_objects.Length &&
|
|
ArrayUtility.ArrayReferenceEquals(array, m_objects))
|
|
{
|
|
return false;
|
|
}
|
|
Clear();
|
|
}
|
|
m_objects = array;
|
|
m_elements = new Data[array.Length];
|
|
for (var i = 0; i < array.Length; i++)
|
|
m_elements[i] = new Data(array[i], m_propNames);
|
|
return true;
|
|
}
|
|
|
|
private void Clear()
|
|
{
|
|
foreach (var t in m_elements)
|
|
t.Dispose();
|
|
m_objects = null;
|
|
m_elements = null;
|
|
}
|
|
|
|
internal class Data
|
|
{
|
|
private Object m_object;
|
|
|
|
public Data(Object obj, IList<string> props)
|
|
{
|
|
m_object = obj;
|
|
SerializedObject = new SerializedObject(obj);
|
|
Properties = new SerializedProperty[props.Count];
|
|
for (var i = 0; i < props.Count; i++)
|
|
Properties[i] = SerializedObject.FindProperty(props[i]);
|
|
}
|
|
|
|
public string Name
|
|
{
|
|
get { return !(m_object != null) ? string.Empty : m_object.name; }
|
|
}
|
|
|
|
public SerializedObject SerializedObject { get; private set; }
|
|
|
|
public SerializedProperty[] Properties { get; private set; }
|
|
|
|
public int ObjectId
|
|
{
|
|
get
|
|
{
|
|
int result;
|
|
if (!m_object)
|
|
{
|
|
result = 0;
|
|
}
|
|
else
|
|
{
|
|
var component = m_object as Component;
|
|
result = !(component != null)
|
|
? m_object.GetInstanceID()
|
|
: component.gameObject.GetInstanceID();
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
var serializedProperties = Properties;
|
|
for (var i = 0; i < serializedProperties.Length; i++)
|
|
{
|
|
var serializedProperty = serializedProperties[i];
|
|
if (serializedProperty != null)
|
|
serializedProperty.Dispose();
|
|
}
|
|
SerializedObject.Dispose();
|
|
m_object = null;
|
|
SerializedObject = null;
|
|
Properties = null;
|
|
}
|
|
|
|
public bool Update()
|
|
{
|
|
return m_object != null && SerializedObject.UpdateIfRequiredOrScript();
|
|
}
|
|
|
|
public void Store()
|
|
{
|
|
if (m_object != null)
|
|
SerializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
|
|
internal delegate Object[] GatherDelegate();
|
|
}
|
|
} |