【问题标题】:Make native C++ Code to a Blueprint in UE4在 UE4 中将原生 C++ 代码制作为蓝图
【发布时间】:2018-04-26 16:39:28
【问题描述】:

hiho@all

我是 UE4 的新手,所以如果我做错了什么可怕的事情,请告诉我。我很高兴我能学到的一切

问题:是否可以用普通的 C++ 类制作蓝图? ...它应该...具有正确的包括... 因为我为大学制作了一个 C++ 类“图形”,我喜欢将它作为技能树的基础实现到游戏中。 它应该是“UCLASS(Blueprintable)”,使其简单易读。还有Native,当然我会为系统做垃圾收集:)

代码是这样的:

#include <iostream>
#include <list>

template<class T>
class Graph
{


public:
    T element;
    std::list<Graph<T>*> childs;
    std::list<Graph<T>*> parents;
    Graph();
    Graph(T);
    ~Graph();
    Graph<T>* makeNewChild(T);
    bool pushChildtoParent(Graph<T>*);
    Graph<T>* makeNewChild(Graph<T>*);
    bool deleteChild(Graph<T>*);
    bool makeParent(Graph<T>*);
    T getElement();
    bool leaf;
};

template<class T>
Graph<T>::Graph()
{
    leaf = true;
    element = nullptr;
}

template<class T>
Graph<T>::Graph(T element) : element(element)
{
    leaf = true;
}

template<class T>
Graph<T>::~Graph()
{
    if(!leaf)
        {
            for (auto it = childs.begin(); it != childs.end();)
            {
                // wenn das kind nicht mehrere Väter hat, denen ich es nicht weg nehmen will
                if ((**it).parents.size()<2)
                {
                     delete *it ++;
                }
                else{
                    (**it).parents.remove(this);
                    it ++;
                }
            }
        }
    if (!(*this).parents.empty())
    {
         for (auto it = parents.begin(); it != parents.end(); it++)
        {
            //alle Väter vergessen dieses Kind, damit es ohne folgen beseitigt werden kann
            (**it).deleteChild(this);
        }
    }
}

template<class T>
T Graph<T>::getElement()
{
    return (*this).element;
}

template<class T>
bool Graph<T>::deleteChild(Graph<T>* tokill)
{
    for (auto it = childs.begin(); it != childs.end(); it++)
    {
        if( (*it)==tokill){
            childs.erase(it);
            return true;
        }
    }
    // Error code hier einfügen
    std::cout<<"Leider dieses Kind nicht gefunden. Error main2.h at line 61"<<std::endl;
    return false;
}

//eingane der zu setzende Vater. Wenn setzen des Vaters gelingt, wird er in die Liste der Väter aufgenommen

template<class T>
bool Graph<T>::makeParent (Graph<T>* newParent){
    if ((*newParent).pushChildtoParent(this)){
        parents.push_back(newParent);
        return true;
    }
    else{
        //Error code hier einfügen
        std::cout<<"das Erzeugen dieses Kindes bei dem Vater war nicht möglich. Error main2.h at line 76"<<std::endl;
        return false;
    }
}

template<class T>
bool Graph<T>::pushChildtoParent(Graph<T>* inTree){
    childs.push_back(inTree);
    leaf = false;
    return true;
}

template<class T>
Graph<T>* Graph<T>::makeNewChild(T inValue)
{
    Graph<T>* contain = new Graph<T>(inValue);
    childs.push_back(contain);
    (*contain).parents.push_back(this);
    leaf = false;
    return contain;
}

template<class T>
Graph<T>* Graph<T>::makeNewChild(Graph<T>* inTree)
{
    childs.push_back(inTree);
    (*inTree).parents.push_back(this);
    leaf = false;
    return inTree;
}

或者我应该重写它,没有模板? 当然,我敢肯定,类型 T 将是“技能*”

我认为在这一点上制作蓝图将使后续发展的努力从技能等方面更好、更快、更容易处理。

如果您能在这一点上帮助我,那就太好了:)

亲切的问候 演练

【问题讨论】:

  • 我想从类 Graph 中创建一个 UCLASS(Blueprintable),这样我就可以调用一个蓝图“makeNewChild”,而不必在 C++ 代码中编写 Hole Skill-Tree。 ..这将是一个血腥的混乱,以获得关于洞技能树矿石的概述,“使用它”是什么意思?
  • 啊,我才意识到蓝图是一个虚幻的东西。那我走了,对不起。

标签: c++ unreal-engine4 unreal-blueprint


【解决方案1】:

我发现在 UE4 中使用“外来”c++ 代码的最简单、最可靠的方法是创建一些代理 UCLASS,它使用您的自定义 c++ 类并且本身可以被蓝图调用。原因是 UE4 在 C++ 中有自己的“方式”,例如你应该使用 'TArray' 而不是 'list' 和 'UE_Log' 而不是 'stdout'。

所以我建议如下:

  • 创建一个新的 C++ 类,它扩展了 UObject(或 AActor,如果你想将它放在关卡中):

  • 在新类中包含您的自定义图表
  • 将 UFUNCTION(BlueprintCallable, ...) 带注释的方法添加到调用和操作图形的类(如有必要,还可以在 UE4 和原始 C++ 类型之间进行转换)
  • (可选)创建一个新蓝图,扩展您的新 C++ 类以通过蓝图编辑器添加功能
  • 现在您可以在其他蓝图中使用您的新类

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多