Сделать собственный код C ++ для Blueprint в UE4

привет @ все

Я новичок в UE4, поэтому, если я сделаю что-то ужасное, скажите мне об этом. Я счастлив всему, чему могу научиться

Вопрос: можно ли сделать Blueprint из обычного класса C ++? ... он должен ... с правильным включением ... потому что я создал класс C ++ "График" для университета, и мне нравится внедрять его в игру как основу Дерева навыков. Это должно быть "UCLASS (Blueprintable)", чтобы сделать его простым и понятным для чтения. А еще Native, конечно, я занимаюсь сборкой мусора для System :)

Код такой:

#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 будет "Skill *"

Я думаю, что при разработке Blueprints мы постараемся улучшить балансировку навыков и так далее, быстрее и проще.

Было бы неплохо, если бы вы мне помогли в этом вопросе :)

С уважением, EvD


person L.knaeble    schedule 26.04.2018    source источник
comment
Я хотел бы сделать UCLASS (Blueprintable) из класса Graph, чтобы я мог вызвать Blueprint makeNewChild и мне не нужно было кодировать дерево навыков Hole в коде C ++ ... Это было бы кровавым беспорядком, чтобы получить Обзор про дырку Skill-Tree Ore, что вы имеете в виду под ее использованием?   -  person L.knaeble    schedule 26.04.2018
comment
Ах, я только что понял, что чертежи - вещь Нереальная. Тогда я ухожу, извини.   -  person Nico Schertler    schedule 26.04.2018


Ответы (1)


Я обнаружил, что самый простой и надежный способ использования «чужого» кода на C ++ в UE4 - это создать прокси-сервер UCLASS, который использует ваш собственный класс C ++ и сам может вызываться схемами. Причина в том, что UE4 имеет свой собственный "способ" делать что-то на C ++, например. вы должны использовать TArray вместо list и UE_Log вместо stdout.

Поэтому я бы предложил следующее:

  • Создайте новый класс C ++, который расширяет UObject (или AActor, если вы хотите разместить его на уровне):

Создать новый класс C ++

  • включить свой настраиваемый график в новый класс
  • Добавьте в свой класс аннотированные методы UFUNCTION (BlueprintCallable, ...), которые вызывают и управляют графом (также при необходимости преобразуя в UE4 и необработанные типы C ++ и обратно)
  • (Необязательно) Создайте новый план, который расширяет ваш новый класс C ++ для добавления функций через редактор схем.
  • Теперь вы можете использовать свой новый класс в других чертежах.
person TheBrain    schedule 12.06.2018