159 lines
5.1 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|