Bard は楽して暮らしたい

ゲームを作って思うこと、ゲームを遊んで思うこと

Unity

【Unity】Rigidbody や Collider の設定により変化する、当たり判定の性質 前編

投稿日:2018年2月7日 更新日:

Unity の機能の中でも、基礎中の基礎とも言える Collision。

参考書の通りにやれば、物理演算に基づいたそれらしい挙動は作れるのですが、実際のところ『Rigidbody』や『Collider』の設定によって細かく挙動の種類分けがなされており、これらをいじっていると、オブジェクト同士が衝突したりしなかったりで苦戦することがあります。

今回は、これらの設定によって変化する『当たり判定の性質の種別』をまとめてみます。

試行環境:Unity 2017.2.1p2

前編』である本稿は、前準備としての基礎知識。

後編』は↓の公式ドキュメントにある内容の一部について取り上げます。

コライダー – Unity マニュアル

 

1. Rigidbody と Collider について

Unity の当たり判定において基礎となる2つの Component。

どちらがどういった要素を持っているか混同してしまうこともあるかも知れませんが、ざっくりとした認識は以下のような感じ。

  • Rigidbody:『物理的性質』(質量、重力影響、回転可能軸、etc…)
  • Collider:『当たり判定の座標情報』(当たり判定の 中心、大きさ、etc…)

Collider』は当たり判定の形によって『Box Collider』や『Sphere Collider』など様々な種類があり、重複も含めて1つのオブジェクトに複数の『Collider』を持たせることもできるようです。対して『Rigidbody』は、1つのオブジェクトに1つしか持たせることはできません。

またそれぞれに対応する形で、厚みを持たない 2D 用の『Rigidbody 2D』や『Collider 2D』各種も存在します。

1.1. Rigidbody がもつ要素

全部解説するとキリが無いので、それぞれ知りたい方は公式ドキュメントへ。

Rigidbody – Unity マニュアル

今回注目したいのは『Is Kinematic』。これのチェック状況によって、オブジェクトの挙動が大きく変化します。

具体的には『Is Kinematic』のチェックが

  • OFF物理演算に支配された挙動
  • ONスクリプトに支配された挙動

になります。もう少し詳しい内容は後編で。

ちなみに『Rigidbody 2D』では『Is Kinematic』のチェックボックスは存在せず、『Body Type』という項目で選択式となっています。

Rigidbody』における『Is Kinematic』のチェック状況と対応づけると、

  • Dynamic:『Is Kinematic』の チェック OFF
  • Kinematic:『Is Kinematic』のチェック ON

にそれぞれ対応します。『Static』については後編で。

1.2. Collider がもつ要素

こちらも同様に、一部の要素のみ取り上げます。公式ドキュメントはこちら(一例として Box Collider のもの)。

Box Collider – Unity マニュアル

こちらで注目したいのは『Is Trigger』。

これを ON にすると、物理演算の支配下において「実体を持たない = 他のオブジェクトが当たり判定に入っても、衝突や反発をしない」ようなオブジェクトとして扱われます。

Is Trigger』という名前からもわかる通り、Unity 側としては「この範囲にキャラクターが入ったら~」→「会話イベントが発生する、敵が動き出す、etc…」といった『発生トリガー』的な使い方を想定していると思われます。

また Unity に慣れないプログラマが気を付けないといけないのが、スクリプト側で呼び出されるコールバック関数が『Is Trigger』の ON/OFF 状況 によって異なる、という点です。

  • OFF:『OnCollision ~』系の関数
  • ON:『OnTrigger ~』系の関数

↓具体的にはこんな感じ。


using UnityEngine;

public class CollisionTest : MonoBehaviour
{
    // Is Trigger : OFF.
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("Is Trigger : OFF で, 当たり判定に入ったとき.");
    }
    private void OnCollisionStay(Collision collision)
    {
        Debug.Log("Is Trigger : OFF で, 当たり判定に入っている間.");
    }
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("Is Trigger : OFF で, 当たり判定から抜けたとき.");
    }

    // Is Trigger : ON.
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Is Trigger : ON で, 当たり判定に入ったとき.");
    }
    private void OnTriggerStay(Collider other)
    {
        Debug.Log("Is Trigger : ON で, 当たり判定に入っている間.");
    }
    private void OnTriggerExit(Collider other)
    {
        Debug.Log("Is Trigger : ON で, 当たり判定から抜けたとき.");
    }
}

 

OnCollision ~』系と『OnTrigger ~』系で、渡される引数の型が異なる点に気を付けましょう。

  • OnCollision ~Collision
  • OnTrigger ~Collider

↓それぞれの詳しい内容は、公式ドキュメントへ。

Collision – Unity スクリプトリファレンス

Collider – Unity スクリプトリファレンス

 

後編では、本題である「Rigidbody の設定による挙動の分岐」について、もう少し詳しく取り上げます。

【Unity】Rigidbody や Collider の設定により変化する、当たり判定の性質 後編

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

UnityChanLicenseLogo

【Unity】Unite Tokyo 2018 見てきた講演の簡単なまとめ 3日目

間が空いてしまいましたが、Unite Tokyo 2018 3日目 のまとめです。 前回(2日目のまとめ)はこちら 目次さては非同期だなオメー!async/await完全に理解しようスクリプトによるT …

BitSummit Vol.6

【ゲーム雑記】BitSummit Vol.6 を経て、期待のインディーゲーム一覧 後編

少し間が空いてしまいましたが、先月、京都で開催された BitSummit Vol.6 へ行ってきました。 その中で、プレイしたタイトルの感想や、未プレイながら目を引いたタイトルの紹介をしていきたいと思 …

BitSummit Vol.6

【ゲーム雑記】BitSummit Vol.6 を経て、期待のインディーゲーム一覧 前編

少し間が空いてしまいましたが、先月、京都で開催された BitSummit Vol.6 へ行ってきました。 その中で、プレイしたタイトルの感想や、未プレイながら目を引いたタイトルの紹介をしていきたいと思 …

UnityChanLicenseLogo

【Unity】Timeline 機能 Playable Track 用のスクリプトを書く際の基礎

最近 Unity の Timeline 機能について触れる機会が多く、基礎的な部分について社内 Wiki に情報を書いたりしていたので、コピペ的に再利用してまとめておきます。   試行環境: …

【Unity】Rigidbody や Collider の設定により変化する、当たり判定の性質 後編

Unity の機能の中でも、基礎中の基礎とも言える Collision。 参考書の通りにやれば、物理演算に基づいたそれらしい挙動は作れるのですが、実際のところ『Rigidbody』や『Collider …