本篇本来是作为原来优雅的 QChain 的第一篇的内容,但是 QChain 流产了,所以收录到了游戏框架搭建系列。本篇介绍如何实现 GameObject 的链式编程。

链式编程的实现技术之一是 C# 的静态扩展。静态扩展可以做到无需继承 GameObject 就可以为 GameObject 的对象添加成员方法。其实这么说不太严谨,但是看起来就是这样:)

C# 静态扩展快速入门

首先我们要实现给 GameObject 添加一个DestroySelf方法。使用方式如下:

gameObject.DestroySelf();

贴上具体实现代码 :

	using System;
using UnityEngine; /// <summary>
/// GameObject's Util/This Extension
/// </summary>
public static class GameObjectExtension
{
...
public static void DestroySelf(this GameObject selfObj)
{
GameObject.Destroy(selfObj);
}
...
}

代码非常简单。

以上代码要注意的是:

  1. 静态扩展方法必须在静态类中实现。
  2. 第一个参数前要加this关键字。

    当然也可以用这种方式使用:
GameObjectExtension.DestroySelf(gameObject);

这样写的意义不大,不如直接用Object/GameObject.Destroy(gameObject);不过也有可以使用的情形,就是当导出给脚本层使用的时候。这里不多说。

初步入门就介绍到这里。下面实现链式编程。

GameObject 实现链式编程

链式编程实现方式多种多样。但是对于 GameObject 来说有一种最简单并且最合适的方法,就是静态扩展 + 返回 this 的方式。

为什么呢?链式编程如果可以使用继承实现的话有很多种玩法,只不过 GameObject 是 sealed class,不能被继承。所以只能通过静态扩展 + 返回this的方式。这也是为什么会把这篇文章作为第一篇的原因。

先看下如何使用。

gameObject.Show()   	// active = true
.Layer(0) // layer = 0
.Name("Example"); // name = "Example"

接下来贴出实现:

	using System;
using UnityEngine; /// <summary>
/// GameObject's Util/This Extension
/// </summary>
public static class GameObjectExtension
{
public static GameObject Show(this GameObject selfObj)
{
selfObj.SetActive(true);
return selfObj;
} public static GameObject Hide(this GameObject selfObj)
{
selfObj.SetActive(false);
return selfObj;
} public static GameObject Name(this GameObject selfObj,string name)
{
selfObj.name = name;
return selfObj;
} public static GameObject Layer(this GameObject selfObj, int layer)
{
selfObj.layer = layer;
return selfObj;
} public static void DestroySelf(this GameObject selfObj)
{
GameObject.Destroy(selfObj);
}
...
}

可以看到新增的几个静态方法与 DestroySelf 不同的是,多了个 return selfObj,就是调用方法时返回自己,这样可以接着调用自己的方法。原理很简单。

目前 GameObject 链式编程的优劣:

  • 优点:代码紧凑,写起来很爽快,以自己的习惯设计接口,会提高开发效率。
  • 缺点:性能会损耗一丢丢,调试不方便,出异常时候会发现堆栈信息超级长,别人看了会误认为Unity 升级又加了API。不过 DoTween,UniRx 都在这么用…

    执行效率 vs 开发效率 + 低 bug 率,就看各位怎么权衡啦。

    OK,本篇就介绍到这里。

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程的更多相关文章

  1. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

  2. Unity 游戏框架搭建 (十六) v0.0.1 架构调整

    背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...

  3. Unity 游戏框架搭建 (十三) 无需继承的单例的模板

    之前的文章中介绍的Unity 游戏框架搭建 (二) 单例的模板和Unity 游戏框架搭建 (三) MonoBehaviour单例的模板有一些问题. 存在的问题: 只要继承了单例的模板就无法再继承其他的 ...

  4. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  5. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  6. Unity 游戏框架搭建 (十八) 静态扩展 + 泛型实现transform的链式编程

    本篇文章介绍如何实现如下代码的链式编程: C# this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ...

  7. Unity 游戏框架搭建 (十五) 优雅的QChain (零)

    加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多Feature,大部分不太稳定,这些Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了. 什么是链式编程? 我想大 ...

  8. Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers

    我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...

  9. Unity 游戏框架搭建 2019 (十八~二十) 概率函数 & GameObject 显示、隐藏简化 & 第二章 小结与快速复习

    在笔者刚做项目的时候,遇到了一个需求.第一个项目是一个跑酷游戏,而跑酷游戏是需要一条一条跑道拼接成的.每个跑道的长度是固定的,而怪物的出现位置也是在跑道上固定好的.那么怪物出现的概率决定一部分关卡的难 ...

随机推荐

  1. cssText用法和使用说明

    cssText 本质是什么? cssText 的本质就是设置 HTML 元素的 style 属性值. cssText 怎么用? document.getElementById("d1&quo ...

  2. [转]Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    转自:http://www.cnblogs.com/oppoic/p/6165581.html Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存 ...

  3. google搜索使用技巧

    1.输入框所有空格都被理解为加号2.搜索多个单词时,需要加上引号,会当字符串处理3.使用-(减号)剔除指定条件,如:'mongdb'-'nodejs'4.可以使用通配符,如'vue *'5.在指定网站 ...

  4. C语言归并排序

    这篇文章是学习了小甲鱼-数据结构与算法结合自考教材编写出的代码,希望自己逐渐在算法造诣上能更上一层楼. 归并排序(递归实现) “归并”一词在中文含义中就是合并的意思,而在数据结构中的定义是将两个或者两 ...

  5. vim使用方法----转载

    转载自:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法,但 ...

  6. Java链接 Oracle11g R2

    菜鸟学习Oracle数据库,使用Java代码链接数据库. 首先要配置Eclipse,在新建的工程中,Package Explorer->工程名->Build path->Add ex ...

  7. Java 多线程使用

    工作中遇到的问题,记录下解决的思路 问题: 对磁盘进行碎片化测试(比如说,磁盘空间是16G),从64K开始写文件,写满后删除一半,然后写32K 的数据,写满后删除一半...直到4K写满删除一般算是结束 ...

  8. Hush Framework框架配置(转)

    在写这篇文章的时候,楼主已经饿的不行了,因为我从3点开始就在折腾Hush Framework,走了很多弯路,打铁要趁热,先把基本的过程记录下来,留待以后翻阅,同时记录其中容易走弯路的地方,特别是对于一 ...

  9. 深入理解mysql的底层实现

    MySQL 的常用引擎 1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件. InnoDB 中存在表锁和行 ...

  10. Thread调用SaveFileDialog

    public void ThreadSaveFileDialog(string sourceFileName) { Thread importThread = new Thread(new Param ...