CGメソッド

CG制作に関してのヒント

MENU

【Unity】パーティクルをキューブに当てて、ヒットのパーティクルを出す方法

パーティクルをキューブに当てて、ヒットのパーティクルを出す方法。
OnParticleCollisionを使用すると、パーティクル衝突時に別のパーティクルを簡単に発生させることができるが、衝突位置に発生する方法がまだシンプルではないです。


http://f.st-hatena.com/images/fotolife/m/min0124/20150816/20150816182103.png?1439716931


①3つのゲームオブジェクトを用意
・A:当てる用のパーティクル(Beam)
・B:ヒット用のパーティクル(Explosion)
・障害物(ただのCube、Aが当たるように配置する)

②A:当てる用のパーティクルのCollisionにチェック
さらに設定をWorldにして、Send Collision Messagesにチェック

③A:当てる用のパーティクルに下記のスクリプト(FX_Test)をアタッチ

using UnityEngine;
using System.Collections;

public class FX_Test : MonoBehaviour {

	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown (0)) {
			GameObject go = GameObject.Find ("Beam");
			go.particleSystem.Play ();	
		}
	}

	private ParticleSystem.CollisionEvent[] collisionEvents = new ParticleSystem.CollisionEvent[16];	
	void OnParticleCollision(GameObject other) {
		GameObject hitParticle = GameObject.Find ("Explosion");		
		int safeLength = particleSystem.safeCollisionEventSize;
		if (collisionEvents.Length < safeLength)collisionEvents = new ParticleSystem.CollisionEvent[safeLength];		
		int numCollisionEvents = particleSystem.GetCollisionEvents(other, collisionEvents);
		int i = 0;
		while (i < numCollisionEvents) {
			Vector3 collisionHitLoc = collisionEvents[i].intersection;
			hitParticle = Instantiate (hitParticle, collisionHitLoc, Quaternion.identity) as GameObject;			
			hitParticle.particleSystem.Play();
			GameObject.Destroy (hitParticle, 1.0f);
			i++;
		}
	}
}


メモ1:衝突位置を割り出さない場合

	void OnParticleCollision(GameObject other) {
		GameObject hitParticle = GameObject.Find ("Explosion");
		hitParticle = Instantiate (hitParticle, other.transform.position, other.transform.rotation) as GameObject;
		hitParticle.particleSystem.Play ();
		GameObject.Destroy (hitParticle, 1.0f);
	}


メモ2:オブジェクトが当たったらヒットエフェクトを飛ばす(OnCollisionEnter)

	void OnParticleCollision(GameObject other) {
		GameObject hitParticle = GameObject.Find ("Explosion");
		hitParticle = Instantiate (hitParticle, other.transform.position, other.transform.rotation) as GameObject;
		hitParticle.particleSystem.Play ();
		GameObject.Destroy (hitParticle, 1.0f);
	}


参考
【Unity】 パーティクルの衝突判定