パーティクルがコライダーにヒットしたときに OnParticleCollision が呼び出されます
これはパーティクルがヒットしたときにゲームオブジェクトにダメージを適用させるために使用することができます。
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.
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.
インスペクターにある Particle System Collision モジュールの Send Collision Messages
を有効にした場合のみ、メッセージは送信されます。
OnParticleCollision は関数の中にシンプルな yield 文を使用して、コルーチンにすることができます。
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++; } } }