(godot引擎笔记)反射、特性
严格来说这不算是godot里的内容,但是鉴于该内容我还蛮喜欢的,索性就放进来好了。
要理解反射with特性能做什么,首先要了解反射以及特性的概念。鉴于网上的文章对这一块都不怎么讲人话,这里就斗胆对这两个东西进行解读。
一、反射:
微软在C#的文档是这么讲解的:反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问其(注:官方翻译写成“器”,是错别字)字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。
微软在C#的反射里提供了一个小例子:
下面一个简单的反射示例,使用方法 GetType()(被
Object基类的所有类型继承)以获取变量类型:
备注 请确保在 .cs 文件顶部添加
using System;和using System.Reflection;。
输出为:
System.Int32。
可以发现,这里使用了反射中的System.GetType(),事实上,反射的命名空间中有System和System.Reflection两个,这里着重讲System.Reflection。
二、特性
微软在C#的文档是这么讲解的:使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用 反射 这项技术查询特性。
这么说可能还不太懂,那就用下面这个代码例子来说明:
输出为:
可以看到,利用反射筛选特性,可以轻松的做到获取具体实例所需要的内容,并忽略掉不需要的内容,这在游戏数据开发的时候是很好用的,比如:
我们给一个装备类设计了以下词条:
如果我要设计一把物理武器,那在不使用反射的情况下,我可能要用一个子类代表只有物理攻击力的武器,用一个子类代表只有魔法攻击力的武器,用一个子类代表只有真实攻击力的武器,用一个子类代表同时拥有物理攻击力和魔法攻击力的武器,用一个子类代表……
这还只是三个词条,如果词条复杂起来,并且有删改的需求的话,那么这就是一个继承的地狱。
而用反射with特性,可以很好的解决这个问题,只需要搭好反射和特性的框架,后面的类怎么修改都不会影响前面框架的使用。
除此之外,反射with特性还能通过IO很好的和游戏数据表相结合,用得好的话改表能轻松很多。

