我目前有一个技工,不断喷水。 如果水碰到玩家,他们会受到伤害。如果水打到雨伞,他不会。
由于不知道如何使用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 () {
}
}
答案 0 :(得分:2)
首先,让我们澄清一些事情,以使我们对Unity中一般工作中的碰撞方式有所了解。
OnParticleCollision
不能提供与RigidBody.OnCollisionEnter
几乎相同级别的功能。这是在Unity中设计的。现在回答您的问题,尽管这实际上不是最佳选择,但一种解决方法是检查粒子系统的碰撞,并通过滥用{{1 }}不会浏览被击中物体的孩子和/或父母。
逻辑如下:
粒子与对象碰撞。
粒子获取对象的“健康”成分。
粒子在上述组件上称为“损坏”。
实际上,这将转换为:
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
,就像在Unity中发射无弹枪一样,并且仅将粒子用于效果。
更新:
根据OP的要求,您可以在伞中添加RayCasts
,并确保将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!");
}
}
。