Files
2024-09-03 19:56:21 +08:00

152 lines
2.9 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace RuntimeInspectorNamespace
{
public class PseudoSceneSourceTransform : MonoBehaviour
{
#pragma warning disable 0649
[SerializeField]
private RuntimeHierarchy m_hierarchy;
public RuntimeHierarchy Hierarchy
{
get { return m_hierarchy; }
set
{
if( m_hierarchy != value )
{
RemoveChildrenFromScene();
m_hierarchy = value;
AddChildrenToScene();
}
}
}
[SerializeField]
private string m_sceneName;
public string SceneName
{
get { return m_sceneName; }
set
{
if( m_sceneName != value )
{
RemoveChildrenFromScene();
m_sceneName = value;
AddChildrenToScene();
}
}
}
[SerializeField]
private bool m_hideOnDisable = false;
public bool HideOnDisable
{
get { return m_hideOnDisable; }
set
{
if( m_hideOnDisable != value )
{
m_hideOnDisable = value;
if( !isEnabled )
{
if( value )
RemoveChildrenFromScene();
else
AddChildrenToScene();
}
}
}
}
#pragma warning restore 0649
private HashSet<Transform> childrenCurrent = new HashSet<Transform>();
private HashSet<Transform> childrenNew = new HashSet<Transform>();
private bool updateChildren = false;
private bool isEnabled = true;
private bool isQuitting = false;
private bool ShouldUpdateChildren { get { return ( isEnabled || !m_hideOnDisable ) && Hierarchy && !string.IsNullOrEmpty( m_sceneName ); } }
private void OnEnable()
{
isEnabled = true;
updateChildren = true;
}
private void OnDisable()
{
if( isQuitting )
return;
isEnabled = false;
if( m_hideOnDisable )
RemoveChildrenFromScene();
}
private void OnApplicationQuit()
{
isQuitting = true;
}
private void OnTransformChildrenChanged()
{
updateChildren = true;
}
private void Update()
{
if( updateChildren )
{
updateChildren = false;
if( !ShouldUpdateChildren )
return;
for( int i = 0; i < transform.childCount; i++ )
{
Transform child = transform.GetChild( i );
childrenNew.Add( child );
if( !childrenCurrent.Remove( child ) )
Hierarchy.AddToPseudoScene( m_sceneName, child );
}
RemoveChildrenFromScene();
HashSet<Transform> temp = childrenCurrent;
childrenCurrent = childrenNew;
childrenNew = temp;
}
}
private void AddChildrenToScene()
{
if( !ShouldUpdateChildren )
return;
for( int i = 0; i < transform.childCount; i++ )
{
Transform child = transform.GetChild( i );
if( childrenCurrent.Add( child ) )
Hierarchy.AddToPseudoScene( m_sceneName, child );
}
}
private void RemoveChildrenFromScene()
{
if( !Hierarchy || string.IsNullOrEmpty( m_sceneName ) )
return;
foreach( Transform removedChild in childrenCurrent )
{
if( removedChild )
Hierarchy.RemoveFromPseudoScene( m_sceneName, removedChild, true );
}
childrenCurrent.Clear();
}
}
}