(:3[kanのメモ帳]

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

特定オブジェクト同士の当たり判定を一時的に無くす【Unity】


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

すり抜けを作りたい

「バトルランナーユニティちゃん」を作ってる時に「ジャンプした時だけ地面をすり抜けて、走ってる時は地面と接地している、でも、どちらの時も地面以外とは当たり判定を継続したい!」みたいな事がしたくて、したので(?)、その方法の紹介です。

実際にはこんな感じです。

f:id:kan_kikuchi:20141130205758g:plain


レイヤー毎の当たり判定を無くす

[Edit]-[Project Settings]-[Physics]でレイヤー毎の設定が出来ます。

f:id:kan_kikuchi:20141130211202p:plain

また、各ゲームオブジェクトのLayerを設定出来る所からAdd Layerすることでレイヤー自体を増やせます。

地面と当たり判定のあるPlayerLayerと当たり判定のないActionPlayerLayerを作成、走っている時はPlayerLayer、アクションした瞬間だけActionPlayerLayerにする事で一瞬だけすり抜けるようにしています。

f:id:kan_kikuchi:20141204084353p:plain

また、BottomFloorは三段あるうちの一番したの床で、これだけはアクション時もすり抜けないようにしています。


スクリプトからレイヤーを変える

「バトルランナーユニティちゃん」を作ってる時は以下の記事みたいなやり方は知らなかったのですが、こんな感じでやると相当楽になります。


//gameObjectがプレイヤー(ユニティちゃん)のオブジェクト
gameObject.layer = LayerName.ActionPlayerLayer


コードで書くと一行!楽!!

//アクション時間
private const float ACTION_TIME = 0.2f;
private float _actionTime;

void Action(){
  gameObject.layer = LayerName.ActionPlayerLayer;
  _actionTime = ACTION_TIME;
}

void Update (){
  if(_actionTime > 0){
    _actionTime -= Time.deltaTime;
    if(_actionTime <= 0){
      gameObject.layer = LayerName.PlayerLayer;
    }
  }
}


あとは元のレイヤーに戻す時間を設定し、その時間たったら同じ様にレイヤーを変更すればすり抜けの完成です。