Files
2026-09-21 12:15:57 +03:00

65 lines
2.1 KiB
C#

using System.Linq;
using Alchemy.Hierarchy;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Alchemy.Editor
{
public sealed class HierarchyObjectProcessor : IProcessSceneWithReport
{
public int callbackOrder => 0;
public void OnProcessScene(Scene scene, BuildReport report)
{
var settings = AlchemySettings.GetOrCreateSettings();
var hierarchyObjects = scene.GetRootGameObjects()
.SelectMany(x => x.GetComponentsInChildren<HierarchyObject>())
.Where(x => x != null)
.OrderByDescending(x => GetDepth(x.transform));
foreach (var obj in hierarchyObjects)
{
if (obj == null) continue;
switch (GetHierarchyObjectMode(obj))
{
case HierarchyObjectMode.None:
break;
case HierarchyObjectMode.RemoveInPlayMode:
obj.transform.DetachChildren();
Object.DestroyImmediate(obj.gameObject);
break;
case HierarchyObjectMode.RemoveInBuild:
if (EditorApplication.isPlaying) break;
obj.transform.DetachChildren();
Object.DestroyImmediate(obj.gameObject);
break;
}
}
}
static HierarchyObjectMode GetHierarchyObjectMode(HierarchyObject obj)
{
return obj.HierarchyObjectMode != HierarchyObject.Mode.UseSettings
? (HierarchyObjectMode)(obj.HierarchyObjectMode - 1)
: AlchemySettings.GetOrCreateSettings().HierarchyObjectMode;
}
static int GetDepth(Transform transform)
{
var depth = 0;
var parent = transform.parent;
while (parent != null)
{
depth++;
parent = parent.parent;
}
return depth;
}
}
}