読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

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

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

←(2)シーンの作成(2015.1改訂版)
(4)プレイヤーバーの実装(2015.1改訂版)→

Unityのキャラクタ

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

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

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

ジッドボディ(Rigidbody)

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

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

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

コライダー(Collider)

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

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

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

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

プレイヤーバー

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

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

ボール

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

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

ブロック

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

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

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

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

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

←(2)シーンの作成(2015.1改訂版)
(4)プレイヤーバーの実装(2015.1改訂版)→