開発メモ 「衝突(当たり)判定 Part2」
この前、(http://shivat.hatenablog.com/entry/2013/06/27/051213)
衝突判定について色々書いてみて、さらにわかったことが出てきた。
Component > Physics > CharacterController
で、「CharacterController」を利用して、衝突判定を行う際、
「CharacterController」に、コライダが含まれているので、
BoxColliderなどのコライダは、
「CharacterController」がついているならば、いらないらしい。
んで、
外部から読み込んだキャラクターとオブジェクトの衝突判定は、
OnControllerColliderHit(other : ControllerColliderHit){}
を使用するとのこと。
...ここまでは、
なんとか、自力で調べられていたんだけれど、
問題は、
「静止したオブジェクトにCharacterControllerで衝突判定を行う際、
判定がうまいこといかない」
です。
なんで、そんなことをしたいかというと、
現在、
「魔王育成計画」っていう、
クイズゲームを開発していて、その中で、
以下のようなシーンを入れて魔王を選択できるようにしたい。
魔王の手前に描かれている牢屋に、キャラがふれると、
ダイアログを出して、魔王を育成するかどうかを選択できる仕様にする。
で、
さっきの問題にぶち当たった。
それで、
悩んで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!!!!");
}
}
***************************************************************************
こんな感じ。
衝突しても、
動かなくするために、牢屋のrigidbodyの
ConstraintsのFreeze Position,Rotationは、
全てチェックを入れる。
あと、
Box Colliderの
Centerのzを1にすることで当たり判定の位置をずらして、
その範囲に入っている限り、当たり判定を返すようにする。
で、さらに、
Use Gravityのチェックを外して、
Is Triggerにチェックを入れて、
他のオブジェクトとの衝突を無くして、当たり判定だけが取れるオブジェクト
にする。
(上のスクリプトで、「OnTriggerStay」を用いたのはそのため)
うん。
これで、判定がうまくいった。
やっぱり、自分で考えるのは当たり前として、
人に聞くことも必要だなっと痛感した。
...エンド。