Contents
目的
オブジェクト同士が衝突した際にパーティクルを発生させる方法についてメモする。今回は人間が球に衝突した際に、球からパーティクルが発生する、ということを実現する。
環境
Unity 2020.1.1f1
Asset : Standard Assets
事前準備
今回はStandard Assetsの人型オブジェクトとパーティクルのMaterialを使用するため、事前にUnity Asset StoreからStandard Assetをダウンロード&インポートしておきます。実施手順は以下に記載しております。
Step1 : 衝突させるオブジェクトの設置
GameObject > 3D Object > Sphereを選択し、Sphereを配置します。


次に、Standard Assetsの中から人側のObjectのEthanを設置します。
以下に記載の手順でEthanを設置します。
作成したEthanにはPlayer タグをつけておきます。

Step2 : Sphereへのパーティクル設定
次にGameObject > Effects > Particle Systemを選択します。

すると以下のようにHierachyにParticle Systemが作成されます。

このParticle Systemを選択し、InspectorからDuration、Looping、Play On Awakeを以下の通りに設定します。

Durationは衝突時にパーティクルの発生する時間です。ここは好みの数字で設定してかまいませんが、とりあえず1.00にしておきます。
Loopingは衝突した時のみにパーティクルを発生させるためチェックを外しておきます。チェックをつけると、衝突後に延々とパーティクルが発生してしまいます。
Play On Awakeはチェックをつけるとゲーム開始と同時にパーティクルが発生します。今回は衝突するまではパーティクルが発生してほしくないので、外しておきます。
設定できたら、Standard Assets > Particle Systems > Materialsから好きなParticleのMaterialをドラッグ&ドロップでInspectorへアタッチします。


そして、HierachyのParticle Systemをドラッグ&ドロップでSphereの上に持っていき、子として配置します。

Step3 : 衝突時にParticleを再生するスクリプトの作成
ProjectタブのAssetsの配下で右クリック > Create > C# Scriptでスクリプトを作成します。ここではColParticleという名前のファイルを作りました。

このスクリプトを開き、以下のコードを記載します。コードは非常にシンプルですが、メインはOnCollisionEnterの関数で、Playerタグに衝突した場合にparticleをplayするというところです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColParticle : MonoBehaviour { // Start is called before the first frame update //変数の定義 private ParticleSystem particle; void Start() { //Particleシステムの取得(子オブジェクトから) particle = GetComponentInChildren<ParticleSystem>(); } // Update is called once per frame void Update() { } //衝突が発生した場合に実行される void OnCollisionEnter(Collision collision) { //衝突対象がPlayer(Ethan)の場合にparticleをPlayする if (collision.gameObject.tag == "Player") particle.Play(); } }
最後にこのスクリプトをドラッグ&ドロップでSphereへアタッチします。
Step4 : テスト
ゲームを開始して、Ethanをボールに衝突させたときにパーティクルが生成されれば成功です。

うまくいかないときはShpereにrigidbodyがついているか、 EthanにPlayerタグをつけているか、などをチェックしてみて下さい。