Во-первых, давайте проясним несколько моментов, чтобы понять, как столкновение в целом работает в Unity.
Столкновение
- Для работы объекта требуется твердое тело.
- События столкновения происходят, когда родительский объект или любой из его дочерних элементов поражен объектом.В этом случае они обрабатываются как единое целое.
- События столкновения происходят на обеих сторонах .т.е. частицы водяного шланга также получат событие столкновения.
Системы частиц
- Системы частиц в основном предназначены для визуальных целей, поскольку они очень требовательны к производительности.
- Системы частиц
OnParticleCollision
не обеспечивает почти такой же уровень функциональности, как RigidBody.OnCollisionEnter
.Это сделано в Unity. - Обычно не рекомендуется использовать частицы для взаимодействий, подобных тем, которые вы пытаетесь достичь.
Теперь, чтобы ответить на ваш вопрос, хотя этона самом деле неоптимальный, один из способов сделать это - проверить столкновение с системой частиц и уменьшить его здоровье, злоупотребляя тем фактом, что GetComponent
не просматривает дочерние и / или родительские объекты объекта.который получил удар.
Логика будет такой:
Частица сталкивается с объектом.
Частица извлекает "Компонент объекта "Здоровье".
Частица вызывает "Повреждение" вышеупомянутого компонента.
На практике это будет означать:
public class WaterHose : MonoBehaviour {
private void OnParticleCollision(GameObject other)
{
//Get the component specifically in the gameobject we hit
//This by default ignores parents/children.
Health health = other.GetComponent<Health>();
if (health != null)
health.Damage(5);
}
}
и
public class Health : MonoBehaviour {
public float health;
void Start () {
health = 150f;
}
public void Damage(float amount)
{
health -= amount;
}
}
Health
идет на игрока, WaterHose
идет на водяной пистолет.
Имейте в виду, что это все еще очень плохой дизайн.
Я бы рекомендовал вместо этого использовать RayCasts
через определенные промежутки времени, точно так же, как вы запускаете оружие без снаряда в Unity и используете частицы только для эффектов.
Обновление: согласно запросу OP, вы можете добавить RigidBody
к вашему зонтикуУбедитесь, что в поле isKinematic
установлено значение true
.Это, по умолчанию, позволит отличать обнаружение столкновений от Player
, Umbrella
и WaterHose
, чтобы узнать, в какое тело оно попало.
Следующий фрагмент кода демонстрирует это:
public class WaterHose : MonoBehaviour {
private void OnParticleCollision(GameObject other)
{
Collider col = other.GetComponent<Collider>();
if (col is CapsuleCollider)
Debug.Log("We hit the player!");
else if (col is BoxCollider)
Debug.Log("We hit the umbrella!");
}
}
Стоит отметить, что это все еще очень плохой дизайн, и я настоятельно рекомендую использовать RayCasts
.