【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
- 【Unity3D / Extension】 扩展方法01 —— 扩展Transfrom
- Unity3d的C#扩展方法Extension methods应用吧
- Extension Methods(扩展方法)
- C#基础 -- Extension 扩展方法
- 什么是扩展方法 (Extension Methods)?
- C# 扩展方法Extension Method
- Objective-C——扩展(Extension)详解
- Unity3D-C#扩展方法
- 扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 逆向工程核心原理学习笔记(九):小端序标记法2
- Java8中的日期时间
- 为什么有些语言可以被反编译?而有的不能?
- linux下C获取文件大小的方法
- 逆向工程核心原理学习笔记(十):IA-32寄存器基本讲解
- 【Unity3D / Extension】 扩展方法01 —— 扩展Transfrom
- Nexus 9安装Android App出现INSTALL_FAILED_NO_MATCHING_ABIS错误的一种解决方案
- 关于tomcat性能参数详解
- 求一个数组中的任何一个元素的索引
- &0xFF 的意义
- 为RecyclerView添加item的点击事件
- Java时间字符串与日期的转换
- Eclipse添加Spket插件实现ExtJs智能提示
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式