読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

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

重力や磁力を表現できるPointEffector2Dの使い方やパラメータ【Unity】【Effector2D】


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

この記事でのバージョン
Unity 5.3.0f4 Personal

はじめに

今回はUnity5より追加されたPointEffector2Dのお話。

PointEffector2Dとはあるポイントに対して力を適用する

というもので、簡単に重力や磁力を表現できる優れものです。




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


使い方

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

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

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

IsTriggerについても有効にしていないと、衝突判定が起こるので注意が必要です。


f:id:kan_kikuchi:20160225132419j:plain


とりあえずこの状態で、適当なColliderとRIgidBody2D(GravityScale = 0)をつけたオブジェクトを

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


f:id:kan_kikuchi:20160126060821g:plain


公転するように引っ張られて軌道が変わっているのが分かると思います。


使用例

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


重力

重力を表現するにはForce Magnitudeを-にし引力を発生させます。


f:id:kan_kikuchi:20160225132548p:plain f:id:kan_kikuchi:20160125134537p:plain


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

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

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


f:id:kan_kikuchi:20160126061824g:plain


磁力

次に磁力の反発をForce Magnitudeを+にして表現してみます。


f:id:kan_kikuchi:20160225132825p:plain f:id:kan_kikuchi:20160125134537p:plain


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

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

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


f:id:kan_kikuchi:20160126061847g:plain


エフェクターは同時に二つ付けられないようなので、

引力も発生させたい場合は別のオブジェクトを作成する必要がありそうです。


爆発

重力と磁力は永続的に力を発生させていましたが、

瞬間的に力を発生させる事で、爆発っぽくしてみました。


f:id:kan_kikuchi:20160225133213p:plain f:id:kan_kikuchi:20160125135155p:plain


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

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

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


f:id:kan_kikuchi:20160126061915g:plain


パラメータ

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


Collider Mask

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


f:id:kan_kikuchi:20160122133609j:plain
f:id:kan_kikuchi:20160122133615j:plain
f:id:kan_kikuchi:20160126060905g:plain


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

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


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


Force Magnitude

適用する力の大きさです。

値が大きいほどより強い力を対象に与える事になります。


f:id:kan_kikuchi:20160126061015g:plain


Force Variation

適用する力のばらつきです。

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

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


f:id:kan_kikuchi:20160126061131g:plain


上記の例は上がForce Variation 0、下が Force Variation 1のものです。


Distance Scale

これはイマイチ分からなかったので、以下のページをどうぞ。

Unity - スクリプトリファレンス:PointEffector2D.distanceScale

距離によって適用する力が変わる場合に、近い時と遠い時の力の差を調整するって事ですかね……?

しかし、数値をいじってみても違いが分かりませんでした。


Drag

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

ようは力とは別に、移動速度に空気抵抗も加える感じです。


f:id:kan_kikuchi:20160126061245g:plain


上記の例は上がDrag 0、下がDrag 1のものです。


Angular Drag

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


Force Source

力の発生源の中心を設定する。

RigidbodyとColliderは座標的にも、オブジェクト的にも別々になることがあるので

適宜設定する必要があります。


Force Target

力を適用する側の中心(?)を設定する。

Force Sourceの相手側verですね。


Force Mode

力の適用方法を設定する。

それぞれのModeの内容は以下の通りです。


Constant - 距離に関係なく一定の力

Inverse Linear - 離れるほど力が弱くなる、力の弱まり方は距離に対して線形

Inverse Squared -離れるほど力が弱くなる、力の弱まり方は距離の2乗、実世界の重力と同じ。


f:id:kan_kikuchi:20160126061334g:plain


上記の例は上からConstant、Inverse Linear、Inverse Squaredを並べたものです。

見ての通り、違いが出ていないっぽいので、スケールを10倍にしてみたのが以下の例です。


f:id:kan_kikuchi:20160126061443g:plain


おわりに

やっぱり見えない力が作用しているというか、重要な要素になってるゲームって面白いですよね。

特に重力。


と言う事でGRAVITY DAZE 2やりたい今日この頃です(:3っ)∋〜