LotosLabo

プログラミング技術とか気になった情報を載せていきます

【Unity】貫通しないレーザービームを作った

Unityで貫通しないレーザービームを作りました。
ついでにちゃちゃっとエビを焼くゲーム?も作りました。


レーザーの見た目

レーザービーム本体については、LineRendererで制御しています。
レーザービームの幅、長さ、色もここで変えられます。


f:id:lo25131:20180420013751j:plain


Animatorの部分ですが、レーザー自体に動きがないとただの如意棒になってしまうので、
前に進むようなアニメーションを付けています。

まずレーザーの元となる画像を用意します。

f:id:lo25131:20180420014610j:plain

そしてこれをLineRendererのMaterialに割当てます。
LineRendererのMainTex_STというところをアニメーションで動かします。
動かすところはzのところ。
この「MainTex_ST」というのは、調べてみるとMainTextureのスケール情報などが含まれたものとか。

https://forum.unity.com/threads/what-is-_maintex_st.24962/


プログラムでもやろうと思えばできますが、今回はAnimationでやりました。
レーザービームのアニメーション自体の速さを変えたいということであれば、
プログラムで制御したほうが良いかと思います。

f:id:lo25131:20180420014953j:plain

レーザービームの長さ、幅の設定

レーザービームの長さと幅のプログラム上での変更。

// レーザービームの長さ
LineRenderer.SetPosition(1, new Vector3(0, 1,  0));

// レーザービームの幅
LineRenderer.widthMultiplier = 3f;


等速で伸ばすようにしてあげたりとか。

[SerializeField]
private LineRenderer m_LaserBeam;

private void FixedUpdate(){
  m_LaserBeam.SetPosition(1, Vector3.MoveTowards(m_LaserBeam.GetPosition(1), new Vector3(0, 5, 1), 50f * Time.deltaTime));
}



レーザーの当たり判定

当たり判定には2つ使用しています。
・貫通しないために、衝突した時にその位置まで戻すためのRaycast
・複数当たり判定を持つBoxCollider2D

下記画像の中央に走る緑の線がRayCast、
周りを囲んでいる青い枠線がBoxCollider2D

f:id:lo25131:20180420022115j:plain


真ん中に当たらないとレーザービームは引っ込まない形にしています。
どこに当たっても引っ込む形にするのであれば、Raycastはいらずに
BoxColliderのみでいいかと。

また、BoxCollider2Dには当たり判定にある全てのコライダを取得できる
処理を追加してあげます。

こういう感じに複数に当たり判定をもてる。
f:id:lo25131:20180420025252j:plain




後は衝突時に衝突したコライダの距離を取得して、そのポジションまで
レーザービームのLineRendererの長さと、コライダ、レイキャストを戻してあげます。


プロジェクト配布

github.com

遅くなりました、サンプルシーンも用意してありますのでどうぞ。

素材使用元サイト

frame-illust.com
icooon-mono.com
on-jin.com