ゼロからのUnity(8)パーティクルシステムでアイテムにエフェクトを付けてみよう
skill

ゼロからのUnity(8)
パーティクルシステムでアイテムにエフェクトを付けてみよう

2016.04.14

私事ではありますが、手がけた作品のリリースが近づいてまいりました。
今回の作品は色々な要素を詰め込んだので、開発初期からずっと多忙な日々が続いております。(笑 ゲームに限らず、開発は得てして楽しく、そして大変でもあります。
ひとたび大変さを経験すると、「大変だからいま自分が出来ることの範囲だけで納めてしまおう」と保守的になってしまうことが多々あります。
身に付けた技術を活用するのはもちろん良いことなのですが、新しい事にチャレンジするのはもっと大切です。
時間が無ければほんの小さなことをひとつだけでも構いません。そうやって自分が出来ることを少しずつ広げていけば、きっと皆さんもいつの間にかGeekになっていることでしょう。(というか、新しいことをやると単純に楽しいですからね!
(賀好 昭仁)

ということで、本題に入ります。

今回はゲームに登場するアイテムを作りながら、Unityの強力な機能のひとつ「パーティクルシステム」について学んでいきましょう。

■アイテムを考えよう

ゲームによってアイテムの種類は様々です。
RPGであれば武器や防具、シューティングであれば弾がパワーアップするアイテム、中にはキャラが弱くなってしまうアイテムもあります。

今回は、取るとひよこちゃんが巨大化するアイテムを作ってみます。
どこぞのヒゲのおじさんが食べていたキノコと同じです。

ちなみに、彼は配管工として広く知られていますが、実は大工だそうですよ。

■アイテムを作ってみよう

さて、このあたりはシンプルな例でサクッと進めちゃいましょう。
まずはスクリプトから作ります。

やりたいことは、
・ひよこちゃんとアイテムの衝突判定
・衝突の際、アイテムを消してひよこちゃんを巨大化させる
の2つです。

まずはHiyoko.csに巨大化のためのメソッドを追加します。

/// <summary>
/// ひよこちゃんを倍の大きさにします
/// </summary>
public void Bigger()
{
  transform.localScale *= 2f;
}

単純ですね。
アイテムを取るたびにどんどん巨大化しますが、面白いので良しとしましょう。


続いてアイテムのスクリプトを作成します。

BiggerItem.cs

using UnityEngine;
using System.Collections;

public class BiggerItem : MonoBehaviour
{
  private void OnTriggerEnter2D(Collider2D other)
    {
      // 衝突したのがひよこちゃんかどうか判定
      if (null != other.GetComponent<Hiyoko>())
      {
        // ひよこちゃんなら巨大化させる
        other.GetComponent<Hiyoko>().Bigger();
        // アイテムを破棄
        Destroy(gameObject);
    }
  }
}

次にアイテムを配置します。

残念ながらキノコの画像は見当たらないので、
Assets/Sprite Pack #1 - Tap and Fly/Sprites/Player
にある、hitEffectを使ってみましょう。
こちらの画像をゲームシーンにドラッグして、名前をBiggerItemに変更します。

BiggerItem に BiggerItem.cs、Circle Collider 2D をアタッチし、 Circle Collider 2D の Is Trigger にチェックを付けておきます。
物理演算はしないため、 RigidBody 2D は不要です。

■カメラを自律的に動かしてみる

この状態でゲームをプレイしてみると、アイテムを取得したときに画面が揺れてしまいます。

これは、Main CameraがHiyokoの子オブジェクトになっており、ひよこちゃんが大きくなった瞬間にカメラの座標がずれてしまうのが原因です。
この動きはちょっと気持ち悪いので、ひよこちゃんとカメラを分離しましょう。

まずは、Main CameraをHiyokoと同じ最上位階層に移動します。

そもそもMain Cameraを子オブジェクトにしていた理由は、ひよこちゃんを追従させるためでした。
カメラをひよこちゃんの子オブジェクトから外してしまうと、追従してくれなくなります。

ということで、代わりに下記のひよこちゃん追従用スクリプトをMain Cameraにアタッチします。

MainCamera.cs

using UnityEngine;
using System.Collections;

public class MainCamera : MonoBehaviour
{
  public Hiyoko hiyoko;

  private void Update()
  {
    // ひよこちゃんを常にz=-10の位置から映します
    transform.position = hiyoko.transform.position + new Vector3(0f, 0f, -10f);
  }
}

スクリプトを正しく動作させるために、Main CameraのHiyokoプロパティにひよこちゃんをひも付けておきましょう。

これで今までと同じカメラワークも保てるようになりました。

[動画1]
https://youtu.be/edxUuLQ76Wk

カメラもGameObjectのひとつですので、スクリプトをアタッチすることで自律的に動くカメラを作ることができます。


これでアイテム取得時の処理はOKですので、次はUnityのパーティクルシステムを使ってみましょう。

■パーティクルシステムとは

パーティクル(Particle)とは、英語で「粒子」や「小片」といった意味です。

魔法を唱えたときの演出、雨や雪などの天候、たいまつの炎など、ゲームには様々なエフェクトがあります。
Unityには Shuriken というパーティクルシステムが搭載されており、これを使ってエフェクトを簡単に作ることが出来ます。
パーティクルシステムで無数のパーティクル(粒子)を制御し、様々なエフェクトを表現できるのです。

■パーティクルシステムを作ってみよう

概念だけではピンと来ないかと思いますので、さっそくパーティクルシステムの作成を進めていきましょう。

今回はアイテムから立ち昇るオーラのエフェクトを作ります。
アイテム自身の秘めたやる気を視覚化しよう、という試みです。

まずはヒエラルキーのBiggerItemの上で右クリックし、Particle Systemを選びます。
アイテムから白い弾が放出され始めましたね。
これがパーティクルです。

2D視点だと実体が捉えづらいので、2D視点の固定を外してみましょう。
3Dで見ると、画面奥に向かって放射状にパーティクルが発生していることが確認できます。

[動画2]
https://youtu.be/-qIMh91kyCo

■パーティクルシステムを調整しよう

好みのエフェクトになるよう、パーティクルシステムを調整していきましょう。

Particle Systemの設定はインスペクターから変更することが可能です。
設定を始める前に、よく使うプロパティの一部をご紹介します。


@Particle Systemモジュール
パーティクルシステムの基本的な設定を行います。

・Duration
パーティクルシステム1回あたりの実行時間(秒)です。
後述のLoopingが設定されていなければ、ここに設定した秒数が経過するとパーティクルの発生が止まります。

・Looping
繰り返し実行させるかどうかの設定です。

・Start Lifetime
パーティクルが発生してから消えるまでの時間です。

・Start Speed
パーティクル発生時の移動速度です。

・Start Size
パーティクルの大きさです。

・Start Color
パーティクル発生時の色です。

・Gravity Modifier
パーティクルが受ける重力の度合いです。
マイナス値を設定すると、上方向に向かって重力(浮力)が発生します。

・Play On Awake
パーティクルシステムを自動実行するかどうかの設定です。
チェックを外した場合、スクリプトからParticleSystemのPlay()メソッドを実行するまで
パーティクルシステムは実行されません。

・Max Particles
パーティクルが存在出来る最大個数です。
上限に達している場合、パーティクルは生成されなくなります。

@Emissionモジュール
パーティクルの発生サイクルを制御します。
RateにTimeが指定されているなら時間(1秒あたり)、Distanceなら親オブジェクトが移動した距離を基準にパーティクルが発生します。

@Shapeモジュール
パーティクル発生源(エミッター)の形を指定します。
初期状態だとConeとなっており、前述の動画のようにコーン状にパーティクルが放出されます。

@Color over Lifetimeモジュール
パーティクル発生後の色変化を指定できます。

@Size over Lifetimeモジュール
パーティクル発生後のサイズ変化を指定できます。

@Collisionモジュール
パーティクルと他オブジェクトの衝突設定です。

@Rendererモジュール
レンダリングに関する設定です。

・Material
パーティクルの素材です。
Materialに任意のテクスチャを使用することで、星形やハート型などパーティクルを色々な形にすることが出来ます。

・Sorting Layer
パーティクルの描画レイヤーを指定します。


上記以外にも様々なモジュールやプロパティがありますので、公式ドキュメントに目を通しておくと良いでしょう。
http://docs.unity3d.com/ja/current/Manual/PartSysReference.html


では、実際にプロパティを設定していきましょう。

Particle Systemモジュールの
Start Lifetime を 1
Start Size を 0.5
Start Color を 255 0 0 50(半透明の赤)
Gravity Modifier を -0.1

Shapeモジュールの
Shape を Circle
Radius を 0.1
にします

Size over Lifetimeモジュールにチェック、
Size を 以下のような曲線に設定します。
(下部歯車マークの横にある曲線をクリックすることで設定できます)

そして、パーティクルがアイテムより前面に描画されるようにするため Rendererモジュールの Sorting Layer で Add Sorting Layer... を選択します。 Tags & Layers が表示されますので、「+」を押して「Particle」レイヤーを追加します。

レイヤーは上から順番に描画されますので、「Particle」レイヤーは「Default」レイヤーより前面に表示される形になります。

レイヤーの追加が終わったら、もう一度パーティクルシステムのSorting Layer を見てみましょう。
「Particle」が選択可能になっていますので、選択します。

これで、パーティクルがアイテムの前面に描画されるようになりました。

余談:
ちなみに、ゲームオブジェクトの描画レイヤーはインスペクターの上部で設定可能です。
背景・キャラ・前景など、レイヤーを分けて描画したい時に活用しましょう。


ここまででひと通り設定が終わりました。
さっそくプレイしてみましょう。

[動画3]
https://youtu.be/It-b_TE-kDM

アイテム、ちゃんとオーラ出ています。
彼のやる気が感じられますね。

■まとめ

パーティクルシステムはUnityの中でもキモとなる機能で、作り方次第でゲームを一段と華やかにすることが可能です。

さらに、パーティクルは物理演算や衝突判定が可能です。
そのため、単純に演出として利用する以外に、火炎放射やシューティングの弾など、他のオブジェクトに影響を与えることも可能です。

パーティクルシステムを作成する場合は、いい感じのものが出来たら、使う予定が無くても保存しておきましょう。
パーティクルシステムはとても汎用性が高いので、少し手を入れるだけできっと他のゲームで活用できるでしょう。

また、Asset Storeにもパーティクルシステムで作ったエフェクトがたくさん提供されていますので、そちらを活用するのもオススメです。


では、このあたりで次回の予告を。

プレイヤーキャラ、ルール、敵キャラ、アイテムと、ゲームに最低限必要な要素はおおよそ揃ってきました。
(※それぞれ突っ込みどころ満載かと思いますので、ぜひ皆さんのアイデアでステキな形にしていってください!)

要素が揃ってきたところで、少々気になるのが操作方法です。
現在はキーボードでの操作をサポートしていますが、この状態ではスマホの画面で操作することができません。

次回はバーチャルパッドやタッチなど、操作方法の実装について学んでいきましょう。

原稿:賀好 昭仁
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW