zoukankan      html  css  js  c++  java
  • Unity 游戏框架搭建 2017 (十七) 静态扩展 GameObject 实现链式编程

    本篇本来是作为原来优雅的 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

    更多内容

  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/7797621.html
Copyright © 2011-2022 走看看