欢迎光临散文网 会员登陆 & 注册

(godot引擎笔记)反射、特性

2021-03-27 00:38 作者:流年夏华  | 我要投稿

        严格来说这不算是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很好的和游戏数据表相结合,用得好的话改表能轻松很多。

(godot引擎笔记)反射、特性的评论 (共 条)

分享到微博请遵守国家法律