この記事でのバージョン
Unity 5.3.1f1 Personal
目次
はじめに
今回はUnity5.3より追加されたBuoyancyEffector2Dのお話。
BuoyancyEffector2Dとは単純な流体の動きを設定出来る
というもので、浮力や水力を表現できる優れものです。
なお、名前の通りに2D用なのであしからず。
使い方
まずは簡単に使い方の説明です。
BuoyancyEffector2Dを使う時は、同じGameObjectにCollider2Dが必要になります。
また、Collider2DのUsedByEffectorを有効にする必要もあります。
とりあえずこの状態で、適当なCollider2DとRigidBody2Dをつけたオブジェクトを
近づけると、以下のような感じになります。
浮力で浮いてるのが分かると思います。
使用例
では、BuoyancyEffector2Dの使用例をいくつかご紹介。
浮力
既に最初の説明であげてしまったんですが、表題にもなっているの再度ご紹介。
浮力を表現するにはDensityに値を設定するだけです。
だたし、設定したDensityより密度が高いものは浮いてきません。
上記の左の通りに力の発生源のパラメータを、
右にある通りに力を受けるオブジェクトのパラメータを設定した場合、
以下のような動きになります。
水流
Flow Magnitudeを設定し、ボールに力を加える事で、水流のようなものを作ってました。
上記の左の通りに力の発生源のパラメータを、
右にある通りに力を受けるオブジェクトのパラメータを設定した場合、
以下のような動きになります。
パラメータ
次にBuoyancyEffector2Dのパラメータについて説明をば。
Collider Mask
エフェクトを適用するレイヤーを指定できます。
上記の画像例だとRedというLayerにあるオブジェクトにのみエフェクトが適用
するように設定されています。
なお、Use Collider Maskが無効の時は全レイヤーにエフェクトが適用されます。
Surface Level
水位を設定する項目です。
水位より上にあるオブジェクトには力が適用されません。
上記の例にある薄い水色の線がSurface Levelです。
Surface Levelに合わせてオブジェクトが浮き沈みしているのが分かると思います。
なお、Surface LevelはCollider2Dの範囲内でしか設定できないようです。
Density
密度を設定する項目です。
ここで設定した密度より、密度が高いオブジェクトは沈むようになります。
肝心のオブジェクトの密度ですが、
Rigidbody2DのMassとTransformのScaleによって決まるようです。
まず、Rigidbody2DのMassを比較すると以下のようになりました。
上記の例はBuoyancyEffector2DのDensityは1、
オブジェクトのMassは左から1,2,3,4,5です。
Massが高いものほど沈むようになっているので、
Massが高いほど、密度が高くなっているのが分かるかと思います。
次にTransformのScaleを比較すると以下のようになりました。
上記の例はBuoyancyEffector2DのDensityは1、オブジェクトのMassは全て5、
オブジェクトのScaleは左から10,15,20,25,30です。
Transformが小さいものほど沈むようになっているので、
Transformが大きいほど、密度が低くなっているのが分かるかと思います。
Linear Drag
エフェクターの影響を受けているRigidbody2DのLinerDragに加算される値です。
ようは、移動速度に水の抵抗を加える感じです。
上記の例は左がLinear Drag 5、右がLinear Drag 0のものです。
Linear Dragが0だと減速しないのでトランポリンみたいになっているのが分かるかと思います。
ちなみにAreaEffector2DのDragと同じ効果ですが、名称が違うようです。
Angular Drag
Linear Drag と同様に、回転速度に空気抵抗を加える感じです。
Flow Angle
流れの角度を設定する項目です。
Flow Magnitude
流れの強さを設定する項目です。
Flow Variation
流れの強さのばらつきを設定する項目です。
もしFlow Variationが10なら+0~+10の値でFlow Magnitudeがランダムに変動
するようになり、力の加わり方が不規則になります。
上記の例は上がFlow Variation 0、下が Flow Variation 100、Flow Magnitudeは共に40のものです。
下の方は毎回ボールの間隔が違うのが分かると思います。
おわりに
簡易的な水の表現だったらBuoyancyEffector2Dで十分ですね!
もっと本格的に表現したい場合は
Liquid Physics 2Dなどのアセットを使ってみるといいかもしれません(:3っ)∋〜
また、見栄えを水っぽくしたい場合はWaterRWというUnityで使える2D水シェーダーがオススメです。