标签:unity unity3d unity3d培训 unity3d极致学院 unity3d游戏开发
/// 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, ActionTransform, 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, FuncTransform, 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;
}
/// summary
/// 延时调用指定的方法
/// /summary
/// param name="monoBehaviour"协程附着的脚本对象/param
/// param name="seconds"延迟的秒数/param
/// param name="method"延时结束调用的方法/param
public static void Invoke(this MonoBehaviour monoBehaviour, float seconds, Action method)
{
if (method != null)
{
monoBehaviour.StartCoroutine(DelayCall(seconds, method));
}
}
private static IEnumerator DelayCall(float seconds, Action method)
{
yield return new WaitForSeconds(seconds);
method();
}
如果你需要等待 UI 动画完成后再打开输入,以后或许可以用这个了。
扩展 Camera
如果你正在做 2D 游戏,可能需要清楚的了解你的Sprite 和屏幕的大小关系。下面这两个扩展可以方便的获得像素和世界单位之间互相转换的系数。
/// summary
/// 计算正交相机屏幕上,每像素的世界单位(单位:米)大小
/// /summary
/// param name="camera"正交相机对象/param
/// returns每像素的世界单位大小/returns
public static float UnitsPerPixel(this Camera camera)
{
return camera.orthographicSize * 2 / Screen.height;
}
/// summary
/// 计算正交相机屏幕上,每世界单位(单位:米)的像素大小
/// /summary
/// param name="camera"正交相机对象/param
/// returns每世界单位的像素大小/returns
public static float PixelsPerUnit(this Camera camera)
{
return Screen.height * 0.5f / camera.orthographicSize;
}
/// summary
/// 反射扩展
/// /summary
public static class ReflectionExtension
{
public static object GetPrivateField(this object instance, string fieldName)
{
return instance.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(instance);
}
public static object GetPrivateProperty(this object instance, string propertyName)
{
return instance.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(instance, null);
}
public static void SetPrivateField(this object instance, string fieldName, object value)
{
instance.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(instance, value);
}
public static void SetPrivateProperty(this object instance, string propertyName, object value)
{
instance.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(instance, value, null);
}
public static object InvokePrivateMethod(this object instance, string methodName, params object[]
param)
{
return instance.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).Invoke(instance, param);
}
}
标签:unity unity3d unity3d培训 unity3d极致学院 unity3d游戏开发
原文地址:http://blog.csdn.net/sauwque/article/details/44514229