Unityでのゲーム開発 〜Rigidbody+αとCharacterController〜
Rigidbody+αとCharacterController
今回はRigidbody+α(〇〇Collider)とCharacterControlle使用方法と違いについてを見ていきたいと思います。
前置きとしてRigidbody+α(〇〇Collider)とCharacterControlleどちらが優れているかではありません、使用用途によって使い分ける事が一番大事だと思います。
Rigidbody
Rigidbodyをオブジェクトに追加すると、Unityの物理エンジンの制御を出来る様になります。Rigidbodyを付けたオブジェクトは重力の働きを追加する事が出来ます。
+αでColliderコンポーネントも存在する場合は、他のオブジェクトとの衝突にも反応させる様に出来ます。
下記で記述していますが、衝突時の挙動なども細かく設定可能な為、コードの記述量などは増えますが現実的に近い表現も可能になります。
前の記事でも触れましたがスクリプトを書く場所は、FixedUpdateに記載して設定を変更する場所とすることが推奨されます(対照的にUpdateは、その他ほとんどのフレーム更新作業で使用されます)。理由は、物理挙動の更新が時間進行単位で行われている為、フレーム更新は関係ないからだそうです。FixedUpdateは物理挙動更新の直前に呼び出されるため、その中で行ったどのような変更も直接反映されます。
RigidbodyのInspector内の詳細
- Mass・・・物体の質量(Kg 単位) *物の体重だと思えば分かりやすいと思います
- Drag・・・力によって動く際に、オブジェクトに影響する空気抵抗の大きさ。0の場合、空気抵抗は0。無限の場合、オブジェクトは動きを止めます。
*Drag 値が低いと、オブジェクトが重く見えるようになります。この値が高いと、軽く見えます。 Drag の通常の値は、.001(金属の塊)と10(羽) の間です。
- Angular Drag・・・トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗は 0。このパラメーターの値を無限に設定するだけでは、オブジェクトの回転を止められないことに注意してください。
- Use Gravity・・・有効にすると、オブジェクトは重力の影響を受けます。
- Is Kinematic・・・有効にすると、オブジェクトは物理エンジンによって駆動されず、その Transform によってのみ操作されます。これは、プラットフォームを移動したい場合や、Hinge Joint を加えたリジッドボディをアニメーション化したい場合に便利です。
- Interpolate・・・リジッドボディの動きがぎこちないとき、以下のオプションの1つを利用すると改善する場合があります。
- None 補間を適用しない。
- Interpolate 前フレームのTransformにもとづいてTransformをスムージングします。
- Extrapolate 次のフレームのTransformを予測してTransformをスムージングします。
- Collision Detection・・・これを使用すると、高速で動くオブジェクトが、衝突を検知せずに他のオブジェクトをすり抜けてしまうことを防ぎます。
- Discrete これを選択すると、シーン内のすべてのコライダーに対し Discrete (離散型) 衝突検知を使用します。他のコライダーがこのリジッドボディに対して衝突をテストするときには、離散型衝突検知を行います。一般的な衝突に使用します (デフォルト)。
- Continuous これを選択すると、動的なコライダー (リジッドボディあり) に対しては離散型衝突検知を使用し、静的メッシュコライダー (リジッドボディなし) に対してはスイープに基づく Continuous (連続型) 衝突検知を使用します。Continuous Dynamic (連続型かつ動的) に設定されたリジッドボディは、このリジッドボディに対する衝突のテストには連続型衝突検知を使用します。その他のリジッドボディは、離散型衝突検知を使用します。このオプションは、Continuous Dynamic に設定されたリジッドボディが衝突するオブジェクトに使用します。(この設定は物理演算のパフォーマンスに大きく影響するため、高速なオブジェクトの衝突で問題がない場合は Discrete の設定のままにしてください。)
- Continuous Dynamic これを選択すると、Continuous や Continuous Dynamic を適用したゲームオブジェクトに対して、スイープに基づく 連続型衝突検知を行ないます。静的なコライダー (リジッドボディなし) にも連続型衝突検知を適用します。その他のコライダーについては、離散型衝突検知を行ないます。高速で動くオブジェクトに使用します。
- Continuous Speculative これを選択すると、リジッドボディとコライダーに対する投機的な連続衝突検出を使用します。これは、キネマティックなボディを設定できる唯一の CCD モードです。この方法は、スイープに基づく連続衝突検出よりも負荷が少なくなる傾向があります。
- Constraints リジッドボディの動きに関する制限。
- Freeze Position ワールド座標の選択した軸でリジッドボディの移動を停止します。
- Freeze Rotation ローカル座標の選択した軸でリジッドボディの回転を停止します。
〇〇Collider(コライダー)
コライダーは、衝突を発生させるために必要なリジッドボディとともに加える、もう1つのコンポーネントです。2つのリジッドボディが衝突する場合、両方のゲームオブジェクトにコライダーが設定されていないと物理エンジンは衝突を計算できません。コライダーのないリジッドボディは、物理特性シミュレーションで互いにすり抜けてしまいます。
AddComponent⇨Physics メニューでコライダーを加えます。コライダーには複数の種類があります。
- Box Collider・・・キューブ(箱型)形状
- Sphere Collider・・・スフィア(球体型)形状
- Capsule Collider・・・カプセル型の形状
- Mesh Collider・・・メッシュ(ゲームオブジェクトと同じ形)からコライダーを作成します、メッシュコライダーとは衝突できません
- Wheel Collider・・・特に、車両やその他の移動する乗り物用
- Terrain Collider・・・Terrain との衝突を処理します
*今回はCapsule Colliderを例に見てみます
- Is Trigger・・・オンにすると、コライダーはイベントのトリガーとなり、物理エンジンにより無視されます。
- Material・・・使用する 物理マテリアル への参照。物理マテリアルによりコライダーが他と衝突したとき、どのように相互作用するかが決定されます。
- Center・・・コライダーの位置。
- Radius・・・コライダーの半径。
- Height・・・コライダーの高さ。
- Direction・・・オブジェクトの軸の向き。
CharacterController
CharacterControllerは簡単に基本的な機能の実装が可能な為、ある程度の物理的な法則を無視してでも動かす事が出来ます。
- Slope Limit・・・コライダーが、指定した値以下の勾配(単位は度)のみを登るよう制限します。
- Skin width・・・2つのコライダーが、Skin Width の深さまで互いに食い込みます。Skin Width が大きくなると、ジッタが減ります。Skin Width が小さいと、キャラクターが動けなくなる場合があります。値を Radius の 10% に設定しておくとよいでしょう。
- Min Move Distance・・・キャラクターが指定された値未満で動こうとしても、まったく動きません。これは、ジッタを減らすのに利用できます。ほとんどの場合、この値は 0 のままにしておいてください。
- Center・・・これにより、ワールド空間でカプセルコライダーをオフセットしますが、キャラクターがどのように旋回するかには影響しません。
- Radius・・・カプセルコライダーのローカル半径。これは基本的にコライダーの幅となります。
- Height・・・キャラクターの カプセルコライダーの高さ。この値を変更すると、正負の方向で Y 軸に沿ってコライダーが拡大縮小されます。
結論としてRigidbody+αとCharacterControllerは用途でプロジェクトによって使い分けるといいと思います。
(*´ω`*)
当記事はアクションを細かく実装したいのでRigidbodyを活用するとうまく行くと思ったので、こちらをメインで使用したいと思っています。
簡単な横スクロールだったり、激しい動きが要求されないゲーム性ならCharacterControllerを使用しコードの記述を少なくエラー解消や修正がしやすい点もメリットになると思います。