AlicizaX/Client/Packages/com.alicizax.uxtool/Editor/UXGUI/Utils/UXSelectionUtil.cs

91 lines
3.0 KiB
C#
Raw Normal View History

2025-12-01 16:46:28 +08:00
using System;
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
namespace Aliciza.UXTool
{
public static class UXSelectionUtil
{
public static void AddSelectionChangedEvent(Action e)
{
Selection.selectionChanged += e;
}
public static void RemoveSelectionChangedEvent(Action e)
{
Selection.selectionChanged -= e;
}
// 存储选中物体的缓存列表
private static List<GameObject> gameObjectsCache = new List<GameObject>();
/// <summary>
/// 获取当前选中的所有物体排除包含StageEngine脚本的物体
/// </summary>
public static GameObject[] gameObjects
{
get
{
gameObjectsCache.Clear(); // 清空缓存
GameObject[] selectedObjects = Selection.gameObjects;
foreach (var obj in selectedObjects)
{
if (obj.GetComponent<StageEngine>() == null &&obj != PrefabStageUtils.StageRoot.gameObject) // 排除StageEngine脚本的物体
{
gameObjectsCache.Add(obj);
}
}
return gameObjectsCache.ToArray();
}
set => Selection.objects = value;
}
/// <summary>
/// 获取当前选中的第一个物体排除包含StageEngine脚本的物体
/// </summary>
public static GameObject activeGameObject
{
get
{
var selectedObjects = gameObjects;
return selectedObjects.Length > 0 ? selectedObjects[0] : null;
}
set { Selection.activeGameObject = value; }
}
/// <summary>
/// 获取当前选中的所有物体排除StageEngine脚本的物体并清除掉包含StageEngine脚本的物体。
/// </summary>
private static void ClearStageEngineSelection()
{
GameObject[] selectedObjects = Selection.gameObjects;
List<GameObject> validSelections = new List<GameObject>();
// 遍历选中的物体排除包含StageEngine脚本的物体
foreach (var obj in selectedObjects)
{
if (obj.GetComponent<StageEngine>() == null) // 如果没有StageEngine脚本则保留
{
validSelections.Add(obj);
}
}
// 清除所有选中物体
Selection.objects = validSelections.ToArray();
}
/// <summary>
/// 获取当前选中的物体并清除选中列表中包含StageEngine脚本的物体。
/// </summary>
public static GameObject[] clearedGameObjects
{
get
{
ClearStageEngineSelection(); // 清理包含 StageEngine 脚本的物体
return gameObjects; // 返回已经清理过的选中物体
}
}
}
}