UE4 蓝图与 C++ class 相同吗?如果是这样,我将如何实施 class 设计?

Are UE4 Blueprints the same with a C++ class? If so, how will I implement a class design?

美好的一天!我是 Unreal Engine 4 的新手,我有几个关于 blueprints[=69= 的问题] 工作。根据我的理解,每个蓝图都像class一样工作。我的意思是 one blueprint 很像 OOP 编程语言中的 one class.

请告诉我 - 如果我的假设是正确的还是错误的。如果错了,那么也许你可以帮助我在不同的 method/perspective 中实现我想要的。我愿意学习并接受建议。

如果在某些时候我的理解是正确的——蓝图实际上是独立的classes——如果你能的话我将不胜感激() 指导去哪里以及如何实现我想要创建的设计。这是从程序员的角度来看的(PHP OOP 编程)。请原谅这种方法,我只是使用 PHP 来逻辑地表达我希望 class 如何工作。另外,它是我知道的唯一的 OOP 编程。


  1. 我想创建一个名为:Items 的 class。 class Item {}

  2. 这个class将处理所有与项目相关的事情,因此我们将不得不给它很多properties/variable。 (以下只是一个示例;我再次使用 PHP 作为示例。)

    class Item {

        var $id;
        var $name;
        var $description;
        var $type;
        var $subType;
        var $mesh;
        var $materials; 
    

    }

3.) 我想通过将两个变量作为其 construct 参数来启动此 class。 (我们需要 itemIDitemType)。这是因为我将使用这两个变量来检索 data table 中已经可用的项目数据。我将使用 table 中的这些数据来填充 class properties/variable。 (我不确定我说的对不对,希望你能理解我的意思。)

   class Item {

        var $id;
        var $name;
        var $description;
        var $type;
        var $subType;
        var $mesh;
        var $materials; 

        function _construct($cons_itemID, $cons_itemType) {

               /*-- Start getting the item Data here based on what item and type provided. Then, push that data into the class properties/variables. We will use individual methods/functions to fill other properties/variables later. --*/

        }
}

4.) 基本上,通过该设计,我可以轻松地将项目 ID 传递给 class,然后使用指针获取项目的名称、描述、网格、材料等。

示例:

$weapon = new Item('10001','Weapon');
$weaponMesh = $weapon->getMesh();

$armor = new Item('12345','Armor');
$armorName = $armor->getName();

我只是在使用蓝图和实现此方法或什至类似方法时遇到了很多麻烦。我不是想避开 C++,我很想学习它,但我现在没有时间自由。

我尝试过的一些事情让它发挥作用:

  • Casting / Casting to class(但我不知道目标对象是什么 我要如何将输入参数添加到 class 那样?那里没有我可以使用的任何输入。)
  • Spawn Actor(这个很有前途,我需要深入研究一下)
  • 蓝图宏?蓝图接口? (我只是迷路了。)

对于所有愿意提供帮助或回答的人。谢谢!

~克里斯

据我所知,,我们可以假设每个蓝图都可以被视为class。 (此外,自从 UE 4.12(我认为在 UE 4.11 中该功能被标记为实验性)以来,您可以在 Project settings -> Compile blueprints 检查 Compile blueprints =20=]打包。这将为每个蓝图创建原生class。)

您可以基于 Object(C++ 中的 UObject)创建蓝图或 C++ class。然后您可以指定所有属性(或 UE 编辑器术语中的变量)。在 BP 中,你有一个小优势:你可以将一些属性标记为 Visible at spawn(它们必须是 Public 并且可见)。因此,当您创建 class 的新实例时,您可以显式地将值传递给该属性。 在 BP Construct 事件中,该属性已正确填充,因此您可以根据给定的 IDType 设置另一个属性值.

在 C++ 中,class 与 FObjectInitializer 具有不同的参数是不可能的,因此在执行构造函数时您没有及时获得这些值。但是实现相同的功能并不难,您可以在这里找到示例:https://answers.unrealengine.com/questions/156055/passing-arguments-to-constructors-in-ue4.html.

关于您尝试过的列表的一些信息:

  • 生成 actor - 仅当您打算在场景中拥有该 BP 时才派生自 actor。 Actor 受制于游戏更新和渲染,因此仅将 Actor 作为数据容器是非常错误的。
  • BP Macro 与 BP Function 相同,除了 function 将像函数一样被调用(因此通过函数调用约定执行必要的操作)和 macro 将在您调用该宏的地方替换它的实现。更详尽的解释 here.
  • 如果我要实现你的代码,我会像我说的那样做,然后我会在某些组件中将 class 作为 属性,并且该组件将附加到某个 actor ,将放置在场景中。