Unity添加自定义拓展方法
通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困苦不堪。不过。。C# 提供了一种巧妙的方式来让你扩充已有的类,也就是我们今天要讲的扩展方法。
扩展方法由于很方便而被经常使用到,我们更愿意叫他语法糖豆(syntactic sugar),一个实用样例是Unity的Transform类,比如:你只想设置Transform.position中Vector3的x轴,而其它两个轴保持不变。
|
1
2
3
4
5
6
7
8
9
10
11
|
using UnityEngine;using System.Collections; public class Player : MonoBehaviour { void Update () { //Set new x position to 5 transform.position = new Vector3(5f, transform.position.y, transform.position.z); }} |
在这个样例中,如果你只设置Transform.position的x轴变量,编译会报错,所以你不得不把其余的y轴和z轴加上组成一个完整的Vector3。于是一个拓展方法比如SetPositionX() 就可以添加到Transform类中,从而让代码的可读性更好。
为了创建拓展方法,你需要创建一个静态类。此外,一个拓展方法的声明前缀也必须加上静态修饰符static,同时该方法的第一个参数为所操作的类型,且必须以this关键字修饰。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
using UnityEngine;using System.Collections; //Must be in a static class public static class Extensions{ //Function must be static //First parameter has "this" in front of type public static void SetPositionX(this Transform t, float newX) { t.position = new Vector3(newX, t.position.y, t.position.z); }} |
现在你可以在其它脚本里用这个新的拓展方法替换掉旧的代码。
|
1
2
3
4
5
6
7
8
9
10
11
|
using UnityEngine; using System.Collections; public class Player : MonoBehaviour { void Update () { //Set new x position to 5 transform.SetPositionX(5f); } } |
这里有一些样例代码来帮你更好理解拓展方法,以作参考。
拓展:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
using UnityEngine; using System.Collections; public static class Extensions { public static void SetPositionX(this Transform t, float newX) { t.position = new Vector3(newX, t.position.y, t.position.z); } public static void SetPositionY(this Transform t, float newY) { t.position = new Vector3(t.position.x, newY, t.position.z); } public static void SetPositionZ(this Transform t, float newZ) { t.position = new Vector3(t.position.x, t.position.y, newZ); } public static float GetPositionX(this Transform t) { return t.position.x; } public static float GetPositionY(this Transform t) { return t.position.y; } public static float GetPositionZ(this Transform t) { return t.position.z; } public static bool HasRigidbody(this GameObject gobj) { return (gobj.rigidbody != null); } public static bool HasAnimation(this GameObject gobj) { return (gobj.animation != null); } public static void SetSpeed(this Animation anim, float newSpeed) { anim[anim.clip.name].speed = newSpeed; } } |
使用示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using UnityEngine; using System.Collections; public class Player : MonoBehaviour { void Update () { //move x position 5 units float currentX = transform.GetPositionX(); transform.SetPositionX(currentX + 5f); if(gameObject.HasRigidbody()) { //Do something with physics! } if(gameObject.HasAnimation()) { //Double the animation speed! gameObject.animation.SetSpeed(2f); } } } |
Unity添加自定义拓展方法的更多相关文章
- 【Unity3D游戏开发】之利用语法糖添加自定义拓展方法(下) (十八)
首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕不已,呵呵. 1. ...
- Unity、c#中的拓展方法讲解
很早以前看过这个东西,但是没有真正的用到过,希望之后会用到上面的方法, 大概的意思是这样的c#中尤其在用Unity的时候,已有的框架提供给我们一些固定的方法,但是有时我们想对这些方法进行修改, 这时我 ...
- 反射 DataTable拓展方法 转实体对象、实体集合、JSON
Mapper类 using System; using System.Collections.Generic; using System.Data; using System.Globalizatio ...
- Zepto 添加手势判断拓展方法(思路+原理)
一.前言 这几个月事情比较多,写了一些博客都没有来得及整理发布,今天刚好有一位同事在开发前端页面的时候用到了手势判断.所以翻出了之前写的 demo,顺便整理一下作为记录. 手势判断在各种应用中都十分常 ...
- js获取网页的url文件名( 例如index.aspx),js获取url的参数(例如获取 ?cid=joeylee的值),给jquery拓展方法
<script type="text/javascript"> var JsRequest={ //这就是一个静态类,类里面有2个静态方法 //方法一:获取url的 ...
- dede栏目添加自定义字段方法
1.首先要进mysql 数据库里添加字段,命名好!比如我下面添加了一个栏目备注字段,当然你字段可以自己新建,找到表dede_arctype(这个是栏目模型的数据库表,这里面我添加的是栏目备注字段cla ...
- 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)
先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...
- NET Core 拓展方法和中间件集合(支持NET Core2.0+)
# Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...
- Jquery拓展方法
拓展JQuery一般有两个方法: 1.全局拓展 比如 $.ajax()就是全局函数 拓展方法: Jquery.extend(); 比如: $.extend({ hello:function(mynam ...
随机推荐
- ios 常用的正则表达式(手机号邮箱md5加密验证空字符串等)
可以写一个nssring的category 给nsstring 增加一些方法,而这些方法就是一些正则表达式. 比如写一个叫做Helper的类 创建完了就是 NSString+Helper 然后在进行 ...
- 自定制格式化方式format
自定制格式化方式format # x='{0}{0}{0}'.format('dog') # # print(x) # class Date: # def __init__(self,year,mon ...
- 用 Python 写个消消乐小游戏
提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 很多人学习python,不 ...
- 在图像中隐藏数据:用 Python 来实现图像隐写术
什么是“隐写术”? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息 ...
- MySQL时间设计 int timestamp datatime 查询效率性能比较
在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int.timestamp.datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好呢?飘易就 ...
- MySQL--->数据库的简介和安装
1.什么是MySQL: MySQL是一个小型关系型数据库管理系统,开发者伟瑞典MySQL AB公司. 目前MySQL被广泛的应用在Internet上的中小型网站中.由于体积小,速度快,总体拥有成本低, ...
- puppet master/agent
puppet master/agent 配置 安装 master: yum install puppet-server agent: yum install puppet 自动签名 puppet的ma ...
- 准确率、精确率、召回率、F1
在搭建一个AI模型或者是机器学习模型的时候怎么去评估模型,比如我们前期讲的利用朴素贝叶斯算法做的垃圾邮件分类算法,我们如何取评估它.我们需要一套完整的评估方法对我们的模型进行正确的评估,如果模型效果比 ...
- Vue CLI Webpack 创建Vue项目
简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...
- JS学习第四天
循环语句 while(){ }: while :先判断再执行,如果while的条件结果为false,那么执行语句块中代码一句都不走 do(){ }while; do while:先执行代码块中的语 ...