はじめに
銃を扱うゲームにおいて当たり判定の実装は不可欠ですが、リアルな弾速で弾を飛ばすと簡単にすり抜けてしまいます。
銃口からRayを飛ばせば弾速は出せますが、リアルさを求めているのに弾道が直線というのも残念ですよね。
今回はRaycastの速さと、リアルな弾道の放物線を両立する方法を紹介したいと思います。
(Unity歴が浅いので、もしかしたらポピュラーな方法かもしれません。また、もっと簡単でいい方法(CollisionDetectionModeとか)があるのかもですがご容赦ください。)
方法
考え方は至って単純で、弾の前フレームでの位置から今のフレームでの位置にRaycastを飛ばして当たりを判定します。
コード
Vector3 prepos;
void Start(){
prepos = transform.position; //前フレームでの位置
}
void Update(){
Vector3 pos = transform.position; //今フレームでの位置
Ray ray = new Ray(prepos, (pos - prepos).normalized); //前フレームの位置から今の位置の向きにRayを飛ばす
RaycastHit hit; //これがあると当たったオブジェクトの情報が扱える
if (Physics.Raycast(ray, out hit, (pos - prepos).magnitude, 1 << 8)){ //判定ししたいオブジェクトはレイヤーを分けておく(この場合はレイヤー8)
Debug.Log("Hit!"); //当たったらコンソールにて報告
}
prepos = pos; //今のフレームの位置を次のフレームにおける前のフレームの位置として保存
}
注意
この方法ではRay(すごくほそい)を使っているため、オブジェクトのpositionの座標が通過しないと当たりが検出されません。
そのため弾丸など小さな物体には有効ですが、大きさのあるものに使うのはおすすめしません。
まとめ
需要があるかわからない当たり判定の紹介でした。問題等あれば教えて下さい。