tanaka's Programming Memo

プログラミングについてのメモ。

(3)登場するオブジェクトの動かし方

リッジドボディ(Rigidbody)とコライダー(Collider)

Unityでキャラクタを動かすための重要な機能に、リッジドボディ(Rigidbody)とコライダー(Collider)がある。リッジドボディは「剛体」という意味で、物理の力学の最初に出てきたようなことから、剛体同士が衝突した時の挙動など、さまざまな「剛体」の挙動をシミュレーションしてくれるものである。コライダーは衝突の検出や、衝突した時のその物の性質を設定するためのものである。

  • 一定方向に一定速度で動く等速直線運動。
  • ジャンプなどの重力落下である等加速度運動。
  • 衝突した時の動作。
  • ものを押した際の摩擦力の影響。
  • などなど

以上のような物理の力学で学んだようなことを簡単に実現してくれるのがリッジドボディの役目である。適切に設定をすれば、ほとんどプログラムを組まずに高度な物理処理をUnityが自動的に行ってくれる。

衝突がない場合はリッジドボディだけでよい。しかし、作用・反作用や摩擦力を計算するには、

  • 衝突したのか
  • どのように衝突したのか
  • お互いの形状がどういうものか
  • お互いの重量はどれぐらいか
  • 摩擦係数や弾性係数がどのぐらいか

などがわからなくてはならない。そういった衝突関連を扱うコンポーネントがコライダーである。物理法則に従わせる必要がなく、単に衝突したかだけを検出したい場合は、コライダーのみの実装でよい。どちらか一方にリジッドボディかキャラクタコントロールコンポーネントが必要(2015/2/3追記)

ブロック崩しに登場する個々のオブジェクトについて検討してみる。

プレイヤーバー

  • 左右キー、あるいはマウスの左右にあわせて左右に動く。
    • 物理法則を無視して、キーやマウスの入力に応じて直接座標を操作する。
  • 枠にぶつかると止まる。
    • Unityに任せたいので、リッジドボディが必要。
  • ゲームスタート時は、スペースを押すと、くっついているボールを発射する。
    • ゲームスタート時は、ボールを子オブジェクトにする。この時、ボールは物理法則に従わないようにする。

以上から、プレイヤーバーにはコライダーとリッジドボディを実装する。

ボール

  • 最初はプレイヤーバーにくっついて動く。
    • プレイヤーバーの子オブジェクトにして、物理法則が作用しないようにする。
  • 一度射出されると、一定方向に一定の速度で動く(等速運動)。
    • リッジドボディに任せる。
  • 壁やブロックにぶつかると、ぶつかり方に応じて跳ね返る。
    • リッジドボディに任せる。
  • プレイヤーバーにぶつかると跳ね返る。
    • リッジドボディに任せる。
  • 画面下に落下するとミスになる。

以上より、コライダーとリッジドボディを実装し、動きは殆どリッジドボディに任せる。

ブロック

  • ボールがぶつかると消える。
    • ボールとぶつかったかは、ボール側で検出させ、ブロックの消滅処理を呼び出させる。
  • 消えると点数が入る。
    • ブロックの消滅処理に実装。
  • 全部消えると面クリア。
    • ブロックの消滅処理に実装。

ブロックは衝突するだけで、物理力が作用しないようにしたい。こういった場合は、コライダーのみを実装して、リッジドボディは組み込まないでよい。

  • ボールやプレイヤーバーが跳ね返る。
    • ボールやプレイヤーバー側のリッジドボディに任せる。枠自体は物理法則に従う必要はない。

ブロックと同様、衝突はするが、物理的な力は受けない。よって、コライダーのみでリッジドボディは不要。枠はこの時点ですでに完成しているということになる。

以上のような方針で実装を進める。