実現したいこと
下記はECS
実装に向けてまずは簡単なコンソール出力にて、実装を簡略化したものなのですが、
System
とEntity
の部分でどのように、Entitiy
とComponentData
を連携して
それぞれ異なるComponentData
に対してSystem
を実行したらいいか知りたいです。
ECSの実装について:https://zenn.dev/rita0222/articles/c22a8367e31b4d5f4eeb
知りたいこと
System
部の実装方法で、複数の異なるComponentData
の塊を処理する方法
コード内容
Chunk
クラスはある程度の数のComponentData
をまとめておく機構なのですが未使用
です
ArcheType
クラスはChunk
クラスをまとめておく機構ですが未使用
です。
現状ではTransform
,Renderer
の二つのComponent
があります。
System
は基底クラスでこのクラスを継承してSystem
を実装しています。
前提
Entity Component System
でのキャッシュヒットで効率化を行う。
考えたこと
1,今のような場合だとmain()
関数に直接記述できますが実際の開発ではロジック化するので違います
2,仮にComponentData
が一種類だけでVoxel
のみだったらSystem
部のUpdate()
関数の引数に(std::vector<Voxel> &v)
などといった形で考えたのですが、実際の開発では複数の種類あるはずなので実装できません。
3,そもそもキャッシュヒットを狙う設計なので、ポインタなどを使うとデータが並ばなくなるので
困りっています。
理解したこと
1,ECSではComponentはデータのみを持ち、非ECSでコンポーネント指向のUnityのような形である、
Update()のような機能はSystem
が処理する
該当のソースコード
cpp
1#include <iostream> 2#include <glm/glm.hpp> 3#include <vector> 4 5/*############################################################################ 6# 基底クラス 7##############################################################################*/ 8 9/*###################################### 10# ComponentData base class 11########################################*/ 12class ComponentData 13{ 14public: 15 ComponentData() 16 { 17 std::cout << "Component Created" << std::endl; 18 } 19 20}; 21 22/*###################################### 23# ArcheType base class 24########################################*/ 25class ArcheType 26{ 27public: 28 ArcheType() 29 { 30 std::cout << "ArcheType Created" << std::endl; 31 } 32 33 34 35}; 36 37/*###################################### 38# System base class 39########################################*/ 40class System 41{ 42public: 43 44 System() 45 { 46 std::cout << "System Created" << std::endl; 47 } 48 49 virtual void Update() = 0; 50}; 51 52/*############################################################################ 53# 派生クラス 54##############################################################################*/ 55 56/*###################################### 57# Transform Component 58########################################*/ 59class Transform 60{ 61public: 62 63 glm::vec3 position; 64 glm::vec3 rotate; 65 glm::vec3 scale; 66 67 Transform() 68 { 69 std::cout << "Transform Created" << std::endl; 70 } 71 72 73}; 74 75/*###################################### 76# Mesh Component 77########################################*/ 78class Mesh 79{ 80public: 81 82 glm::vec4 color; 83 84 Mesh() 85 { 86 std::cout << "Mesh Created" << std::endl; 87 } 88}; 89 90/*###################################### 91# Voxel ComponentData 92########################################*/ 93class Voxel : public ComponentData 94{ 95public: 96 97 Transform transform; 98 Mesh mesh; 99 100 Voxel() : ComponentData() 101 { 102 std::cout << "Voxel Created" << std::endl; 103 } 104}; 105 106/*###################################### 107# Render System 108########################################*/ 109class RenderSystem : public System 110{ 111public: 112 113 RenderSystem() 114 { 115 std::cout << "Render System Created" << std::endl; 116 } 117 118 void Update() override 119 { 120 std::cout << "Render System Updated" << std::endl; 121 } 122 123}; 124 125/*###################################### 126# Movement System 127########################################*/ 128class MovementSystem : public System 129{ 130public: 131 132 MovementSystem() 133 { 134 std::cout << "Movement System Created" << std::endl; 135 } 136 137 void Update() override 138 { 139 std::cout << "Movement System Updated" << std::endl; 140 } 141 142}; 143 144 145/*############################################################################ 146# その他 147##############################################################################*/ 148 149/*###################################### 150# Chunk 151########################################*/ 152class Chunk 153{ 154public: 155 156 157 Chunk() 158 { 159 std::cout << "Chunk Created" << std::endl; 160 } 161}; 162 163/*###################################### 164# Entity 165########################################*/ 166class Entity 167{ 168public: 169 170}; 171 172int main() 173{ 174 std::vector<Voxel> voxelList; 175 voxelList.resize(100); 176 177 178 179 180} 181
回答2件
あなたの回答
tips
プレビュー