游戏引擎从外部指定的类生成对象

问题描述 投票:0回答:1

我的标题的意思是获取一个 json 对象,并使用该 json 对象作为类创建一个新的指针对象。原因是,我正在尝试弄清楚游戏引擎如何生成它们的实体/参与者。您无法使用模板化的spawnEntity方法来完成此操作,因为模板是编译的,因此您不能在运行时使用未定义的类。那么,如何将内存分配给在运行时在程序外部定义的对象(该对象确实派生于主实体/Actor 类并位于某个关卡中)?还是有什么大事我没有得到?我想是有的,但我稍微浏览了一下虚幻的源代码,但他们使用反射和奇特的东西来做到这一点。我假设像 Unity 这样的 ECS 系统只是将脚本包装在一个类中,因此那里没有实例化。我真的很困惑这些东西是如何工作的。

抱歉胡言乱语,过去几天我一直在努力解决这个问题。

我尝试查看不同引擎的源代码,如Unreal、Source engine、ezEngine等,但找不到任何具体的解释。 当然,您可以使用模板化方法手动生成实体,但如果它们是编译时的,那么引擎如何在编译时知道自定义用户派生类(如果引擎只是一个库)?

c++ game-engine
1个回答
0
投票

我最熟悉Godot引擎,所以我从Godot的角度来回答你的问题。

您问题的最简单答案是:C++ 和主机脚本之间有一个解释器。大多数使用 Godot 的人都使用他们内置的脚本语言 GDScript。如果这样做,那么您的 GDScript 代码不会编译为 C++,而是编译为中间字节码。然后 Godot 引擎解释。就 Godot 引擎而言,所有 GDScript 类实际上都是存储该字节码的单个 C++ 类的实例。 (我掩盖了 Godot 类型层次结构的细节,我认为这与这里无关)

好吧,但是你也可以在 Godot 中编写 C# 代码,对吗?嗯,是的,但这是相同的技巧,只是使用不同的虚拟机。 Godot 开发人员编写了一个 C++ 类,它可以存储对某个 C# 类的引用(以某种对 Mono 框架有意义的不透明形式)。然后,该 C++ 类可以(使用 .Net 反射功能)获取有关该 C# 类的信息并调用其方法。

但是让我们进入更低的层次。毕竟,Godot 的独特之处在于任何人都可以破解它。有一个具有一流支持的扩展 API,允许任何人使用任何能够调用 C ABI 的语言向引擎添加类。 that 如何运作?

好吧,一旦你剥开所有的雾里看花,所有这些 OOP 魔法实际上都非常简单。当你有一个多态类时,你就隐藏在指针后面。该指针指向一些内存,该内存可能是相关类的实例,但也可能是子类的实例。什么是子类?嗯,它只是一个类,其第一个成员是超类。这是允许在 C 中编写类似类的东西的基本技巧,它没有

class
关键字。

这个技巧称为类型双关语。如果在 C 中定义一个结构体,则指向整个结构体的指针保证与指向第一个成员的指针相同。所以

struct A {
  int x;
  int y;
  int z;
};

struct B {
  struct A instance_of_a;
  int t;
};

B my_b;

这里,

*my_b
*(A*)my_b
都保证有效,因为
my_b
的第一个成员是
A
。因此,如果我想编写一个新类,Godot 引擎会将其识别为
Node2D
的子类,那么我真正需要做的就是定义一个结构,其第一个成员 is
Node2D
(阅读:具有与
Node2D
相同的结构,它可能是从某处的
.h
文件中获得的),然后将该类注册到 Godot 的类数据库中。 (再次,跳过有关类型层次结构的详细信息)

我的观点是:当你剥开所有魔法和抽象层时,它实际上只是一直向下的指针,如果你可以使用相同的指针集合创建一个结构,那么它与任何子类一样好.

© www.soinside.com 2019 - 2024. All rights reserved.