概要
パーティクルに当たり判定を実装する方法を紹介します。本記事では、パーティクルがオブジェクトに衝突すると衝突回数が加算されていくように実装します。
結果
最終的にこの動画にようになります。
パーティクルと立方体との衝突回数を表示させる pic.twitter.com/1EWeWrf9YX
— みこし (@Mikoshi_prog) September 25, 2019
方法
本記事で使用するオブジェクトは、緑色のCube、赤いParticle、衝突回数を表示するTextです。各オブジェクトのTransformの値は
- Cube: Scale(3, 3, 3)
- Particle System: Position(10, 0, 0), Rotation(0, -90, 0)
- Main Camera: Position(4, 0, -10)
のように変更しました。さらにCubeにはBox Colliderをつけます。Box Colliderがないと衝突判定ができません。Box ColliderのIs Triggerのチェックは入れないでおきます。カメラから見てCubeの右側からParticleを放出するようにします。
パーティクルの設定は上の図のようにします。Particleの色は図には映っていませんが、Start Colorで変更します。Particleの当たり判定を実装するうえで重要なのが
- Collisionにチェックを入れる
- CollisionのTypeをWorldにする
- CollisionのSend Collision Messagesにチェックを入れる
- スクリプトでOnParticleCollisionメソッドを呼び出す
です。1~3までは上の図の通りです。4については以下のスクリプトで説明します。
using UnityEngine;
public class ParticleController : MonoBehaviour
{
private int count;
private void Start()
{
count = 0;
}
private void Update()
{
}
void OnParticleCollision(GameObject obj)
{
Count++;
}
public int Count
{
get { return count; }
private set { count = value; }
}
}
ParticleController.csはParticle Systemにアタッチするスクリプトです。この中にOnParicleCollsionという名前のメソッドが入っています。これは、先ほどの1~3の設定ができているときにパーティクルがColliderのついているオブジェクトに衝突したときに自動で呼び出されるメソッドです。衝突するたびに、衝突回数を表す変数countを1ずつ増やしています。メソッドの名前はOnParticleCollsionでなければならず、引数の型もGameObjectでなければなりません。
using UnityEngine;
using UnityEngine.UI;
public class TextController : MonoBehaviour
{
private ParticleController particleController;
private Text text;
private void Start()
{
particleController = GameObject.Find("Particle System").GetComponent<ParticleController>();
text = GetComponent<Text>();
}
private void Update()
{
text.text = particleController.Count.ToString();
}
}
続いてTextにアタッチするTextController.csです。Textに衝突回数を表示させる必要があるので、ParticleController.cs内で定義されている変数countを参照しなければなりません。そこでParticle SystemにParticleControllerがついていることを利用して
particleController = GameObject.Find("Particle System").GetComponent<ParticleController>;
でParticleController.cs内にアクセスできるようにします。あとはUpdateメソッドでTextの文字をcountにすれば衝突回数が増えていく様子が画面上で見てとれます。
以上です。