スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:--:-- : スポンサー広告 ]

【Unity】 静止した物体同士の当たり判定の検出について

当たり判定ネタ。

Unityの当たり判定の検出において、静止した物体同士の当たり判定については注意が必要だ。

まず、UnityでのColliderの当たり判定検出の基本的なルール。
(このケースはMonoBehaviourのOnTriggerEnterメソッドで検出したい場合)

どちらかにRigidbodyが必ず付いていること
・RigidbodyのIs Kinematic(物理挙動をさせない)にチェックが入っていること
・ColliderのIs Triggerにチェックが入っていること


また、さらに以下の様な条件がある。

Rigidbodyが付いている方のオブジェクトが移動もしくは回転している(静止しているとダメ)
・(ただし、起動直後のフレームだけは静止していても検出可能)


つまりUnityの当たり判定(OnTrigger???やOnCollision???)はRigidbodyが動くことで機能している。
これさえ頭の片隅に置いておけば、経験とともに当たりについて慣れてくるはずだ。

詳細に知りたいのであれば公式の解説をよく読むべきだろう。
こことかも参考になる。


で、表題の件は何の話かというと、

「静止している物体同士が(元から)衝突している場合の当たり検出」

についてである。


どちらかが動いていないと検出出来ないので、じゃあ元からめり込んでたけどどちらも静止している場合って
検出出来ないんじゃない?という話。

こういうケース。




UnityのRigidbodyは、実は静止していると内部でスリープ扱いになっている。

処理負荷の軽減の為であることは容易に推測出来るが、このスリープになっている状態では
当たり検出の処理が走らない=当たっててもOnTriggerEnterが呼ばれない
のである。

確認すると、起動直後の1フレームだけは静止していてもスリープにはまだなっていないので検出は可能だった。


が、よくアクションゲーム等で攻撃当たりを特定の場所から特定のタイミングで出すことがあると思うが、
最初からその当たり(Collider)とRigidbodyを用意しておいて、
ColliderのenabledのON/OFFで当たりの発生を切り替えるといった手法を取りたい時に、
そのオブジェクト自身が静止していると当たりの検出処理が走らないことになる。

この為に見た目では上の画像のようにめり込んでいても、OnTriggerEnterが呼ばれないという困った事に陥る。

右のCubeが攻撃当たりだとして、CubeのBoxColliderのenabledをfalseからtrueに切り替えて
当たり判定発生!としてやっても、このCube自身が動いていないとRigidbodyが内部でスリープになっているので
検出処理自体が走らない
のである。


例えばこんなコード。

using UnityEngine;
using System.Collections;

public class Cube : MonoBehaviour
{
// Update
void Update()
{
if( Input.GetKeyDown(KeyCode.A) )
{
this.collider.enabled = true;
}
}
// OnTriggerEnter
void OnTriggerEnter( Collider collider )
{
Debug.Log( collider.transform.name );
}
}


ColliderのON/OFFだけを切り替えても、オブジェクトが静止していてRigidbodyがスリープしていると検出出来ない。
さぁ困った、どうしよう。

そこは天下のUnity、そんなことは百も承知で便利なものを用意してくれている。

Rigidbody.WakeUp

要はRigidbodyをスリープ状態から1フレームだけ起こしてしまえばいいのである。
上のコードに1行加えるだけ。

        if( Input.GetKeyDown(KeyCode.A) )
{
this.collider.enabled = true;
this.rigidbody.WakeUp();
}


これで検出処理が行われて、OnTriggerEnterが呼ばれるようになる。

その後はもちろん静止しているとまたRigidbodyは内部的にスリープになる。


地味にこういうケースは多いと思われるので、知っておいて損は無いテクニック?である。




あとどうでもいいようなそうでもない話、OnTriggerStayはOnTriggerEnterが呼ばれた後でないと呼ばれない。
???Enterをすっ飛ばして???Stayが呼ばれることはない。

[ 2014年02月20日 22:07:09 : Unity ]

カレンダー

プルダウン 降順 昇順 年別

09月 | 2017年10月 | 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -


全記事表示リンク

全ての記事を表示する

検索フォーム

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。