お役立ち情報

Unityのrigidbodyを使って物理演算を導入してみよう

Unityのrigidbody

Unityはゲーム開発に必要なあらゆるプラットフォームを備えたツールですが、物理演算もほぼ自動でできてしまいます。その物理演算に使用するツールがrigidbodyです。物理演算自体は数学や物理の知識がないと難しいものなのですが、rigidbodyを使えばそれが簡単に実現できるので深く考える必要はありません。

ゲームなので物理法則は無視で良いという場合もありますが、リアリティを追求するゲームの場合物理演算で正確な物理法則に従った方が良いでしょう。たとえばここ数年はモンスターストライクが流行っていますが、Unityのrigidbodyを使えばモンストのようなひっぱりアクションも実現しやすいです。

ひっぱった際の速度や入射角、反射角、といったものが正確な方がユーザーは動きを予測しやすく、考えながら操作するのが楽しいからです。逆に言えば、たとえば反射する角度がおかしいとユーザーは狙った場所にキャラをはじきにくく、仮に不自然な角度に慣れたとしても違和感は残るはずです。

たとえゲームであっても、物理演算によって正確に物理法則を再現した方が良い場合が多いということです。

rigidbodyの使い方

rigidbodyは動かしたいオブジェクトに対して付けるものなので、まずはオブジェクトを作る必要があります。たとえば地面にボールをぶつけるとすると、以下のようにオブジェクトを作ります。

地面の作り方
「Hierarchy上で右クリック」→ 3DObject → Cube
Position,Rotationは(0,0,0)とし、Scaleは(5,1,5)とする(だいたいの目安なので、数字は違っていても問題ありません。)

ボールの作り方
「Hierarchy上で右クリック」→ 3DObject → Sphere
Position(0,5,0)(数字は適当なので変えても問題ありません。)

これで地面とボールのオブジェクトが作られました。そして、ボールに対してrigidbodyを設定していきます。手順は以下のようになります。

ボールを選択 → AddComponentボタンを押す → rigidbodyを検索し、出てきたrigidbodyを選択

これでrigidbodyを追加しました。デフォルトではボールが落下するようになっています。ここに、たとえば跳ねる機能などを追加して、よりリアリティを出すことができます。

ボールに跳ねる機能を追加する

ボールが跳ねるようにするためには、PhysicMaterialというものを作ります。マテリアルに対してrigidbodyを設定してさらにPhysicMaterialとマテリアルが出てくるのでややこしいのですが、用語の意味合いはあまり気にしない方が良いかもしれません。

操作していれば流れ的に慣れてくるので、それで良いかと思います。PhysicMaterialの作り方は簡単で、以下のようにします。

プロジェクト上で右クリック → Create → PhysicMaterial をクリック

そうすると、反発係数などを設定できる画面が出てきます。設定値を入力して実行すると、ボールが跳ねるようになります。またボールを複数置いた場合ボール同士がぶつかりますが、その際の跳ね方なども物理演算で自動的に計算されます。

rigidbodyのパラメータ

rigidbodyの一例を紹介しましたが、rigidbodyではいろいろなパラメータを設定することが可能です。たとえば、以下のようなものが挙げられます。

・Mass
物体の質量(Kg単位)。値が小さければ、力を与えられたときに加速度が大きくなります。値が小さければ小さいほど動かしやすく、逆に大きければ大きいほど動かしにくくなるということです。

・Drag
力により動く際に、発生する空気抵抗の大きさです。最小値は0で、初期値も0になっています。0の場合は空気抵抗がまったくない状態です。最大値はInfinityで、無限大ということになります。無限大だと抵抗が大きすぎてまったく動かないので、設定することはあまりないでしょう。

・AngularDrag
回転する際に、オブジェクトに影響する空気抵抗の大きさを表します。上のDragと何がちがうのかと思われるかもしれませが、ボールのような物体は地面を転がっていても思うように摩擦力が働きません。そのためDragではなくこのAngularDragを大きめに設定しておけば、地面を転がっているときの摩擦力を大きくすることが可能です。

・UseGravity
チェックを入れるとオブジェクトは重力の影響を受け、逆にチェックを外すと無重力状態になります。重力の大きさは物理演算マネージャーから設定することが可能です。具体的には、メニューバーから[Project Settings] →[Physics]と選択していきます。

・IsKinematic
物理特性エンジンによって駆動されず、Transformによって操作します。IsKinematicがtrueだと物理演算の影響を受けず、falseだと影響を受けます。

・Interpolate
物理演算の精度に関する処理の選択を行うパラメータです。デフォルトではNoneとなっており、補完が行われない状態です。

・CollisionDetection
壁の貫通を予防する処理の選択を行います。

・Constraints
X,Y,Z軸ごとに、Rigitbodyの影響を受けるか受けないかを選択できます。デフォルトではNoneとなっており、補完が行われない状態です。

また上で紹介したPhysicMaterialでも複数のパラメータ設定が可能なので、紹介します。

PhysicMaterialのパラメータ

・DynamicFuiction
すでに移動中の場合に使用される摩擦の設定です。

・StaticFriction
静止したままの場合に使用される摩擦の設定です。

・Bounciness
跳ね返し度合いを決定します。

・FrictionCombine
衝突するオブジェクト間の摩擦をどう処理するかを決定できます。

・BounceCombine
オブジェクト間の跳ね返し度合いをどう処理するかを決定できます。

パラメータについては単にGUIで設定するだけなので、それほど難しくはないかと思います。ここでざっと見ておけばいざパラメータ設定する際にもスムーズにいくかと思います。もしも各パラメータが何だったか忘れた場合もネットで検索すれば一瞬で探すことができ、また自分のやりたいことを実現するためにどのパラメータを変えれば良いのかについても検索すればすぐに情報が見つかるでしょう。

まとめ

以上、rigidbodyについて解説してきました。rigidbodyは絶対に細かく設定しなければならない部分ではないのですが、ゲームの精度、リアリティを挙げるためにはこだわりたい部分です。

冒頭で紹介した通りモンストの反射角がでたらめだと面白くないですし、モンストの場合キャラクターによってひっぱり具合と勢いの設定も異なっています。モンストのような二次元ゲームならまだしも、三次元のゲームになればなおさらリアリティがあるかないかでユーザーの印象が変わってきます。

ぜひrigidbodyをいろいろ試してみて、リアリティの高いゲームを実現してください。とはいっても自分で物理演算を行う必要はないので簡単です。

 

【Unity関連記事】
▼Unityの基礎編
・ 【unityのフリーランス求人・案件情報】エンジニア需要や開発単価、未経験でもいける?
・ 【unity入門】ゲーム開発だけじゃない、Unityで出来ること

▼Unityの外部アセット、リソース編
・ UnityでMMDモデルを自由自在に動かしてみよう!
・ Unity adsを使って簡単に広告を導入しよう
・ Unityのアセットストアの上手な使い方
・ Unityで作られているARアプリをまとめてみました

▼Unityのコンポーネント編
・ (この記事)nityのrigidbodyを使って物理演算を導入してみよう
コードを使わずにUnityでキャラ追従のカメラを作る方法
・ Unityで簡単にアニメーションを作成する方法をまとめました
・ Unityでオブジェクトを回転させる方法をわかりやすくまとめました
・ Unityのtransformを使ってオブジェクトの座標や回転を操作する
・ Unityのアニメーターを簡単に作成する方法まとめ
・ UnityのShaderの解説と使い方まとめました
・ Unityで「当たり判定」(衝突判定)を付ける方法
・ Unityのgetcomponentの上手な使い方と使用時の注意点まとめ
・ Unityでキャラの移動を制御する方法まとめ
Unityのraycastを使って出来ることをまとめました

▼Unityのデフォルト機能、ゲーム製作編
blenderで作ったオブジェクトをUnityで組み込んでみよう
・ Unityのコルーチンとは?使い方をまとめました
Unityで作られているRPGゲームを作るための6つのステップ
・ Unityのパーティクルを使って演出できるエフェクト例
・ UnityでのUIデザインの基礎をまとめてみました
Unityのcloud buildの便利な点をまとめました
・ Unityを使って半日でFPSゲームを作ってみよう

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ