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

时间:2016-06-29 14:53:39

标签: unreal-engine4 unreal-blueprint

美好的一天!我是使用虚幻引擎4 的新手,我对 蓝图 的工作原理有一些疑问。根据我对它的理解,每个蓝图都像 。我的意思是一个蓝图很像 OOP编程语言中的一个类

请教育我 - 如果我的假设是正确的或错误的。如果错了,那么也许你可以帮助我以不同的方法/视角实现我想要的东西。我愿意学习并接受建议。

如果在某些时候我的理解是正确的 - 蓝图实际上是个别类 - 如果你能()指导去哪里,我会非常感激以及如何实现我想要创建的设计。这是从程序员的角度来看(PHP OOP编程)。原谅这种方法,我只是用PHP来逻辑地表达我希望这个类的工作方式。另外,它是我所知道的唯一的OOP编程。

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

  2. 这个类将处理所有相关的项目,因此我们必须给它很多属性/变量。 (下面只是一个例子;我再次以PHP为例。)

    class Item {

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

    }

  3. 3。)我想通过将两个变量作为构造参数来启动此类。 (我们需要 itemID itemType )。这是因为我将使用这两个变量来检索已在数据表中提供的项目数据。我将使用表中的这些数据来填充类属性/变量。 (我不确定我说的是对的。我希望你理解我的观点。)

       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传递给类,然后使用指针获取项目的名称,描述,网格,材料等。

    示例:

    $weapon = new Item('10001','Weapon');
    $weaponMesh = $weapon->getMesh();
    
    $armor = new Item('12345','Armor');
    $armorName = $armor->getName();
    

    我在使用蓝图时遇到了很多麻烦并实现了这种方法甚至类似的方法。我不是想避免使用C ++,我很乐意学习它,但我现在没有时间自由。

    我尝试过很少的事情让它发挥作用:

    • Casting / Casting to class(但是我无法弄清楚目标对象将是什么我将如何将输入参数添加到类中?没有任何输入在那里,我可以使用。)
    • Spawn演员(这个很有希望,我需要深入研究这个)
    • 蓝图宏?蓝图接口? (我只是输了。)

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

    ~Chris

1 个答案:

答案 0 :(得分:2)

据我所知,,我们可以假设每个蓝图都可以被视为类。 (此外,由于UE 4.12(在UE 4.11中,我认为功能被标记为实验性),您可以在项目设置 - > 包装下检查编译蓝图 em>。这将为每个蓝图创建本地类。)

您可以基于对象(C ++中的 UObject )创建Blueprint或C ++类。然后,您可以指定所有属性(或UE编辑器术语中的变量)。在BP中你有一个小优势:你可以将一些属性标记为在spawn上可见(它们必须是公共和可见的)。因此,在创建该类的新实例时,可以显式地将值传递给该属性。 在BP Construct 事件中,正确填充了这些属性,因此您可以根据给定的 ID Type 设置其他属性值。

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

关于您尝试过的列表的一些内容:

  • Spawn演员 - 只有当你打算在场景中拥有那个BP时才从演员派生。演员是游戏更新和渲染的主体,因此将actor仅作为数据容器是非常错误的。
  • BP 与BP 功能相同,但函数将像函数一样被调用(因此通过函数调用约定执行必要的操作)和将替换它的实现,您将调用该宏。更令人筋疲力尽的解释here
  • 如果我要实现你的代码,我会像我说的那样做,然后我将该类作为某个组件中的属性,并且该组件将附加到某个actor,它将放置在场景中。