hiho @ all
我是UE4的新手,所以如果我做了一些可怕的错误,请告诉我。我很高兴能学到的一切
问题:是否可以从正常的C ++类中创建蓝图? ......应该......正确包括...... 因为我为大学制作了一个C ++类“Graph”,我喜欢将它作为一个技能树的基础实现到游戏中。 它应该是“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将是“技能*”
我认为在这一点上制定蓝图将会更好,更快,更容易地处理技能等后发展平衡的努力。
如果你能在这一点上帮助我,那就太好了。)
亲切的问候 EVD
答案 0 :(得分:1)
我发现在UE4中使用“外来”c ++代码的最简单和最强大的方法是创建一些使用自定义c ++类的代理UCLASS,并且本身可以通过蓝图调用。原因是UE4有自己的“用C ++做事”的方式,例如:你应该使用'TArray'代替'list'和'UE_Log'而不是'stdout'。
所以我建议如下: