码迷,mamicode.com
首页 > 编程语言 > 详细

扩展 Unity 内置类型 (组件)

时间:2014-12-03 07:03:12      阅读:672      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

Unity 内置组件基本没有可以继承的。某些比较常用但现有 API 没有定义的功能,我们可以通过 C# 的扩展类方法来实现。下面是一些比较实用的扩展方法。

 

扩展 Transform

每一个 GameObject 都含有一个 Transform 组件(在 UGUI 里新引入的 RectTransform 继承 Transform),GameObject 的层级也是由 Transform 负责的。以下扩展方法使用了 C# 的委托,关于委托可以参考这里:C# 中的 delegate 和 event

/// <summary>
/// (深度优先)遍历 Transform 层级, 对每一个访问的节点执行一个自定义的操作
/// </summary>
/// <param name="root">遍历开始的根部 Transform 对象</param>
/// <param name="operate">遍历到每一个节点时将调用此方法; 参数1: 当前访问的对象; 参数2: 包括本层次在内的剩余深度限制</param>
/// <param name="depthLimit">遍历深度限制, 负值表示不限制, 0 表示只访问 root 本身而不访问其子级, 正值表示最多访问的子级层数</param>
public static void TraverseHierarchy(this Transform root, Action<Transform, int> operate, int depthLimit = -1)
{
    if (operate != null)
    {
        operate(root, depthLimit);
        if (depthLimit == 0) return;

        for (int i = root.childCount - 1; i >= 0; i--)
        {
            TraverseHierarchy(root.GetChild(i), operate, depthLimit - 1);
        }
    }
}


/// <summary>
/// (深度优先)遍历 Transform 层级, 对每一个访问的节点执行一个自定义的操作, 如果此操作返回一个非空引用将终止遍历过程, 并且此返回值最终作为遍历方法的返回值
/// </summary>
/// <param name="root">遍历开始的根部 Transform 对象</param>
/// <param name="operate">遍历到每一个节点时将调用此方法; 参数1: 当前访问的对象; 参数2: 包括本层次在内的剩余深度限制; 返回值: null 表示继续遍历, 非空引用将终止遍历过程, 并且此返回值最终作为遍历方法的返回值</param>
/// <param name="depthLimit">遍历深度限制, 负值表示不限制, 0 表示只访问 root 本身而不访问其子级, 正值表示最多访问的子级层数</param>
/// <returns>第一次 operate 返回的非空引用或 null</returns>
public static object TraverseHierarchy(this Transform root, Func<Transform, int, object> operate, int depthLimit = -1)
{
    if (operate != null)
    {
        object obj = operate(root, depthLimit);
        if (obj != null || depthLimit == 0) return obj;

        for (int i = root.childCount - 1; i >= 0; i--)
        {
            obj = TraverseHierarchy(root.GetChild(i), operate, depthLimit - 1);
            if (obj != null) return obj;
        }
    }
    return null;
}

这两个扩展方法都使用了递归实现,都可以遍历所有的子物体。第一个扩展方法典型使用场景是:更改所有子物体的 Layer;第二个扩展方法带有返回值,随时可以终止遍历,典型的使用场景是:搜索特定的子物体并返回它的引用。

 

待更新......

扩展 Unity 内置类型 (组件)

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/whitecat/p/4139032.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!