シヴァのブログ

UnityやUE4や趣味とかいろいろ...

開発メモ 「衝突(当たり)判定 Part2」

この前、(http://shivat.hatenablog.com/entry/2013/06/27/051213)

衝突判定について色々書いてみて、さらにわかったことが出てきた。

 

Component > Physics > CharacterController

で、「CharacterController」を利用して、衝突判定を行う際、

「CharacterController」に、コライダが含まれているので、

BoxColliderなどのコライダは、

「CharacterController」がついているならば、いらないらしい。

んで、

外部から読み込んだキャラクターとオブジェクトの衝突判定は、

OnControllerColliderHit(other : ControllerColliderHit){}

を使用するとのこと。

 

 

...ここまでは、

なんとか、自力で調べられていたんだけれど、

問題は、

「静止したオブジェクトにCharacterControllerで衝突判定を行う際、

判定がうまいこといかない」

です。

 

なんで、そんなことをしたいかというと、

現在、

「魔王育成計画」っていう、

クイズゲームを開発していて、その中で、

以下のようなシーンを入れて魔王を選択できるようにしたい。

f:id:shivaT:20130629152134p:plain

魔王の手前に描かれている牢屋に、キャラがふれると、

ダイアログを出して、魔王を育成するかどうかを選択できる仕様にする。

で、

さっきの問題にぶち当たった。

 

それで、

悩んで2日経って、友人に、

「なんかいい方法ない?」

って、聞いたら、

「rigidbody.WakeUp()ってのを使うと、うまくいくかもよ」

って、あっさり言われ、ちょっとショックだったが、

いいことを聞いたと思うようにして、さっそく試してみました。

 

...結果からいうと、うまくいきました。

 

説明すると、まず、

動いていないオブジェクトは「スリープモード」っていうのを行って、

処理を軽くする(動いていないオブジェクトまで計算していると、

動きが鈍くなるから)のだけれど、

「rigidbody.WakeUp()」は、スリープモードを解除する働きをする。

 

使い方は、

動いていないオブジェクトに、rigidbodyと、以下のスクリプトを加える。

***************************************************************************

#pragma strict

function Update () {
    rigidbody.WakeUp();
}

function OnTriggerStay(other : Collider){
    if(other.gameObject.tag == "Player"){//Playerタグをキャラに設定しておく
        Debug.Log("shoutotu!!!!");
    }
}

***************************************************************************

こんな感じ。

f:id:shivaT:20130629154643p:plain

衝突しても、

動かなくするために、牢屋のrigidbodyの

ConstraintsのFreeze Position,Rotationは、

全てチェックを入れる。

あと、

Box Colliderの

Centerのzを1にすることで当たり判定の位置をずらして、

その範囲に入っている限り、当たり判定を返すようにする。

で、さらに、

Use Gravityのチェックを外して、

Is Triggerにチェックを入れて、

他のオブジェクトとの衝突を無くして、当たり判定だけが取れるオブジェクト

にする。

(上のスクリプトで、「OnTriggerStay」を用いたのはそのため)

 

 

うん。

これで、判定がうまくいった。

やっぱり、自分で考えるのは当たり前として、

人に聞くことも必要だなっと痛感した。

 

...エンド。