Unityのパーティクルの勉強がてら、つくったスクリプトを解説します。
今回つくったスクリプトは、ゲームオブジェクトの衝突時に設定したパーティクルを再生することができます。
アクションゲーム等で利用できるかと思います。
つくったのはこちら。
オブジェクト衝突時にパーティクルを出すスクリプトをつくりました。#Unity pic.twitter.com/txep5idLX7
— ゆあーさん@プログラミングとモデリング (@yoursun3d) October 8, 2019
なお本記事では、パーティクルを出すスクリプトに注力して解説します。
解説のために使用したパーティクルは、Unity公式の「Particle Pack」アセットです。無料かつ商用利用可能のため、学習からコンテンツ制作まであらゆる用途で利用できます。
(自分でパーティクルをつくろうとしたのですが、公式アセットほどのクオリティは出せそうになかったので、今回はこちらを使用します。)
Particle Packアセットをインポート
まず初めにUnityで新規プロジェクトを立ち上げ、AssetStoreにてParticle Packアセットをインポートしましょう。
インポートが完了すると、Project内に「ParticlePack」フォルダが作成されます。
このフォルダ内の[ParticlePack]>[Scenes]>[Main]を実行すると、Particle Packに含まれる全パーティクルを見ることができます。
WASDで移動、Spaceで各パーティクルの説明が確認できるので、まずはいろいろ眺めてみるといいかも。
オブジェクト衝突時にパーティクルを表示する方法
必要なもののダウンロードは終わったので、さっそくつくっていきましょう!
1. 衝突用ゲームオブジェクトの準備
シーン内に衝突用ゲームオブジェクトを準備します。
今回用意するのは以下2つのゲームオブジェクトです。
■Cube
追加するComponent
・Rigidbody(追加するだけ)
■Plane
・Tag:「Object」タグを新規作成し設定(当たり判定に使います)
・Rigidbody(Use Gravityのチェックを外す、Is Kinematicにチェックを入れる)
これを以下のように設置します。シーンをプレイするとCubeが重力で落ちてきてPlaneに衝突します。
衝突用ゲームオブジェクトの用意はこれで完了です。次に使用するパーティクルの設定を行いましょう。
2. 表示したいパーティクルの設定
Particle Packアセット内のパーティクルを用意しましょう。
今回は、[ParticlePack]>[EffectExamples]>[Fire&ExplosionEffects]>[Prefabs]>BigExplosionを使用します。
このBigExplosionプレファブを一度Hierarckyへドラッグ&ドロップします。
HierarckyへドロップしたBigExplosionのInspectorを開き、Particle Systemコンポーネントの「Looping」のチェックを外します。
このLoopingのチェックを外す作業をHierarckyにあるBigExplosionの階層全てに行ってください。
Loopingのチェックを外すことで、パーティクルが連続で再生されなくなり、ゲームオブジェクトが衝突したときだけパーティクルが出るようにします。
全てのLoopingのチェックを外し終えたら、BigExplosionゲームオブジェクトをProject内へドラッグ&ドロップして再度プレファブ化します。
今回はProject>Assetにドロップし、Original Prefabとしてプレファブ化できました。
※Hierarcky内のBigExplosionゲームオブジェクトはもう使わないので削除
ここまでで前準備は終わりです。あとはスクリプトを編集してアタッチしていきます。
3. 衝突時にパーティクルを生成するスクリプト
衝突時にパーティクルを出すために必要なスクリプトを作成していきます。
今回は2つのスクリプトを用意しました。ParticleScriptの方だけでも一応機能はしますが、パーティクルのゲームオブジェクトがシーン上に残ってしまいます。残ったゲームオブジェクトを消すためにSeldDestroyスクリプトを使用します。
ParticleScript:衝突時にパーティクル用のゲームオブジェクトを生成するスクリプト(Cubeへアタッチ)
SelfDestroy:用済みのパーティクルを削除するスクリプト(Project内のBigExplosionへアタッチ)
ParticleScriptのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ParticleScript : MonoBehaviour { public GameObject particleObject; private void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Object") //Objectタグの付いたゲームオブジェクトと衝突したか判別 { Instantiate(particleObject, this.transform.position, Quaternion.identity); //パーティクル用ゲームオブジェクト生成 Destroy(this.gameObject); //衝突したゲームオブジェクトを削除 } } } |
ParticleScriptをCubeゲームオブジェクトへアタッチし、InspectorでparticleObjectに再プレファブ化したBigExplosionを割り当てます。
SelfDestroyのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SelfDestroy : MonoBehaviour { ParticleSystem particle; void Start() { particle = this.GetComponent<ParticleSystem>(); } void Update() { if (particle.isStopped) //パーティクルが終了したか判別 { Destroy(this.gameObject);//パーティクル用ゲームオブジェクトを削除 } } } |
SelfDestroyをProject内の再プレファブ化したBigExplosionへアタッチするだけでOKです。パーティクルが終了したら自滅します。
以上で作業はおわりになります。さっそく動かしてみましょう。
4. 動かしてみる
実際に動かしてみると、衝突時にパーティクルが生成され、ぶつかったゲームオブジェクトが削除されました!
今回解説したスクリプトを応用すれば、ゲームのクオリティアップが簡単にできるかと思います。特にアクションゲームで使えるかな。。。
ParticlePackにはこの他にも数十種類のパーティクルが入っているので、パーティクルをいろいろ試してみることをおすすめします。
もっとパーティクルについて知りたい方はこちらをどうぞ!
最後まで読んでいただきありがとうございました。