本篇本来是作为原来优雅的 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 (五十六/五十七) 需求分析-架构中最重要的一环&amp;从 EmptyGO 到 Manager Of Managers

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

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

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

随机推荐

  1. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  2. 玩转SSRS第十篇---自定义代码

    提到SSRS 那么就不得不提一下自定义代码的功能,通过自定义代码,有时候可以解决一些比较复杂的问题,比如将让指定的数据行应用指定的属性值.此篇将演示如何通过简单结构的自定义代码进行报表样式的基本设计. ...

  3. requirejs学习博客址分享

    1. http://blog.jobbole.com/30046/ 2. http://www.requirejs.cn/ 3. http://www.ruanyifeng.com/blog/2012 ...

  4. get 和 post的使用.

    Two commonly used methods for a request-response between a client and server are: GET and POST. GET  ...

  5. 如何快速把 Vue 项目升级到 webpack3

    由于 webpack3升级后,新增了 Scope Hositing(作用域提升) 功能,据说是对 js的性能提升很大.因此,我们做了一个测试对比,就是 webpack3和 webpack1/2 的性能 ...

  6. Java学习之计算机基础(二)

    今天主要介绍原码.反码与补码的知识.了解原码.反码与补码的知识,可以帮助我们更好地理解在计算机内部是如何进行运算的,同时对于后面更好地学习和理解Java基本数据类型及其范围打下基础. 背景知识: 在计 ...

  7. Flask--(项目准备)--框架搭建,参数配置

    项目准备: 配置参数 项目配置: 新建工程: 配置虚拟环境: 通过配置类添加配置参数: Debug配置, 初始化数据库对象, Mysql配置及数据库创建 redis配置: 端口6379和域名: 创建存 ...

  8. 信息安全-加密:DES 加密

    ylbtech-信息安全-加密:DES 加密 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资 ...

  9. VirtualBox安装Centos后实现文件夹共享

    不同虚拟机中的系统和windows之间实现文件共享方式也不一样,在VMWare虚拟机请参考链接:http://www.cnblogs.com/vincentfu/p/5402666.html 进入主题 ...

  10. gpio口、内核定时器使用

    /*申请gpio*/ int gpio_request(unsigned gpio, const char *label); /*设置gpio为输入状态,即设置如(GPH0CON)*/ int gpi ...