Различение между разными коллайдерами в OnParticleCollision - PullRequest
0 голосов
/ 24 сентября 2018

У меня в настоящее время есть механик, который распыляет постоянную струю воды.Если вода попадает в игрока, они получают урон.Если вода попадает в зонт, Он не делает.

У меня проблемы с интеграцией этого механизма из-за того, что я не знаю, как различать разные родительские / дочерние коллайдеры с помощью OnParticleCollision

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class Health : MonoBehaviour {

public float startingHealth = 100f;
public float health;



public Slider healthSlider;

// Use this for initialization
void Start () {
    health = startingHealth;
}

void OnParticleCollision(GameObject offender)
{
    if (offender.gameObject.name == "hoseSystem") //collided with BoxCollider. 
    {
        health -= 0.5f;
        healthSlider.value = health;
    }
}
// Update is called once per frame
void Update () {
}
}

1 Ответ

0 голосов
/ 24 сентября 2018

Во-первых, давайте проясним несколько моментов, чтобы понять, как столкновение в целом работает в Unity.

Столкновение

  • Для работы объекта требуется твердое тело.
  • События столкновения происходят, когда родительский объект или любой из его дочерних элементов поражен объектом.В этом случае они обрабатываются как единое целое.
  • События столкновения происходят на обеих сторонах .т.е. частицы водяного шланга также получат событие столкновения.

Системы частиц

  • Системы частиц в основном предназначены для визуальных целей, поскольку они очень требовательны к производительности.
  • Системы частиц OnParticleCollision не обеспечивает почти такой же уровень функциональности, как RigidBody.OnCollisionEnter.Это сделано в Unity.
  • Обычно не рекомендуется использовать частицы для взаимодействий, подобных тем, которые вы пытаетесь достичь.

Теперь, чтобы ответить на ваш вопрос, хотя этона самом деле неоптимальный, один из способов сделать это - проверить столкновение с системой частиц и уменьшить его здоровье, злоупотребляя тем фактом, что GetComponent не просматривает дочерние и / или родительские объекты объекта.который получил удар.

Логика будет такой:

  1. Частица сталкивается с объектом.

  2. Частица извлекает "Компонент объекта "Здоровье".

  3. Частица вызывает "Повреждение" вышеупомянутого компонента.

На практике это будет означать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...