(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

浮力や水流を表現できるBuoyancyEffector2Dの使い方やパラメータ【Unity】【Effector2D】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.1f1 Personal

はじめに

今回はUnity5.3より追加されたBuoyancyEffector2Dのお話。

BuoyancyEffector2Dとは単純な流体の動きを設定出来る

というもので、浮力や水力を表現できる優れものです。



なお、名前の通りに2D用なのであしからず。


使い方

まずは簡単に使い方の説明です。

BuoyancyEffector2Dを使う時は、同じGameObjectにCollider2Dが必要になります。

また、Collider2DのUsedByEffectorを有効にする必要もあります。


f:id:kan_kikuchi:20160225135214j:plain


とりあえずこの状態で、適当なCollider2DとRigidBody2Dをつけたオブジェクトを

近づけると、以下のような感じになります。


f:id:kan_kikuchi:20160225075506g:plain


浮力で浮いてるのが分かると思います。


使用例

では、BuoyancyEffector2Dの使用例をいくつかご紹介。


浮力

既に最初の説明であげてしまったんですが、表題にもなっているの再度ご紹介。

浮力を表現するにはDensityに値を設定するだけです。

だたし、設定したDensityより密度が高いものは浮いてきません。


f:id:kan_kikuchi:20160225135221p:plain f:id:kan_kikuchi:20160223134345p:plain


上記の左の通りに力の発生源のパラメータを、

右にある通りに力を受けるオブジェクトのパラメータを設定した場合、

以下のような動きになります。


f:id:kan_kikuchi:20160225075551g:plain


水流

Flow Magnitudeを設定し、ボールに力を加える事で、水流のようなものを作ってました。


f:id:kan_kikuchi:20160225135229p:plain f:id:kan_kikuchi:20160223134345p:plain


上記の左の通りに力の発生源のパラメータを、

右にある通りに力を受けるオブジェクトのパラメータを設定した場合、

以下のような動きになります。


f:id:kan_kikuchi:20160225075629g:plain


パラメータ

次にBuoyancyEffector2Dのパラメータについて説明をば。


Collider Mask


エフェクトを適用するレイヤーを指定できます。


f:id:kan_kikuchi:20160217134559j:plain
f:id:kan_kikuchi:20160217134604j:plain
f:id:kan_kikuchi:20160225075653g:plain


上記の画像例だとRedというLayerにあるオブジェクトにのみエフェクトが適用

するように設定されています。


なお、Use Collider Maskが無効の時は全レイヤーにエフェクトが適用されます。


Surface Level

水位を設定する項目です。

水位より上にあるオブジェクトには力が適用されません。


f:id:kan_kikuchi:20160225075722g:plain


上記の例にある薄い水色の線がSurface Levelです。

Surface Levelに合わせてオブジェクトが浮き沈みしているのが分かると思います。


なお、Surface LevelはCollider2Dの範囲内でしか設定できないようです。


Density

密度を設定する項目です。

ここで設定した密度より、密度が高いオブジェクトは沈むようになります。


肝心のオブジェクトの密度ですが、

Rigidbody2DのMassとTransformのScaleによって決まるようです。


まず、Rigidbody2DのMassを比較すると以下のようになりました。


f:id:kan_kikuchi:20160225075811g:plain


上記の例はBuoyancyEffector2DのDensityは1、

オブジェクトのMassは左から1,2,3,4,5です。


Massが高いものほど沈むようになっているので、

Massが高いほど、密度が高くなっているのが分かるかと思います。


次にTransformのScaleを比較すると以下のようになりました。

f:id:kan_kikuchi:20160225075847g:plain


上記の例はBuoyancyEffector2DのDensityは1、オブジェクトのMassは全て5、

オブジェクトのScaleは左から10,15,20,25,30です。


Transformが小さいものほど沈むようになっているので、

Transformが大きいほど、密度が低くなっているのが分かるかと思います。


Linear Drag

エフェクターの影響を受けているRigidbody2DのLinerDragに加算される値です。

ようは、移動速度に水の抵抗を加える感じです。


f:id:kan_kikuchi:20160225075920g:plain


上記の例は左がLinear Drag 5、右がLinear Drag 0のものです。

Linear Dragが0だと減速しないのでトランポリンみたいになっているのが分かるかと思います。


ちなみにAreaEffector2DのDragと同じ効果ですが、名称が違うようです。


Angular Drag

Linear Drag と同様に、回転速度に空気抵抗を加える感じです。


Flow Angle

流れの角度を設定する項目です。


f:id:kan_kikuchi:20160225080227g:plain


Flow Magnitude

流れの強さを設定する項目です。


f:id:kan_kikuchi:20160225080317g:plain


Flow Variation

流れの強さのばらつきを設定する項目です。

もしFlow Variationが10なら+0~+10の値でFlow Magnitudeがランダムに変動

するようになり、力の加わり方が不規則になります。


f:id:kan_kikuchi:20160225080349g:plain


上記の例は上がFlow Variation 0、下が Flow Variation 100、Flow Magnitudeは共に40のものです。

下の方は毎回ボールの間隔が違うのが分かると思います。


おわりに

簡易的な水の表現だったらBuoyancyEffector2Dで十分ですね!


もっと本格的に表現したい場合は

Liquid Physics 2Dなどのアセットを使ってみるといいかもしれません(:3っ)∋〜