Select your preferred scripting language. All code snippets will be displayed in this language.
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
CloseFor some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
CloseOnParticleCollision is called when a particle hits a Collider.
This can be used to apply damage to a GameObject when hit by particles.
Legacy Particle System:
This message is sent to all scripts attached to the WorldParticleCollider
and to the Collider that was hit.
The message is only sent if you enable sendCollisionMessage
in the Inspector of the WorldParticleCollider
.
// Legacy Particle System example // Applies a force to all Rigidbody components that are hit by the particle.
function OnParticleCollision (other : GameObject) { var body : Rigidbody = other.GetComponent.<Rigidbody>(); if (body) { var direction : Vector3 = other.transform.position - transform.position; direction = direction.normalized; body.AddForce (direction * 5); } }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void OnParticleCollision(GameObject other) { Rigidbody body = other.GetComponent<Rigidbody>(); if (body) { Vector3 direction = other.transform.position - transform.position; direction = direction.normalized; body.AddForce(direction * 5); } } }
Shuriken Particle System:
This message is sent to scripts attached to Particle Systems and to the Collider that was hit.
When OnParticleCollision is invoked from a script attached to a GameObject with a
Collider, the GameObject parameter represents the ParticleSystem. The Collider
receives at most one message per Particle System that collided with it in any given frame even
when the Particle System struck the Collider with multiple particles in the current frame.
To retrieve detailed information about all the collisions caused by the
ParticleSystem, the ParticlePhysicsExtensions.GetCollisionEvents must be used to retrieve
the array of ParticleSystem.CollisionEvent.
When OnParticleCollision is invoked from a script attached to a ParticleSystem,
the GameObject parameter represents a GameObject with an attached Collider struck
by the ParticleSystem. The ParticleSystem receives at most one message per
Collider that is struck. As above, ParticlePhysicsExtensions.GetCollisionEvents must
be used to retrieve all the collision incidents on the GameObject.
Messages are only sent if you enable Send Collision Messages
in the Inspector of the Particle System Collision module.
The OnParticleCollision can be a co-routine. Simply use the yield statement in the function.
var part: ParticleSystem; var collisionEvents: ParticleCollisionEvent[];
function Start() { part = GetComponent.<ParticleSystem>();
collisionEvents = new ParticleCollisionEvent[16]; }
function OnParticleCollision(other: GameObject) {
// adjust array length var safeLength = part.GetSafeCollisionEventSize();
if (collisionEvents.Length < safeLength) { collisionEvents = new ParticleCollisionEvent[safeLength]; }
// get collision events for the gameObject that the script is attached to var numCollisionEvents = part.GetCollisionEvents(other, collisionEvents);
// apply some force to Rigidbody components var rb = other.GetComponent.<Rigidbody>();
for (var i = 0; i < numCollisionEvents; i++) { if (rb) { var pos = collisionEvents[i].intersection; var force = collisionEvents[i].velocity * 10; rb.AddForce(force); } } }
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class ExampleClass : MonoBehaviour { public ParticleSystem part; public List<ParticleCollisionEvent> collisionEvents;
void Start() { part = GetComponent<ParticleSystem>(); collisionEvents = new List<ParticleCollisionEvent>(); }
void OnParticleCollision(GameObject other) { int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents);
Rigidbody rb = other.GetComponent<Rigidbody>(); int i = 0;
while (i < numCollisionEvents) { if (rb) { Vector3 pos = collisionEvents[i].intersection; Vector3 force = collisionEvents[i].velocity * 10; rb.AddForce(force); } i++; } } }
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thanks for helping to make the Unity documentation better!