【Unity】ParticleとLineRendererで◯めはめ波を作ろう！

# かーめーはーめー（ry
![スクリーンショット 2015-02-09 17.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/26453/d594a14c-d8aa-f0fe-5a2e-5dfbd5dc509d.png)

Unityならこんなエフェクトも簡単に作れちゃいます。
今回はこの作り方を共有致します。

# 1.下準備
適当にプロジェクトを作成します。
packageはチェック必要ありません。
set up Default forは「3D」を選択。

![スクリーンショット 2015-02-09 17.44.34.png](https://qiita-image-store.s3.amazonaws.com/0/26453/ad0aa3b8-52ad-6849-3d15-266b0e77aa16.png)

# 2.UnityちゃんをAsset Storeから投入
今回はキャラクターにUnityChanを使用します。
AssetStoreからDownLoadしてください。
![unitychan.png](https://qiita-image-store.s3.amazonaws.com/0/26453/f5d74872-088a-fc77-a742-c7f213066fe5.png)

Importはそのまま全チェックでOKです。

![スクリーンショット 2015-02-09 16.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/26453/bc5a81f3-6d33-f22a-9e4a-ef0d02125b7c.png)

# 3.配置しよう
以下のものを配置します。
・Floor : 床。(pos=0,0,0 | scale=10,1,10)
・UnityChan : キャラクター。(pos=0,0.5,0 | scale=1,1,1)
・Directional Light : 光源。(配置してそのままでOK)
・空のGameObject : 発射オブジェクト。(pos=0,0,0 | scale=1,1,1)

床は
GameObject → 3D Object → Cube

UnityChanは
Assets → UnityChan → Prefabs → unitychanをD&D

Directional Lightは
GameObject → Light → Directional Light

空のGameObjectは
GameObject → Create Empty で名前をBeamにしてください。

で作成して配置します。

写真は少しMain Cameraの位置が動いていますが、
特に気にせず、床の上にUnitychanが立っていて、
光が当たって見えていればOKです。

![tezt.png](https://qiita-image-store.s3.amazonaws.com/0/26453/04548dc5-70ca-fa43-96d8-b9bed1cbce58.png)

# 4.Particleで発射光を作ろう
光線を発射した時に手元に大きな光が集まるのが"アレ"の特徴かと思います。
それをParticleで作ってみましょう。

3.で作った「Beam」を選択し、
Add Component → Effects → Particle System
を追加します。

![スクリーンショット 2015-02-09 18.05.52.png](https://qiita-image-store.s3.amazonaws.com/0/26453/751c76ef-f1c9-4b15-1cd4-fc332364cfcb.png)

そして以下のようにパラメータを設定します。
(ここが面倒くさいですが、頑張って下さい)

![スクリーンショット 2015-02-09 18.07.43.png](https://qiita-image-store.s3.amazonaws.com/0/26453/ff6296c3-6ada-a8d4-bc19-dbee49a6075d.png)

チェックの入っていない部分は何もしなくてOKです。
また、LoopingをOffにすると画面上で再生するときに、
Stop→Simurateを押下しないと確認出来ません。
なので、最後にLoopingを外すでもOKです。

![スクリーンショット 2015-02-09 18.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/26453/795b0efc-d561-9d6a-aef8-0363e736d944.png)

こんな感じで大きな光の弾がピカピカすればOKです。

# 5.ビームを作ろう
"アレ"はビームが出ます。
本来であれば、ビームは進んで行くものですが、
ここでは簡単にLine Rendererで実現してみます。

3.で作った「Beam」を選択し、
Add Component → Effects → Line Renderer
を追加します。

特にパラメータはいじらず、materialを作成します。

![スクリーンショット 2015-02-09 18.13.03.png](https://qiita-image-store.s3.amazonaws.com/0/26453/701020af-bd25-e517-7dfa-3a3d6e31e03b.png)

名前 : BeamMat
Shader : Particle/Alpha Blended
Tint Color : 黄色っぽく適当に
Particle Texture : 以下のファイルを追加

![Laser.png](https://qiita-image-store.s3.amazonaws.com/0/26453/225c1ee4-f80e-68f1-e0d3-9a21a21cacfc.png)

出来上がりましたら、
Line RendererのMaterialをBeamMatにします。

![スクリーンショット 2015-02-09 18.18.57.png](https://qiita-image-store.s3.amazonaws.com/0/26453/6e523276-f0a8-aec0-ffde-43a23098bbea.png)

# 6.スクリプトでビーム発射機能を作ろう
いよいよ大詰めです。
Create → C# Scriptでスクリプトファイルを作成します。
名前はBeamShot.csとしました。
作成したら、以下のソースを貼り付けて下さい。

```cpp:BeamShot.cs

using UnityEngine;
using System.Collections;

public class BeamShot : MonoBehaviour {

	float timer = 0.0f;
	float effectDisplayTime = 0.2f;
	float range = 100.0f;
	Ray shotRay;
	RaycastHit shotHit;  
	ParticleSystem beamParticle;
	LineRenderer lineRenderer;

	// Use this for initialization
	void Awake () {
		beamParticle = GetComponent<ParticleSystem> ();
		lineRenderer = GetComponent<LineRenderer> ();
	}
	
	// Update is called once per frame
	void Update () {
		timer += Time.deltaTime;

		if (Input.GetMouseButtonDown (0)) {
			shot ();
		}
		if (timer >= effectDisplayTime) {
			disableEffect ();
		}
	}

	private void shot(){
		timer = 0f;
		beamParticle.Stop ();
		beamParticle.Play ();
		lineRenderer.enabled = true;
		lineRenderer.SetPosition (0, transform.position);
		shotRay.origin = transform.position;
		shotRay.direction = transform.forward;

		int layerMask = 0;
		if(Physics.Raycast(shotRay , out shotHit , range , layerMask)){
			// hit 
		}
		lineRenderer.SetPosition(1 , shotRay.origin + shotRay.direction * range);


	}

	private void disableEffect(){
		beamParticle.Stop ();
		lineRenderer.enabled = false;
	}
}

```

完成したら、Beamオブジェクトにこのスクリプトを追加します。

![スクリーンショット 2015-02-09 18.23.37.png](https://qiita-image-store.s3.amazonaws.com/0/26453/a2341080-e9db-922d-0767-99a082a0fdd2.png)

このようにBeamオブジェクトは
・Particle System
・Line Renderer
・BeamShotスクリプト
の三つを持つオブジェクトになります。

# 7.実行してみよう
早速実行してみましょう。
左クリックすると、ビームが発射されますでしょうか？

![beam.png](https://qiita-image-store.s3.amazonaws.com/0/26453/1f75001a-af9f-2d35-6367-e018367c787a.png)

お疲れ様でした。これで完成です。

# 雑談
このBeamオブジェクトはそれ単体で動作します。
どこに置いても大丈夫で、オブジェクトの正面ベクトルを取っているので、向いている方向に発射します。
例えばUnitychanオブジェクトの配下に置くと、UnityChanが色んな方向を向いてもその方向に向かって発射出来ます。

![beam2.png](https://qiita-image-store.s3.amazonaws.com/0/26453/2a1af612-ca28-4118-931a-f123c550b45e.png)

![beam3.png](https://qiita-image-store.s3.amazonaws.com/0/26453/91388106-3046-ad7c-4b1e-ae36198da7cb.png)

また、複製だって大丈夫です。

![beam4.png](https://qiita-image-store.s3.amazonaws.com/0/26453/5cba437f-38e3-2b5d-92c6-96fc94429432.png)

あと、RayCastという機能を使用していて、
そのlayerMaskの機能を使えば、敵に当てて攻撃する！なんてことも出来ます。

```cpp:BeamShot.cs
		int layerMask = LayerMask.GetMask("Enemy");
		if(Physics.Raycast(shotRay , out shotHit , range , layerMask)){
			// enemyに当たった時だけここにくる 
		}
```

![スクリーンショット 2015-02-09 18.36.46.png](https://qiita-image-store.s3.amazonaws.com/0/26453/e39788a7-0067-a445-87f0-c4ef2b63e417.png)

このLayerがEnemyになっているものだけ判別出来ます。

今回作成したプロジェクト一式を公開しました。
[github Unityプロジェクト一式](https://github.com/jake1256/UnityChanHa)

以上、ここまで読んでくださってありがとうございました。