标签: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;第二个扩展方法带有返回值,随时可以终止遍历,典型的使用场景是:搜索特定的子物体并返回它的引用。
待更新......
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/whitecat/p/4139032.html