Edited at

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

More than 3 years have passed since last update.


かーめーはーめー(ry

スクリーンショット 2015-02-09 17.42.28.png

Unityならこんなエフェクトも簡単に作れちゃいます。

今回はこの作り方を共有致します。


1.下準備

適当にプロジェクトを作成します。

packageはチェック必要ありません。

set up Default forは「3D」を選択。

スクリーンショット 2015-02-09 17.44.34.png


2.UnityちゃんをAsset Storeから投入

今回はキャラクターにUnityChanを使用します。

AssetStoreからDownLoadしてください。

unitychan.png

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

スクリーンショット 2015-02-09 16.07.07.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


4.Particleで発射光を作ろう

光線を発射した時に手元に大きな光が集まるのが"アレ"の特徴かと思います。

それをParticleで作ってみましょう。

3.で作った「Beam」を選択し、

Add Component → Effects → Particle System

を追加します。

スクリーンショット 2015-02-09 18.05.52.png

そして以下のようにパラメータを設定します。

(ここが面倒くさいですが、頑張って下さい)

スクリーンショット 2015-02-09 18.07.43.png

チェックの入っていない部分は何もしなくてOKです。

また、LoopingをOffにすると画面上で再生するときに、

Stop→Simurateを押下しないと確認出来ません。

なので、最後にLoopingを外すでもOKです。

スクリーンショット 2015-02-09 18.09.40.png

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


5.ビームを作ろう

"アレ"はビームが出ます。

本来であれば、ビームは進んで行くものですが、

ここでは簡単にLine Rendererで実現してみます。

3.で作った「Beam」を選択し、

Add Component → Effects → Line Renderer

を追加します。

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

スクリーンショット 2015-02-09 18.13.03.png

名前 : BeamMat

Shader : Particle/Alpha Blended

Tint Color : 黄色っぽく適当に

Particle Texture : 以下のファイルを追加

Laser.png

出来上がりましたら、

Line RendererのMaterialをBeamMatにします。

スクリーンショット 2015-02-09 18.18.57.png


6.スクリプトでビーム発射機能を作ろう

いよいよ大詰めです。

Create → C# Scriptでスクリプトファイルを作成します。

名前はBeamShot.csとしました。

作成したら、以下のソースを貼り付けて下さい。


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

このようにBeamオブジェクトは

・Particle System

・Line Renderer

・BeamShotスクリプト

の三つを持つオブジェクトになります。


7.実行してみよう

早速実行してみましょう。

左クリックすると、ビームが発射されますでしょうか?

beam.png

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


雑談

このBeamオブジェクトはそれ単体で動作します。

どこに置いても大丈夫で、オブジェクトの正面ベクトルを取っているので、向いている方向に発射します。

例えばUnitychanオブジェクトの配下に置くと、UnityChanが色んな方向を向いてもその方向に向かって発射出来ます。

beam2.png

beam3.png

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

beam4.png

あと、RayCastという機能を使用していて、

そのlayerMaskの機能を使えば、敵に当てて攻撃する!なんてことも出来ます。


BeamShot.cs

        int layerMask = LayerMask.GetMask("Enemy");

if(Physics.Raycast(shotRay , out shotHit , range , layerMask)){
// enemyに当たった時だけここにくる
}

スクリーンショット 2015-02-09 18.36.46.png

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

今回作成したプロジェクト一式を公開しました。

github Unityプロジェクト一式

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