扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method

在日常使用Unity3d中,经常碰到一些简单操作但是代码却很长的问题,比如变换一个 GameObject的 Y 位置,会按照下面的写法:

transform.localPosition = new Vector3 (transform.localPosition.x, transform.localPosition.y + 100, transform.localPosition.z);

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

这时就会吐槽,Unity怎么不直接提供一个 SetlocalPositionY 的函数啊!

其实这样的函数是我们可以自己添加的哦!在Unity3d 的百科中,提供了对四元数的一个扩展案例。

http://wiki.unity3d.com/index.php/QuaternionExtensions

Unity3d官网的教程也有详细的讲解

http://unity3d.com/learn/tutorials/modules/intermediate/scripting/extension-methods

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

那为什么Unity中可以这样对类进行扩展,添加自己的函数?

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

我们知道,Unity使用的是 Mono ,而Mono 是C# 的一套开源的实现,C#中的大部分特性在Mono中都已经被实现了。包括 C# 的Extension Method 。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

MSDN上对Extension Method 的解释:

https://msdn.microsoft.com/en-us/library/bb383977.aspx

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

好了,讲了这么多,我们开始动手,自己对Unity3d的一些组件进行扩展吧,就拿上面的 Transform 进行扩展吧,实在受不了它了。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

首先我们来扩展Transform;

/*****************
 * 文件名:ExtensionTransform.cs;
 * 文件描述:扩展Transform组件;
 * 创建人:陈鹏;
 * 创建日期:2015/05/10;
 * C#创建扩展类,类名不限,必须是static类,然后static方法,第一个参数要传入扩展类实例;
**********************/

using UnityEngine;
using System.Collections;

public static class ExtensionTransform
{
	public static void SetlocalPositionY(this Transform trans,float y)
	{
		trans.localPosition = new Vector3 (trans.localPosition.x, y, trans.localPosition.z);
	}
}

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

然后在Unity3d中直接像使用 Transform 的成员函数一样使用。

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {
		transform.SetlocalPositionY (transform.localPosition.y + 1*Time.deltaTime);
	}
}

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

这里只是举例,其它的需要的函数我们也可以自己再扩展,例如 SetlocalPositionX,当然其它的类都可以去尝试。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

项目下载:

http://pan.baidu.com/s/1o6iM9E6

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

时间: 2024-10-12 14:44:08

扩展Unity3d 组件方法,简化API使用 - C#特性之 Extension Method的相关文章

通过扩展方法简化UnityAPI调用

通过扩展方法简化UnityAPI调用 扩展方法unity apiapi简化 通过扩展方法简化UnityAPI调用 能省一秒是一秒,时间就是金钱,没人愿意把时间花在冗长的coding上?? 定义扩展方法简化Transform中对位置的赋值 using UnityEngine; namespace WSFramework {  public static class TransformLocalPosImprovements {  public static void SetLocalPosX (t

扩展Unity3D编辑器的脚本模板

??最近在学习Shader时感觉Shader语言参数众多.语法诡异,如果每次都从头开始写Shader一定是一件痛苦的事情.如果可以在本地定义好一组标准的Shader模板,这样当我们需要实现某些效果类似的Shader时,就可以在这个Shader模板的基础上进行修改.因为Shader文件是一个文本文件,所以我们可以非常容易地创建这样一个模板,在这个模板中我们可以进一步完善相关的参数注释,这样就不用每次写Shader的时候都需要查文档了,从这个角度出发,就进入了这篇文章的正题:扩展Unity3D编辑器

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组成部分,以便快速入门. 查看本系列更多内容 | 0 评论: Ed Slattery ([email protected]), 软件工程师, IBM UK Pete Robbins ([email protected]), 软件工程师, IBM UK Andrew Borley ([email pro

谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比較

谈谈CListCtrl 扩展风格设置方法 --------------------------------------SetExtendedStyle和ModifyStyleEx 比較 对于刚開始学习的人来说,当他须要设定listctrl的扩展风格时,经常想到用ModifyStyleEx 来设定,代码例如以下: ModifyStyleEx(0,LVS_EX_GRIDLINES) 这是不对的,正确的设定应该是: SetExtendedStyle(LVS_EX_GRIDLINES) 那么,Modif

Unity3d 组件设计的思考

在使用unity3d之前,我已经知道组件设计的概念,我们某个项目实际上也是基于组件的,虽然底层引擎只是设计了一个最简单的组件框架,遗憾的是其他部分,并没有按照多少组件的意思来组织代码.这个组件失败的地方在于,没有提供一个很好的组件之间通信的方法.我们的组件系统使用一个interface类作为组件提供内在功能的手段.好处在于,使用该interface类你无需包含特定组件的细节(不用包含组件头文件).坏处是,该interface类本身很庞大,因为他使用仿函数(boost function)作为与组件

React组件方法中为什么要绑定this

React组件方法中为什么要绑定this 如果你尝试使用过React进行前端开发,一定见过下面这样的代码: //假想定义一个ToggleButton开关组件 class ToggleButton extends React.Component{ constructor(props){ super(props); this.state = {isToggleOn: true}; this.handleClick = this.handleClick.bind(this); this.handleC

与json-server对接,为组件提供CRUD API功能

# 工程所要实现的功能: 与json—server对接,为组件提供CRUD API #实现思路 注意:前提条件,一定要启动json-server(启动方法:进入db.json所在文件路径 ,终端输入:json-server --watch db.json ) 验证json-server 是否可用.方法:http://localhost:3000/products 有返回数据 1. 引入HttpClientModule 2. 创建一个类(Product) ng g class product ex

CListCtrl 扩展风格设置方法---SetExtendedStyle和ModifyStyleEx

想把ListCtr设置为整行高亮显示错误的方法为: 1 clistctrl.ModifyStyleEx(0,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); 正确的方法为: 1 DWORD dwStyle = clistctrl.GetExtendedStyle(); 2 dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; 3 clistctrl.SetExtendedStyle(dwStyle); 那么,Modi

Echarts Jqplot嵌入extjs4 windows 组件方法

js组件画图最终是画在一个指定id的div或dom元素中, 在项目中有可能需要画在 Extjs容器中,研究了一下,可以通过以下的思路实现,方法跟大家共享下: 1.首先做一个容器,把此内容添加到window的items属性中.(或者new一个box,利用window.add函数添加进去) 将容器的id指定为chart要渲染的id. Js代码   { xtype: 'box', //或者xtype: 'component', id: 'chartID',   //Echarte或JQplot要渲染的