mayonage-koboの日記

我ら真夜中ゲーム工房の進捗と、ゲーム開発のメモを残しておくブログ

unity2dでレイヤーを使ってキャラ同士をすり抜けさせたり上をすり抜ける床を作る(2014/12/10)

hisojiです。タイトルながい。
今日は衝突判定方面を色々やりました。簡単に言うとレイヤーを弄りました。
すりぬけ床についてはこの記事の後半に書いてあります。

実は今までunityのレイヤーとかいう機能を知らなかったので必死に「unity collider すり抜け」とか「unity 床 すり抜け」で検索してました。「なぜか床をすり抜ける」とかは出るんだけどね。上手く出ませんね。よく見たら「レイヤー」っていう単語自体は検索結果に出てたはずなんだけどね。イラスト方面で聞いてるはずなんだけどね。

キャラ同士をすり抜けさせる

ゲーム内では2人のキャラを交互に使っていきます。その時にキャラ同士がぶつかり合うと色々不便なので、「他の物体と衝突判定をしつつキャラクター同士の衝突は避ける」みたいなことがしたいです。

f:id:mayonage-kobo:20141211000231p:plain
こんな風にぶつかってないやつ。

方法として、レイヤーを使います。(Unity4.5.5f1)
まずはInspector->Layer->Add layer...で新しいレイヤーを追加します。名前は任意なのでCharacterとかにします。
その後2人のキャラのLayerにCharacterを設定します。
f:id:mayonage-kobo:20141211000457p:plain
そして、レイヤー毎の衝突判定を設定します。上部メニューよりEdit->Project Settings->Physics 2Dで開き、Layer Collision Matrixの欄を設定します。
f:id:mayonage-kobo:20141211001155p:plain
で、縦と横がCharacterの欄のチェックを切ります。この行列によって、各レイヤー同士の物体が衝突判定するかどうかを設定することが出来ます。
起動すると、無事キャラ同士が干渉しなくなりました。よかったね。
やり方を知っていれば簡単なんですが、方法を探すまでが難しかったです。←人に聞こう

こちらも参考に

上方向にすり抜ける床

(2014/12/13追記)
後から調べたところ、シンプルな解決策が紹介されていました。とりあえず下記のサイトをご参照ください。
Unity3D - 一方通行なコライダ - Qiita
Eficient one-way collider - Unity Answers
Physics2D.IgnoreCollisionはcollider同士の衝突判定の有効、無効を設定出来ます。床とは別にトリガーのcolliderを用意し、入ったら衝突判定を無効にして、トリガーから出た瞬間に再度有効とすれば上手くすり抜けてくれます。これはすごい。
よって下で行われた試行錯誤は御用となってしまいましたが残しておきます。というかそろそろUnityの関数一覧とか全部見といたほうがいい気がする。


(以下、実装案の1つとして)


何かよくアクションであるような「上からジャンプしたらすり抜けるけど下からは通れない(又は下に入力を入れると通れる)床」的なものを作れればいいなという案がありました。説明しづらい。あと検索しづらい。
Unity関連で探す限り、以下の記事で試みが行われていました。
hide behind blog (仮): 下からすり抜けて上に乗ることができる床の実装例 (Unity C#)
unity2Dのジャンプアクションゲームでブロックから飛び降りれるようにするには: ドット絵とアイデアと
collider2dを無効にしたり、triggerのON/OFFを切り替えることで実装されています。

で、参考にしつつ色々考えた結果、とりあえずこうなりました。
f:id:mayonage-kobo:20141211003059g:plain

方法としては、スクリプト内でレイヤーを切り替えてみます。飛んでる時はレイヤーを変えて、通常時には元のレイヤーに戻します。

gameObject.layer = LayerMask.NameToLayer("CharacterHook");

現状、CharacterHookというレイヤーは上部の床のレイヤーとは衝突しません。現状だと他にも色々すり抜けてしまうんですが、後々には床以外の物体とは上手く衝突するように設定できそうです。

で、キャラクターはいいんですが、「どうせなら投げる物もすり抜けさせたいね」とか考え始めました。投げる物のレイヤーを増やせばいいかな?とか考えたけどレイヤーの数が凄い事になりそうです。
頭にあるのは、床をすり抜ける物体をまとめて1つのレイヤーで対処できないかなあと。例えばy軸の速度が上方向ならすり抜けるレイヤーに設定しておけばいい...とか?(これだと下にすり抜けられない)
何か「これだ!」みたいな方法があればいいですね。

レイヤーは色々と勉強になりました。unityで普通のアクションゲームを作る時もお世話になりそうですね。
ちなみに作業段階としてはそろそろステージ作成が始まるとか。