(:3[kanのメモ帳]

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

ムービングウォークやエスカレーターを表現できるSurfaceEffector2Dの使い方やパラメータ【Unity】【Effector2D】


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

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

はじめに

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

SurfaceEffector2Dとはオブジェクトの表面に速度を設定する

というもので、簡単にムービングウォーク(動く歩道)やエスカレーターを表現できる優れものです。




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


使い方

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

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

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


f:id:kan_kikuchi:20160225134745j:plain


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

落とすと、以下のような感じになります。


f:id:kan_kikuchi:20160211071630g:plain


乗ったボールに速度が与えられて移動しているのが分かると思います。


使用例

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


ムービングウォーク

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

ムービングウォークを表現するにはSpeedに値を設定するだけです。


f:id:kan_kikuchi:20160225134758p:plain f:id:kan_kikuchi:20160209135422p:plain


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

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

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


f:id:kan_kikuchi:20160217060948g:plain


最初に挙げた例とは違い、

ボールの初速度をムービングウォークで流れる位置と逆の方向に設定しています。


エスカレーター


まずSurfaceEffector2Dを使わずにエスカレーター的なもの、

つまり上にオブジェクトを乗せた状態のオブジェクトを移動させる

と以下のよう感じになります。


f:id:kan_kikuchi:20160211071719g:plain


乗り物に付いていけず、ボールが落ちてしまっていますね。



なお、上下オブジェクトと共、Rigidbody2Dで動いており、

下のオブジェクトは以下のように開始時に速度を与えています。

private void Start () {
  GetComponent<Rigidbody2D> ().velocity = new Vector2(5, 5);
}


これを改善するためにSurfaceEffector2Dが使えます。

方法は移動速度と同速を接触しているオブジェクトに与えるだけです。


f:id:kan_kikuchi:20160225134811p:plain f:id:kan_kikuchi:20160210133828p:plain


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

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

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


f:id:kan_kikuchi:20160211071756g:plain


これで乗ったオブジェクトに付いていけるようになります。


パラメータ

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


Collider Mask


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


f:id:kan_kikuchi:20160210140113j:plain
f:id:kan_kikuchi:20160210140117j:plain
f:id:kan_kikuchi:20160211071842g:plain


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

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


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


Speed


オブジェクトの表面に設定する速度です。

値が大きいほどより速くなります。


f:id:kan_kikuchi:20160217061014g:plain


Speed Variation


オブジェクトの表面に設定する速度のばらつきです。

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

するようになり、速度が不規則になります。


f:id:kan_kikuchi:20160217061107g:plain


上記の例は上がSpeed Variation 0、下が Speed Variation 10、Speedは両方とも2のものです。


下の方は毎回ボールの間隔が違い、移動中も近づいたり離れたりしているのが分かると思います。

つまり、接しているオブジェクト毎に変動値が違うようです。


Force Scale

接しているオブジェクトに速度をどれだけ割合で変更するかっといった感じのものです。

0~1の値で設定でき、1の時は瞬時に速度を変更します。


f:id:kan_kikuchi:20160217061147g:plain


上記の例は上がForce Scale 0.1、下がForce Scale 1、Speedは両方とも5のものです。

Force Scale 1の場合は当たった瞬間にそれまでの速度と関係なく

設定された速度になっているのが分かると思います。


Use Contact Force

接している点に速度を適用するっというものです。

これを無効にしていると接しているオブジェクトの中心点に適用します


f:id:kan_kikuchi:20160217061243g:plain


上記の例は上がUse Contact Forceが無効、下がUse Contact Forceが有効のものです。


下のUse Contact Forceを有効にしている方は接点に速度を加えているために、

オブジェクトが回転してしまってる事が分かると思います。


Use Friction

摩擦を使用するかどうかの設定です。


f:id:kan_kikuchi:20160217061307g:plain


上記の例は上がUse Frictionが有効、下がUse Frictionが無効のものです。

下の方は摩擦が無いので、オブジェクトが回転していない事が分かると思います。


Use Bounce

バウンスをで使用するかどうかの設定です。


f:id:kan_kikuchi:20160217061328g:plain


上記の例は上がUse Bounceが有効、下がUse Bounceが無効のものです。


おわりに

機能は実にシンプルですが、2Dアクションゲーム作るのにはかなり重宝しそうなComponentでした。

これで何でも流し放題ですね(:3っ)∋〜


f:id:kan_kikuchi:20160211071531g:plain