Manuals
Manuals




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 3Box2D (Legacy Defold version)None のいずれかを選択します。既定では従来の実装が使われ、Box2D 3 を使用するには明示的に選択する必要があります。実装を変更するとシミュレーション結果が変わることがあり、バージョン固有の Box2D のプロジェクト設定を再調整する必要が生じる場合があります。

これらのマニュアルで説明する、コンポーネント(component)を用いたコリジョンオブジェクト(collision object)の扱い方と physics モジュールは、どちらの Box2D 実装でも利用できます。None を選択すると、2D 物理が除外されます。Defold は、2D のボディ、形状、ジョイント(joint)、チェーン、ワールドに直接アクセスするための、より低水準の b2db2d.bodyb2d.fixtureb2d.shapeb2d.jointb2d.chainb2d.world API も公開しています。すべての低水準関数が両方の Box2D 実装で利用できるわけではありません。各関数の生成された API ドキュメントを参照し、App Manifest で選択した実装で利用できるか確認してください。

Defold で使用する物理エンジンの主な概念は次のとおりです。

  • コリジョンオブジェクト - コリジョンオブジェクトは、ゲームオブジェクト(game object)に物理的な振る舞いを与えるために使用するコンポーネントです。コリジョンオブジェクトには、重さ、摩擦、形状などの物理的なプロパティがあります。コリジョンオブジェクトの作成方法をご覧ください
  • コリジョン形状(collision shape) - コリジョンオブジェクトは、複数のプリミティブ形状または1つの複雑な形状を使って、空間内で占める範囲を定義できます。コリジョンオブジェクトに形状を追加する方法をご覧ください
  • コリジョングループ(collision group) - すべてのコリジョンオブジェクトは、あらかじめ定義されたグループに属する必要があります。各コリジョンオブジェクトには、衝突できるほかのグループのリストを指定できます。コリジョングループの使用方法をご覧ください
  • 衝突メッセージ(collision message) - 2つのコリジョンオブジェクトが衝突すると、物理エンジンは、それぞれのコンポーネントが属するゲームオブジェクトにメッセージを送信します。衝突メッセージの詳細をご覧ください

コリジョンオブジェクト自体に加え、コリジョンオブジェクトの 拘束(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) を使用することもお勧めします。

注意点とよくある問題

コレクションプロキシ
コレクションプロキシ(collection proxy)を使うと、複数の最上位のコレクション(collection)、つまり ゲームワールド(game world) をエンジンに読み込めます。このとき、各最上位のコレクションが独立した物理ワールドであることを理解しておくことが重要です。物理的な相互作用(衝突、トリガーレイキャスト)は、同じワールドに属するオブジェクト間でのみ発生します。そのため、2つのワールドのコリジョンオブジェクトが画面上で完全に重なっていても、それらの間で物理的な相互作用は発生しません。
衝突が検出されない
衝突が正しく処理または検出されない問題がある場合は、デバッグマニュアルの物理のデバッグを必ず読んでください。