Ich arbeite an einer Game-Engine mit ECS. Mein Problem ist, wie ich eine Entity spawne. Meine Idee ist, dass ich eine Methode, die als Argument in einer Einheit nimmt, um einen Klon dieser Einheit erzeugt, retrives alle Zeiger Komponenten aus dem Klon und steckt sie in ihren jeweiligen Systemen für die Aktualisierung:Game Engine Design Problem
Entity & Scene::spawnEntity(Entity entity) {
Entity clone = Entity(entity);
Transform* transform = clone.getComponent<Transform>();
Drawable* drawable = clone.getComponent<Drawable>();
Collidable* collidable = clone.getComponent<Collidable>();
Scriptable* scriptable = clone.getComponent<Scriptable>();
if (transform != nullptr) {
_transformSystem.add(*transform, _currentId);
}
if (drawable != nullptr) {
_drawableSystem.add(*drawable, _currentId);
}
if (collidable != nullptr) {
_collidableSystem.add(*collidable, _currentId);
}
if (scriptable != nullptr) {
scriptable->assignCallbacks([&](Entity entity) -> Entity& { spawnEntity(entity); },
[&](Entity entity) { destroyEntity(entity); },
[&](std::vector<std::string> tags) -> Entity& { findEntity(tags); },
[&](std::vector<std::vector<std::string>> tags) -> std::vector<Entity>& { findEntities(tags); });
_scriptableSystem.add(scriptable, _currentId);
}
_entities.push_back(clone);
_currentId++;
}
Der Problem hier ist, dass eine der Komponenten, nämlich eine skriptfähige ist eine reine abstrakte Klasse (es hat eine Initiate-Methode und Update-Methode, die der Entwickler verwendet, um Verhalten in abgeleiteten Klassen zu erstellen). Das macht es so, dass der Motor automatisch die skriptfähige Klasse klonen kann nicht, hat das Klonen in der abgeleiteten Klasse durchgeführt werden, zum Beispiel wie folgt aus:
class PlayerScript : public Scriptable
{
public:
void init() override;
void update() override;
PlayerScript* clone() override;
};
PlayerScript * PlayerScript::clone()
{
return new PlayerScript(*this);
}
ich nicht den Benutzer ein Klon-Methode erstellen müssen jedes Skript, das er oder sie erstellt, ich denke, es sollte von der Engine automatisch behandelt werden. Aber ich kann nicht herausfinden, wie man es anders macht.