4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Unity】Raycastで簡単に弾道に沿った当たり判定を実装する方法

Last updated at Posted at 2020-03-14

はじめに

銃を扱うゲームにおいて当たり判定の実装は不可欠ですが、リアルな弾速で弾を飛ばすと簡単にすり抜けてしまいます。
銃口から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の座標が通過しないと当たりが検出されません。
そのため弾丸など小さな物体には有効ですが、大きさのあるものに使うのはおすすめしません。

まとめ

需要があるかわからない当たり判定の紹介でした。問題等あれば教えて下さい。

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?