首页 > 代码库 > 扩展 Unity 内置类型 (组件)

扩展 Unity 内置类型 (组件)

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 内置类型 (组件)