現在、ユニットの局所回避のための物理的衝撃力をシミュレートしていますが、この方法はユニットをフォーメーションから押し出すことがあり、ユニットが凝集すると非常に望ましくない効果があります。
Starcraft 2のようなRTSゲームの場合、ローカル回避はどのように行われますか?物理学はシミュレートされていますか、それとも全知のコントローラーがすべての場所を決定しますか?私はこの質問が少し広いかもしれないことを知っているので、Starcraft 2のローカルな回避行動をどのように達成するかについて具体的に尋ねています。動作するものなら何でも大歓迎です。
コードを探しているわけではありません-Starcraft 2(または同様のゲーム)がローカル回避を処理する方法の有用なリソースまたは説明だけです。
現在、衝突検出(貫通ベクトル)、衝突力、および速度による移動が実装されています。すべてのユニットは、衝突について別のユニットと照合されます-衝突すると、オブジェクトは貫通ベクトルによってすぐに相殺され、衝突力が適用されます。次に、別のループがオブジェクトをその速度で移動し、速度にドラッグを適用します。オフセットは、凝集したユニットに過剰な衝突力がかかる問題を緩和しますが、ユニットが時々飛び出すこともあります。
私が探しているソリューションは、次の要件を満たす必要があります(Starcraft 2のように)。
- オブジェクトは重複しません。または、少なくとも重複を最終的に解決する必要があります。
- オブジェクトは必要以上に押し合うことはないので、2つのユニットがフォーメーション内でお互いに隣接して移動できます。
- オブジェクトが同じ目的地に向かって固まる場合、奇妙な動作はありません。
- さまざまなサイズのユニット、さらにはさまざまな凸形状をサポートできます。
私がこれまで考えてきたのは、衝突を検出する代わりに、将来の衝突を検出して、重複が発生しないようにすることです。次に、2つのユニットの速度が重なり合わないように、制約を適用します。オーバーラップを超えた動きを制限するアルゴリズムをいじっています。