04/17:記事名変更

12/16:内容修正

 


 

 

できたので書きなおしました。

やることはRayで衝突判定を行う方法です。

2D向けです。

(3DのRay記事しかなくて解決するのに時間がかかった。本当・・・)

 

 

ビームの作り方は書いてませんので参考記事をどぞ。(参考:かめはめ波

回転させる方法(無茶苦茶)はここ(旧記事)。伸び縮みはできた。

 

 

 

♦本題

Rayで当たり判定付ける時、例えば

 

//レイを投射してオブジェクトを検出

if(Physics.Raycast(ray,out hit)){

print(hit.collider.gameObject.name);

}

wiki引用

 

 

なんだけど、2DのColliderだとできない。

 

 

RayをRay2Dに、  RaycastHitを  RaycastHit2Dに変更して・・・

//当たると相手が消えるRaycastHit2D=A)

A = Physics2D.Raycast(transform.position,transform.right);
 Destroy(A.collider.gameObject);

 

 

 

でちゃんと反応するようになる。

04/18追記:何故かInstantiateで複製すると当たり判定がでない

解決方法したので以下補足)

 

 


♦補足:Instantiateで複製した時当たり判定がRayに無い時

 

※STG用に作ってたのでRayをビームと呼んでます。

 

Updateなどで連続して当たり判定を調べる時、複製したビームだと何故か当たり判定が無かったのでメモ。

(原因は見落としでした)

 

Rayに当たったオブジェクト(以下objと呼ぶ)を取得したくて

 

//当たると相手が消える(RaycastHit2D=A)

A =Physics2D.Raycast(transform.position,transform.right);
Destroy(A.collider.gameObject);

 

を使ったが、できなかった。

 

理由:一つしか当たり判定は取れないので最初にぶつかったオブジェクト(発射源)を取得していた

 

当然のことを忘れてた。

解決方法:

①ビームを撃つレイヤーとビームのレイヤーを変える(もしくは同じレイヤー同士だと当たり判定を持たせないようにする)

②以下のように細かく設定する

 int  layerMask = LayerMask.GetMask(new string[] { "player" });//レイヤーを決定

A = Physics2D.Raycast(transform.position,transform.right, Mathf.Infinity, layerMask);
Destroy(A.collider.gameObject);

 

この設定だと決定したレイヤー以外から当たり判定をとらないのでできる。

※補足:RaycastでMathf.Infinityを使っているが、STGのビームでは使えないので注意(ビームの撃った先まで衝突範囲になるため)

 

Rayを理解しないと結構きついと調べてて感じた。

躓いたおかげてRayを理解できたけど。

 

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

Post Navigation