【Unity3D / Extension】 扩展方法01 —— 扩展Transfrom

来源:互联网 发布:围攻龙刃堡 mac 编辑:程序博客网 时间:2024/05/15 13:17

C#提供了强大而又便利的扩展方法,是我们可以为C#原生、以及各种第三方库中的实例类型增加自定义的方法,这些类的实现,通常是无法看到也无法改变的,但是,通过扩展方法,我们可以为其增加一些极其便利的自定义行为。


MSDN上,对扩展方法的定义如下:

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。


Transform是Unity中最常用的组件之一,初学Unity时便会发现,当我们要修改物体位置的某一轴坐标时,很不方便,比如只修改X轴的位置一般需要这么写:

transform.position = new Vector3(x, transform.position.y, transform.position.z);

接下来看一下对位置修改进行扩展该怎么做:

public static void SetPositionX(this Transform transform, float x){transform.position = new Vector3(x, transform.position.y, transform.position.z);}public static void SetPositionY(this Transform transform, float y){transform.position = new Vector3(transform.position.x, y, transform.position.z);}public static void SetPositionZ(this Transform transform, float z){transform.position = new Vector3(transform.position.x, transform.position.y, z);}

新建一个静态类,然后添加以上静态方法即可。


实现以上扩展方法后,修改物体X轴的坐标,就可以写成这样:

transform.SetPositionX(x);

是不是简单了很多?这是扩展方法在Unity中最基本的运用之一。接下来我们看看,还可以对Transform做哪些扩展。

和修改位置一样,很容易就能实现修改旋转的扩展:

public static void SetEulerAnglesX(this Transform transform, float x){transform.eulerAngles = new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z);}public static void SetEulerAnglesY(this Transform transform, float y){transform.eulerAngles = new Vector3(transform.eulerAngles.x, y, transform.eulerAngles.z);}public static void SetEulerAnglesZ(this Transform transform, float z){transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, z);}

修改缩放也是一样的:

public static void SetLocalScaleX(this Transform transform, float x){transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);}public static void SetLocalScaleY(this Transform transform, float y){transform.localScale = new Vector3(transform.localScale.x, y, transform.localScale.z);}public static void SetLocalScaleZ(this Transform transform, float z){transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, z);}

以上方法,是基于世界坐标队伍体的修改,可以稍加修改实现模型坐标的位置、旋转扩展,这儿就不再贴出几乎完全重复的代码了。


以下再例举一些我常用的Transform扩展。


查找所有子节点中指定的节点:

public static Transform FindInAllChild(this Transform transform, string name){var list = transform.GetComponentsInChildren<Transform>();for (var i = 0; i < list.Length; i++){var t = list[i];if (t.gameObject.name == name){return t;}}return null;}

删除所有子节点:

public static void ClearChild(this Transform transform){for (var i = 0; i < transform.childCount; i++){var go = transform.GetChild(i).gameObject;Object.Destroy(go);}}

寻找父节点中的组件:

public static T FindComponentInParents<T>(this Transform transform) where T : Component {var component = transform.GetComponent<T>();if (component != null){return component;}return transform.parent != null ? FindComponentInParents<T>(transform.parent) : null;} 

获取组件,如果没有,则添加,这个很常用,可以省去一些逻辑判断代码。

public static T GetOrAddComponent<T>(this Transform transform) where T : Component{return transform.GetComponent<T>() ?? transform.gameObject.AddComponent<T>();}

重设Transform:

public static void ResetLocal(this Transform transform){transform.localPosition = Vector3.zero;transform.localRotation = Quaternion.identity;transform.localScale = Vector3.one;}


根据实际开发的需要,还可以实现很多很有用的扩展,接下来的文章中,我会再例举一些常用的和各种有意思的扩展方法。


阅读全文
1 0
原创粉丝点击