2

エンティティ システムに物理を追加する作業を行っていますが、ECS のシステム部分について混乱しています。

たとえば、ECS 以外のプロジェクトでは、次のようなものがあります。

function updatePhysics()
    foreach(thisRobot in robots)
        thisRobot.move()
        foreach(otherRobot in robots)
            if(response = thisRobot.isColliding(otherRobot))
                thisRobot.resolveCollision(response)

ただし、ECS プロジェクトでは、PositionComponent と VelocityComponent で動作する MovementSystem と、PositionComponent と ShapeComponent で動作する CollisionSystem があります。結果は次のようになります。

MovementSystem
    function update()
        foreach(entity in entities)
            this.move(entity)

CollisionSystem
    function update()
        foreach(thisEntity in entities)
            foreach(otherEntity in entities)
                if(response = this.isColliding(thisEntity, otherEntity)
                    this.resolve(thisEntity, response)

違いは、非 ECS バージョンでは移動と衝突がインターリーブされているのに対し、ECS バージョンでは分離されていることです。エンティティ システムでこの動作をモデル化する通常のパターンはありますか? ECS の全体的なポイントは継承から逃れることですが、おそらく MovementSystem と CollisionSystem の両方を、各システムが独自のループを維持するのではなく、単一のエンティティで他のシステムの更新関数を呼び出すより一般的な PhysicsSystem の一部にすることでしょうか?

4

3 に答える 3