首页 > 代码库 > 扩展 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 内置类型 (组件)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。