Files
2025-01-25 04:38:09 +08:00

159 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace Thousandto.Core.Base
{
/// <summary>
/// 对所有的树形子对象进行处理,这里使用的是非递归方式.
/// 使用了一个缓存
/// </summary>
[ExecuteInEditMode]
public class UnityHierarchyUtils
{
/// <summary>
/// 用于防止递归的临时存储器
/// </summary>
private static QuickList<Transform> _searchStack = new QuickList<Transform>();
/// <summary>
/// 对的所有子Transform进行处理
/// </summary>
/// <param name="current"></param>
/// <param name="walker"></param>
public static void WalkHierarchy( Transform current, MyFunc<Transform, bool> walker )
{
try {
_searchStack.Add( current );
while ( _searchStack.Count > 0 ) {
var cur = _searchStack.Pop();
if ( walker( cur ) == false ) {
continue;
}
for ( int i = 0; i < cur.childCount; ++i ) {
_searchStack.Add( cur.GetChild( i ) );
}
}
} finally {
_searchStack.Clear();
}
}
/// <summary>
/// 在所有子对象的层次中,检索名字
/// </summary>
/// <param name="current"></param>
/// <param name="name"></param>
/// <param name="ignoreCase"></param>
/// <returns></returns>
///
public static Transform SearchHierarchy( Transform current, string name, bool ignoreCase = false )
{
try {
_searchStack.Add( current );
StringComparison cmp = ignoreCase ? StringComparison.CurrentCultureIgnoreCase :
StringComparison.CurrentCulture;
while ( _searchStack.Count > 0 ) {
var cur = _searchStack.Pop();
if ( cur == null ) {
continue;
}
if ( cur.name.Equals( name, cmp ) ) {
return cur;
}
for ( int i = 0; i < cur.childCount; ++i ) {
_searchStack.Add( cur.GetChild( i ) );
}
}
} finally {
_searchStack.Clear();
}
return null;
}
//强制使用大小写
public static Transform SearchHierarchyForceCase(Transform current, string name)
{
try
{
if (current.name == name) return current;
_searchStack.Add(current);
while (_searchStack.Count > 0)
{
var cur = _searchStack.Pop();
if (cur == null)
{
continue;
}
var ret = cur.Find(name);
if (ret != null)
{
return ret;
}
for (int i = 0; i < cur.childCount; ++i)
{
cur = cur.GetChild(i);
if (cur.childCount > 0)
{
_searchStack.Add(cur);
}
}
}
}
finally
{
_searchStack.Clear();
}
return null;
}
/// <summary>
/// 在所有子对象的层次中,检索名字
/// </summary>
/// <param name="current"></param>
/// <param name="name"></param>
/// <param name="ignoreCase"></param>
/// <returns></returns>
public static Transform SearchHierarchyWithTag(Transform current, string name, bool ignoreCase = false,string tag = null)
{
try
{
var findTag = !string.IsNullOrEmpty(tag);
_searchStack.Add(current);
StringComparison cmp = ignoreCase ? StringComparison.CurrentCultureIgnoreCase :
StringComparison.CurrentCulture;
while (_searchStack.Count > 0)
{
var cur = _searchStack.Pop();
if (cur == null)
{
continue;
}
if (!findTag || (findTag && cur.CompareTag(tag)))
{
if (cur.name.Equals(name, cmp))
{
return cur;
}
}
for (int i = 0; i < cur.childCount; ++i)
{
_searchStack.Add(cur.GetChild(i));
}
}
}
finally
{
_searchStack.Clear();
}
return null;
}
}
}