【Unity】RigidbodyのDrag(抵抗)を変えて水中を表現

【Unity】RigidbodyのDrag(抵抗)を変えて水中を表現

Rigidbodyの中で、物体の運動に対する抵抗を設定できるDrag

今回はそのDragの値を変化させて、水中を表現してみます。

アクションゲームとかでよくある、ステージ中に水中エリアが出てくる感じのアレです。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

4月末にUnity2018が出てたので早速使ってみました。

Rigidbodyについて

Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。

ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。

今回はその中でもDrag(抵抗)がテーマ。

Rigidbodyのパラメータ
Rigidbodyのパラメータ

 

Drag(抵抗)について

Dragは「抵抗」とか、「引きずる」といった意味の言葉。Unity的には、運動に対する抵抗として使われます。

この値が大きければ、Rigidbodyをアタッチしたオブジェクトの運動に抵抗がかかります。分かりやすい例だと、落下時の空気抵抗などがありますね。

公式のリファレンスでは、パラシュートを開いたらDragの値を大きくする例が載っていました。

今回はこのDragの値を変えたときに、オブジェクトの運動がどう変わるかを実験するとともに、アクションゲームでよく見る水中の表現を作ってみます。

転がる時の抵抗

RigidbodyのMass(質量)を変えて遊んだ時のように、いくつかのボールを用意し、そのDrag(抵抗)の値を変えて運動にどう影響するか確認してみます。

用意したボールは以下の6種類。

  • drag : 0
  • drag : 0.5
  • drag : 1
  • drag : 2
  • drag : 5
  • drag : 10

抵抗以外の値はRigidbodyをアタッチした時のデフォルトのものになっています。質量はみんな1です。

ボールをバウンドさせたかったので、物理特性マテリアルを用意しています。

ボタンを押すと全てのボールに同じ力が加わり、運動を開始するシーンを作って比較してみました。

ForceModeはImpulseとし、加えた力の大きさは画面左上に表示しています。

抵抗の異なるボールを転がす
抵抗の異なるボールを転がす

 

dragは抵抗の大きさなので、これが小さい値だと減衰することなく運動を続けます。

dragが10になると、動き出してもすぐに止まってしまいます。

同じ質量でも、dragの値によって結構差が出ますね。

 

斜方投射の時の抵抗

同じボールを使って、力を加える向きを変え、斜方投射してみます。

ForceModeは上と同じくImpulseとし、加えた力の大きさは画面左上に表示しています。

抵抗の異なるボールを斜方投射する
抵抗の異なるボールを斜方投射する

 

dragが0だと気持ちよく飛んで行きますが、5とか10だと壁に当たったかのように止まりますね。

X軸方向とY軸方向両方の力が0になって、自由落下で落ちているようにも見えます。着地までにX軸方向の運動が減衰しすぎると不自然な感じになっちゃうようです。

drag : 2あたりまでは、いわゆる空気抵抗のように見えます。

自由落下の時の抵抗

次は自由落下です。

重力以外には力が働いていない状態で自由落下させ、dragの値による影響を確認します。

抵抗の異なるボールを自由落下させる
抵抗の異なるボールを自由落下させる

 

上の記事で質量に関しての実験を行った際には、質量が異なっても、同じdragの値であれば同時に落ちました。

しかしdragを変えると明らかに差異が出ますね。

drag : 10にもなるとパラシュートを開いたかのようにゆっくりと落下します。

落下速度の調整にも使えそうですが、上昇時も含めて全ての運動でこの抵抗が発生するため、ちょっと考慮が必要かも。

 

水中の抵抗を表現

アクションゲームとかだと、若干操作が重くなってもどかしくなるような水中のステージは鉄板。

なので、超簡易だけど水中っぽい表現を作ってみました。今回は動きだけの表現なので、見た目を水中っぽくする場合はShader(シェーダー)をいじるべし。

やることは簡単で、水中エリアに入ったらDragを増やすだけ。水中に入ったことはOnTriggerEnterで検知できるので楽ちんです。

以下の画像では、画面中央の水色で半透明な部分が水中として、このオブジェクトに衝突したときにdragの値を3に変更しています。このオブジェクトを抜けたらdragの値を元に戻します。

斜方投射で水中に突入
斜方投射で水中に突入

 

上の斜方投射では、発射時にImpulseで力を加えています。一番奥の白いボールはもともとdragの値が0なので、水中に入る前に減衰がなく、かろうじて水中エリアを抜けています。

もともと0.5だったボールでも水中を抜け出せていません。dragの値による減衰って結構大きいですね。

 

続いて、一定の力を加え続けた場合も試してみました。ゲームを作るときには、コントローラーなどの操作によって一定の力が加わるケースの方が多いですもんね。

一定の力を加えるにあたって、ConstantForceコンポーネントをアタッチしています。スクリプトを書かなくてもいいので、ちょっとした検証なんかには便利。

ConstantForceコンポーネント
ConstantForceコンポーネント

 

一定の力で画面右に移動するオブジェクトだとこうなります。コントローラーの右キーをずっと押してるイメージね。

一定の力で水中に突入
一定の力で水中に突入

 

水中では動きが鈍り、水中エリアを抜けたら再び加速しています。なんとなくそれっぽい感じ。

これを調整していけば、水中っぽい表現もよりいい感じにできるはず。

なお、今回使ったdragを変えるスクリプトは以下のように記載しました。

水中エリア用のオブジェクトにはタグを設定しておき、そのタグを持った相手との衝突を検知します。ColliderではIsTriggerをtrueにしています。

やっていることは衝突に合わせてdragの値を変えているだけなので簡単。

まとめ

Rigidbodyのdragを変化させ、オブジェクトの運動にどう影響が出るのか実験してみました。

通常の運動のために設定しておくのはもちろんのこと、動的に値を変えてみても面白い表現ができそうです。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?