I had run into a similar conundrum with the “relatively” new particle system.
It used to be that you could do something like this with the older iterations of Unity:
function OnTriggerEnter(hit:Collider){
if (hit.gameObject.tag == "ground") {
particle.emit=true;
particle2.emit=true;
}
}
function OnTriggerExit(hit:Collider){
if (hit.gameObject.tag == "ground") {
particle.emit=false;
particle2.emit=false;
}
}
( Code above is via this older forum post )
Which was super useful and easy to “cull out” things that you just didn’t want to trigger an “impact”.
However, the more recent particle system collision module uses “Layers” to define what is an what is not going to collide so you don’t have to write the code.
Anywho…here is what you need to do to “cull” out specific objects in your game/scene:
When you are editing your “parent” particle system’s collision module (i.e. the system “colliding”), you will notice the “Collides With” property under the “Collision Quality” property. At first, I wasn’t sure what this was for as a bunch of layer names I wasn’t familiar with popped up, but then I later realized that this was because during one of my “package imports” from the asset store (at some point) one of the packages evidently “over wrote” my project’s pre-defined layers…which was a bit frustrating.
Either case, above you will see that I have only selected the layer called “Terrain” and as well the Terrain in this example is assigned to the “Terrain” layer.

In the example above the “BloodSpew” particles only collide with any GameObject that is assigned to the “Terrain” layer. When I tested it in a scene, sure enough any GameObject that didn’t have the “Terrain” Layer assigned to it the collision module ignored. You can create a huge number of layer names, and as such this just happens to be the name I used at the time I was writing this.
Either case, I think that the newer particle system’s OnParticleCollision method isn’t designed specifically to provide you with all collision data (that is already handled with the Layers stuff, which is simple enough), and that the “Collision Message” option is strictly to allow one the ability to adjust the behavior of the particles based on the, at first, seemingly limited collision information.
So…just in case someone else runs into this conundrum where you are expecting to have to “cull particle collisions” by hand/code, it would seem that culling is handled via Layers and “behavior” is handled via the message system (which makes sense because everything is heading more towards a “Data Oriented Technology Stack” design).
In the end, with this newer design you don’t have to do thousands of “slow string compares” (or the like) to determine if you should or should not allow a particle to collide with something. I am sure this approach greatly helps with over-all performance in the end.
However, if you have some form of “unique element” you are trying to accomplish (i.e. like changing the behavior of a particle collision based on the material type of the thing you are colliding with) then the older way of doing things becomes “more useful” again…but I am still finding the subtle nuances of the more recent Unity iteration and there might very well be a way to handle this as well. If not, then it might be something to come in a future version, but for most cases everything you need to get some pretty cool results is there…just the way you go about achieving the same thing is a little different (for those who were familiar with older iterations of Unity).
Anyway, thought posting this info might help someone new to Unity and/or familiar with the older iterations of Unity figure out how to better utilize the newer particle system Collision Module and how to “prevent and/or limit collision with certain GameObjects”.
Cheers,
Noel