この記事でのバージョン
Unity 5.3.1f1 Personal
目次
はじめに
今回はUnity5より追加されたPlatformEffector2Dのお話。
PlatformEffector2Dとは床の挙動を設定する
というもので、簡単に一方向の衝突判定、横方向の摩擦やバウンドを設定できる優れものです。
なお、名前の通りに2D用なのであしからず。
使い方
まずは簡単に使い方の説明です。
PlatformEffector2Dを使う時は、同じGameObjectにCollider2Dが必要になります。
また、Collider2DのUsedByEffectorを有効にする必要もあります。
とりあえずこの状態で、適当なColliderとRIgidBody2Dをつけたオブジェクトを
したから打ち上げると、以下のような感じになります。
下からだけ貫通しているのが分かると思います。
使用例
では、PlatformEffector2Dの使用例をいくつかご紹介。
下からだけ貫通する床
既に最初の説明であげてしまったんですが、表題にもなっているの再度ご紹介。
下からだけ貫通する床を表現するにはUse One Wayを有効にするだけです。
上記の左の通りに力の発生源のパラメータを、
右にある通りに力を受けるオブジェクトのパラメータを設定した場合、
以下のような動きになります。
側面は弾まない床
側面は弾まない床を表現するにはUse Side Bounceを無効にするだけです。
上記の左の通りに力の発生源のパラメータを、
右にある通りに力を受けるオブジェクトのパラメータを設定した場合、
以下のような動きになります。
弾む床を作りたいけど、横から当たったら乗れずに反対方向に吹っ飛ばされる
ってのを回避できますね。そういう場面に遭遇した事はまだありませんが……。
パラメータ
次にPlatformEffector2Dのパラメータについて説明をば。
Collider Mask
エフェクトを適用するレイヤーを指定できます。
上記の画像例だとRedというLayerにあるオブジェクトにのみエフェクトが適用
するように設定されています。
また、Is Triggerにチェックが入っていなくても、青い玉が底の部分と衝突していないので、
そもそも当たり判定自体がなくなるようです。
なお、Use Collider Maskが無効の時は全レイヤーにエフェクトが適用されます。
Use One Way
衝突を一方向にして、下から突き抜けるように設定します。
Use One Way Grouping
これはイマイチ分からなかったので、以下のページをどうぞ。
Unity - Scripting API:PlatformEffector2D.useOneWayGrouping
Use One Wayによって突き抜ける動作が全て同じ動作になると保証する、みたいな感じですかね?
ちなみに日本語のマニュアルはちょっと古いのか、Use One Way Groupingの項目がありません。
Surface Arc
床の中心の面を定義するするために、設定する円弧の角度です。
ようはコライダーが通ることのできない面を定義するという事らしいです。
……と思って以下のように角度の外側と内側から投げ入れてみたのですが、
ご覧の通り、両方とも貫通してしまっています。
解釈か、使い方か、なにが間違ってるのか分かりませぬ……。
------------追記
床の範囲を設定するのではなく、ボールの進入角度を設定するようです。
------------追記おわり
Use Side Friction
摩擦を側面で使用するべきかどうかの設定です。
上記の例は上がUse Side Frictionが有効、下がUse Side Frictionが無効のものです。
日本語のマニュアルだと「床側で使用するかどうか」になってるんですか、
これだと意味合いが違うような……。
Use Side Bounce
バウンスを側面で使用するべきかどうかの設定です。
上記の例は上がUse Side Bounceが有効、下がUse Side Bounceが無効のものです。
これも日本語のマニュアルだと「床側で使用するかどうか」になってますのでご注意をば。
Side Arc
側面がどこまでか、というの角度で設定する項目です。
上記の例では途中で
Side Arcを増やしたため、上の面も側面と判定され、バウンドしないようになっていますね。
なお、これも日本語のマニュアルにはまだ載っていない項目です。
おわりに
床を貫通と言えば以前、以下のような記事を書いていました。
プレイヤーのレイヤーを一瞬だけ当たり判定のない所に変更し、
それを戻すってやりかたで、すり抜けを実現してました。
PlatformEffector2Dを使えばこういう処理を書かないで済むってことですな〜(:3っ)∋〜