【unity框架开发13】unity静态扩展 this 关键字,实现类似DOTween / LINQ的链式写法

server/2024/10/23 21:34:04/

文章目录

  • 前言
  • 一、如何实现静态 this 扩展
  • 二、应⽤静态 this 扩展到框架中
    • GameObject扩展⽅法
    • TransformExtension扩展方法
  • 完结

前言

⼤家应该都接触过 DOTween / LINQ 等等概念了吧?其中的链式写法真的是很惊艳。

比如:

transform.DOMove().SetEase().OnComplete();

这种方式在写的过程中体验是⾮常友好的。那么它的原理是什么呢?

答案是静态扩展 this 关键字。

一、如何实现静态 this 扩展

静态 this 扩展,仅仅是 C# 的⼀种语法关键字。要实现其实⾮常简单,我们直接看代码就能明⽩。

代码如下:

public static class Test
{//调用static void MenuClicked(){new object().Log();"string".Log();}//静态 this 扩展static void Log(this object data){Debug.Log(data);}
}

先看下 我们的 Log⽅法,Log的第⼀个参数是 object 类型的,但是前边有个 this 关键字,有了这个this 关键字,我们的 object 对象就可以像调⽤⾃⼰的⽅法⼀样调⽤ Test ⽅法

也就是说,我们可以扩展已有的类,⽽不⽤去修改已有类内部的源码。这简直⽐ partial 还厉害。这就是 C# 语法的强⼤之处。

这⾥注意⼀下,实现静态 this 扩展⽅法的类,必须是静态类

二、应⽤静态 this 扩展到框架中

我们了解了静态 this 扩展之后,⾸先我们要思考⼀下它⽤在哪⾥⽐较合适呢?

静态 this 扩展,本质上其实还是静态⽅法,这些⽅法都是独⽴的,并不需要借助对象才可以调⽤的。

GameObject扩展⽅法

只需要把类变为静态的,并在每个⽅法的第⼀个参数上加上 this 关键字,增加后的代码如下:

/// <summary>
/// GameObject扩展⽅法
/// </summary>
public static partial class GameObjectExtension
{public static void Show(this GameObject gameObj){gameObj.SetActive(true);}public static void Hide(this GameObject gameObj){gameObj.SetActive(false);}public static void Show(this Transform transform){transform.gameObject.SetActive(true);}public static void Hide(this Transform transform){transform.gameObject.SetActive(false);}public static void Show(this MonoBehaviour monoBehaviour){monoBehaviour.gameObject.SetActive(true);}public static void Hide(this MonoBehaviour monoBehaviour){monoBehaviour.gameObject.SetActive(false);}
}

测试调用

# 按gameObject隐藏对象
gameObject.Hide();# 按gameObject显示对象
gameObject.Show();# 按transform隐藏对象
transform.Hide();# 按transform显示对象
transform.Show();# 按MonoBehaviour隐藏对象
this.Hide();# 按MonoBehaviour显示对象
this.Show();

TransformExtension扩展方法

/// <summary>
/// Transform扩展⽅法
/// </summary>
public static partial class TransformExtension
{#region 重置操作public static void Identity(this MonoBehaviour monoBehaviour){monoBehaviour.transform.Identity();}public static void Identity(this Transform trans){trans.localPosition = Vector3.zero;trans.localScale = Vector3.one;trans.localRotation = Quaternion.identity;}public static void Identity(this GameObject gameObject){gameObject.transform.localPosition = Vector3.zero;gameObject.transform.localScale = Vector3.one;gameObject.transform.localRotation = Quaternion.identity;}#endregion#region 快捷设置localPosition的值public static void SetLocalPosX(this Transform transform, float x){var localPos = transform.localPosition;localPos.x = x;transform.localPosition = localPos;}public static void SetLocalPosY(this Transform transform, float y){var localPos = transform.localPosition;localPos.y = y;transform.localPosition = localPos;}public static void SetLocalPosZ(this Transform transform, float z){var localPos = transform.localPosition;localPos.z = z;transform.localPosition = localPos;}public static void SetLocalPosXY(this Transform transform, float x, float y){var localPos = transform.localPosition;localPos.x = x;localPos.y = y;transform.localPosition = localPos;}public static void SetLocalPosXZ(this Transform transform, float x, float z){var localPos = transform.localPosition;localPos.x = x;localPos.z = z;transform.localPosition = localPos;}public static void SetLocalPosYZ(this Transform transform, float y, float z){var localPos = transform.localPosition;localPos.y = y;localPos.z = z;transform.localPosition = localPos;}#endregion
}

调用

# 按MonoBehaviour重置操作
this.Identity();# 按transform重置操作
transform.Identity();# 按gameObject重置操作
gameObject.Identity();# 快捷设置localPosition的x值
transform.SetLocalPosX(1);# 快捷设置localPosition的y值
transform.SetLocalPosY(1);# 快捷设置localPosition的z值
transform.SetLocalPosZ(1);# 快捷设置localPosition的xy值
transform.SetLocalPosXY(1, 2);# 快捷设置localPosition的yz值
transform.SetLocalPosYZ(1, 2);# 快捷设置localPosition的yz值
transform.SetLocalPosYZ(1, 2);

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.ppmy.cn/server/134260.html

相关文章

Docker搭建Cisco AnyConnect 教程

本章教程搭建一个Cisco AnyConnect 连接教程。 一、下载文件 因为是基于Docker方式进行搭建的,所以需要提前安装好Docker,本章不介绍如何安装Docker,可以自行百度解决。 通过网盘分享的文件:ocserv-docker 链接: https://pan.baidu.com/s/14-2p9jenqE0KWzMilVzV-A?pwd=4yd…

Go语言基础(一)

Go 是一门编译型语言&#xff0c;Go 语言的工具链将源代码及其依赖转换成计算机的机器指令&#xff08;译注&#xff1a;静态编译&#xff09;。Go 语言提供的工具都通过一个单独的命令 go 调用&#xff0c;go 命令有一系列子命令。最简单的一个子命令就是 run。这个命令编译…

ansible————task控制

一、loop循环 当某一个操作需要多次执行的时候&#xff0c;就需要用到循环 1、循环语句 安装多个安装包&#xff0c;启动多个应用 [rootcontrol ansible_manage]# cat play_book/loop.yaml --- - name: loop exercisehosts: manage1vars_files:- var/loop_var.yamltasks:-…

K8S---02.Kubernetes的pod

1 命名空间操作 命名空间的作用是为了 隔离资源 理解成对资源进行分类。 名称&#xff1a;namespace 简写&#xff1a;ns 默认命名空间为“default” 1.1 创建命名空间 kubectl create ns 命名空间名称 kubectl create ns my-ns 、 1.2 查看命名空间 kubectl get names…

【Python数据可视化】利用Matplotlib绘制美丽图表!

【Python数据可视化】利用Matplotlib绘制美丽图表&#xff01; 数据可视化是数据分析过程中的重要步骤&#xff0c;它能直观地展示数据的趋势、分布和相关性&#xff0c;帮助我们做出明智的决策。在 Python 中&#xff0c;Matplotlib 是最常用的可视化库之一&#xff0c;它功能…

【Android】图片点击放大放小

&#x1f4d6;Android图片点击放大放小 ✅1.触摸缩放✅2.缩放移动中心 ✅1.触摸缩放 通过触摸事件获取触摸的坐标&#xff0c;并将其通过动画放大缩小即可实现&#xff1a; 这里的holder.photo_id换成图片组件即可。 private boolean isScalefalse;holder.photo_id.setOnTouch…

10.23学习日志

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Figure&#xff1a;指整个图形&#xff0c;您可以把它理解成一张画布&…

《深度学习》OpenCV LBPH算法人脸识别 原理及案例解析

目录 一、LBPH算法 1、概念 2、实现步骤 3、方法 1&#xff09;步骤1 • 缩放 • 旋转和平移 2&#xff09;步骤2 二、案例实现 1、完整代码 1&#xff09;图像内容&#xff1a; 2&#xff09;运行结果&#xff1a; 一、LBPH算法 1、概念 在OpenCV中&#xff0c;L…