2017-02-17 10 views
1

物理システムをエンティティシステムに追加しようとしていて、ECSのシステム部分について混乱しています。私はと同様PositionComponentとVelocityComponentで動作MovementSystemを持つことになり、ECSプロジェクトにおけるしかしECS(エンティティコンポーネントシステム)のインターリーブシステム?

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

は例えば、非ECSプロジェクトで、私はこのようなものを持っているかもしれません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の両方を持つシステムは、各システムが独自のループを維持するのではなく、他のシステム更新機能を単一のentitiyで呼び出す、移動し、すべてのエンティティがシミュレーションで物理学に影響されない

答えて

0

...

私が影響を受けた物理学あるエンティティのための2つのタイプの

  1. 運動にMovementSystemを分割します。
  2. でないエンティティの移動は、の物理的影響を受けます。後者の場合は

、あなたは先に行くとVelocityComponentの速度との組み合わせでMovementComponent上方向を取ると、エンティティの動きや位置を算出することができます。

前者の場合、物理学者がシミュレーションを実行し、衝突を判定し、それらを処理できるようにする必要があります。どちらの場合でも、物理学の影響を受けるすべてのエンティティの位置を更新する必要があります。

ので、ループの観点から、私は期待して見

  1. 入力システムは、キー/マウス入力をキャプチャします。
  2. プレーヤーコントローラシステムは、入力を分析し、適切なインテントを生成します。
  3. 物理的に影響を受けないエンティティの移動を実行します。
  4. RigidBodyMovementSystem
  5. 解決の衝突
  6. エンティティに影響を与えたすべての物理学の更新位置を実行します。

あなたのシステムの記述方法に基づいていても、より小さな1つの小さなタスクを処理する小さなシステムコンポーネントに分解でき、そのステップの出力は別のシステムへの入力であることに注意してください。

+0

ループでは、4と5が分かれています。私の質問は、これらの2つのシステムをインターリーブする方法を目指していました。 – zorqy

0

簡単なアプローチは、実際の目的地と一緒に目的地を移動コンポーネントに追加することです。その後、移動システム内の前者のみを更新します。
もう一方の側では、衝突システムは、新しい位置を希望の位置に切り替えることによって新しい位置を適用しようとし、一度に1つのエンティティで衝突をチェックします。

もう1つのアプローチは、移動システム内の速度のみを更新することです。次に、一度にエンティティの位置を更新し、必要に応じて速度と位置を調整して衝突をチェックする、より一般的な物理システムを追加します。

エンティティのすべてのエンティティを一度に更新し、衝突をチェックしてから次のエンティティに進むことができます。
移動システムと衝突システムを分離する必要はありません。あなたとあなたのゲームに適したものを実行してください。

関連する問題