【Unity】衝突時にパーティクルを発生させる
目的
オブジェクト同士が衝突した際にパーティクルを発生させる方法についてメモする。今回は人間が球に衝突した際に、球からパーティクルが発生する、ということを実現する。
環境
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タグをつけているか、などをチェックしてみて下さい。
以上
Unityを一から学ぶのにおすすめの本はコチラ