tanaka's Programming Memo

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

(3)登場するオブジェクトの動かし方の方針(Unity5.0版)

前へ | 次へ

Unityのキャラクタ

Unityでキャラクタを制御する時は、リジッドボディ(Rigidbody)コンポーネントか、キャラクタコントローラ(Character Controller)コンポーネントを利用すると楽である。傾斜のある床や階段のような段差を登らせたい場合はキャラクタコントローラを利用し、それ以外の時はリジッドボディを利用するとよい。

複数のキャラクタの接触を判定したり、接触時の物理挙動をシミュレーションするには、コライダー(Collider)コンポーネントを利用する。

ブロック崩しでは、床を登る必要はないので、リジッドボディとコライダーを利用する。

ジッドボディ(Rigidbody)

ジッドボディを日本語に訳すと「剛体」であり、以下のような物理挙動をシミュレーションしてくれる機能である。

  • 一定速度で移動する等速直線運動
  • 重力落下などに使える等加速度運動
  • ものを押した際の摩擦
  • 衝突した時に跳ね返らせる弾性衝突
  • などなど

適切に設定をすれば、ほとんどプログラムを組まずに高度な物理処理をUnityが自動的に行ってくれる。単体のものを動かしたり、接触した時の挙動を自前で実装する場合は、リジッドボディのみで実現できる。

コライダー(Collider)

2つ以上のものが接触して、作用・反作用や摩擦力を計算するには、リジッドボディに加えて、コライダーを追加する。コライダーには以下のような機能がある。

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

コライダーを機能させには、衝突するオブジェクトの最低一方に、リジッドボディかキャラクタコントローラを持っている必要がある。

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

プレイヤーバー

  • 左右キー、あるいはマウスの左右にあわせて左右に動く
    • キーやマウスの入力に応じて、移動速度をリジッドボディの速度(rigidbody.velocity)に代入する
    • 実際の移動や当たり判定処理は、リジッドボディとコライダーに任せる
  • 枠にぶつかると止まる
    • Unityに任せたいので、リッジドボディが必要
  • ゲームスタート時はボールがバーにくっついて移動し、スペースキーで発射する
    • ゲームスタート時は、ボールを子オブジェクトにして、物理法則が作用しないようにする

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

ボール

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

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

ブロック

  • ボールがぶつかると消える
    • ボールとぶつかったかは、ブロックの接触で判定する
  • 消えると点数が入る
    • ブロックの消滅処理に実装
  • 全部消えると面クリア
    • ブロックの消滅処理に実装

ブロックは衝突するだけで、物理シミュレーションはしない。接触相手のボールにリジッドボディが設定されているので、ブロックにはコライダーのみでよい。

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

ブロックと同様、衝突はするが、物理シミュレーションは不要。よって、コライダーのみでよい。つまり、枠は(2)で作ったままでよい。

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


前へ | 次へ