This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold には、2D 物理シミュレーション用の Box2D と、3D 物理用の Bullet が含まれています。App Manifest の Physics 2D 設定で、Box2D Version 3、Box2D (Legacy Defold version)、None のいずれかを選択します。既定では従来の実装が使われ、Box2D 3 を使用するには明示的に選択する必要があります。実装を変更するとシミュレーション結果が変わることがあり、バージョン固有の Box2D のプロジェクト設定を再調整する必要が生じる場合があります。
これらのマニュアルで説明する、コンポーネント(component)を用いたコリジョンオブジェクト(collision object)の扱い方と physics モジュールは、どちらの Box2D 実装でも利用できます。None を選択すると、2D 物理が除外されます。Defold は、2D のボディ、形状、ジョイント(joint)、チェーン、ワールドに直接アクセスするための、より低水準の b2d、b2d.body、b2d.fixture、b2d.shape、b2d.joint、b2d.chain、b2d.world API も公開しています。すべての低水準関数が両方の Box2D 実装で利用できるわけではありません。各関数の生成された API ドキュメントを参照し、App Manifest で選択した実装で利用できるか確認してください。
Defold で使用する物理エンジンの主な概念は次のとおりです。
コリジョンオブジェクト自体に加え、コリジョンオブジェクトの 拘束(constraint) も定義できます。これは一般的に ジョイント と呼ばれ、2つのコリジョンオブジェクトを接続し、動きを制限したり、ほかの方法で力を加えたりして、物理シミュレーション内での振る舞いに影響を与えます。ジョイントの詳細をご覧ください。
レイキャスト(ray cast) と呼ばれる方法で、直線状のレイに沿って物理ワールド(physics world)を調べ、情報を取得することもできます。レイキャストの詳細をご覧ください。
物理エンジンはニュートン力学をシミュレートし、メートル、キログラム、秒(MKS)の単位系で適切に動作するように設計されています。さらに、サイズが 0.1~10 メートルの範囲にある動くオブジェクトで適切に動作するように調整されており(静的オブジェクトはこれより大きくてもかまいません)、既定では1単位(ピクセル)を1メートルとして扱います。このピクセルとメートルの対応はシミュレーションの観点では便利ですが、ゲーム制作の観点ではあまり実用的ではありません。既定の設定では、サイズが200ピクセルのコリジョン形状は200メートルとして扱われます。少なくとも動くオブジェクトの場合、これは推奨範囲を大きく外れています。
通常、ゲーム内の一般的なオブジェクトのサイズで適切に動作するように、物理シミュレーションのスケールを調整する必要があります。物理シミュレーションのスケールは、game.project の物理のスケール設定で変更できます。たとえば、この値を 0.02 に設定すると、200ピクセルが4メートルとして扱われます。スケールの変更に合わせて、重力(これも game.project で変更します)を大きくする必要があることに注意してください。
安定したシミュレーションを実現するには、フレームレートに依存して不規則になる可能性がある間隔ではなく、一定の間隔で物理エンジンを更新することをお勧めします。game.project ファイルの Physics セクションにある Use Fixed Timestep 設定にチェックを入れると、物理を固定間隔で更新できます。更新頻度は、game.project ファイルの Engine セクションにある Fixed Update Frequency 設定で制御します。物理に固定タイムステップを使用する場合は、たとえば力を加えるなど、ゲーム内のコリジョンオブジェクトに働きかける処理に、ライフサイクル関数 fixed_update(self, dt) を使用することもお勧めします。