C# Unity 3D停止碰撞墙后生成粒子

C# Unity 3D停止碰撞墙后生成粒子,c#,unity3d,C#,Unity3d,我正在为学校做一件事:一个像轰炸机一样的游戏。 我的问题是当炸弹爆炸时,粒子应该停止在墙后繁殖。下面是问题的图像: 我有以下代码来生成炸弹,并启动协同程序来生成每个方向的粒子: void Explode() { Instantiate(explosionPrefab, transform.position, Quaternion.identity); StartCoroutine(CreateExplosions(Vector3.forward));

我正在为学校做一件事:一个像轰炸机一样的游戏。
我的问题是当炸弹爆炸时,粒子应该停止在墙后繁殖。下面是问题的图像:

我有以下代码来生成炸弹,并启动协同程序来生成每个方向的粒子:

void Explode()
    {
        Instantiate(explosionPrefab, transform.position, Quaternion.identity);
        StartCoroutine(CreateExplosions(Vector3.forward));
        StartCoroutine(CreateExplosions(Vector3.right));
        StartCoroutine(CreateExplosions(Vector3.back));
        StartCoroutine(CreateExplosions(Vector3.left));
        GetComponent<MeshRenderer>().enabled = false;
        exploded = true;
        GetComponent<CapsuleCollider>().enabled = false;
        Invoke("desativar_particulas", 0.4f);
        Destroy(gameObject, .45f);

      }
void Explode()
{
实例化(explosionPrefab、transform.position、Quaternion.identity);
start例程(createexploations(Vector3.forward));
start例程(createexploations(Vector3.right));
start例程(createexploations(Vector3.back));
start例程(createexploations(Vector3.left));
GetComponent().enabled=false;
爆炸=真;
GetComponent().enabled=false;
调用(“desativar_speculas”,0.4f);
摧毁(游戏对象,.45f);
}
下面是我的协同程序,用于生成粒子:

 private IEnumerator CreateExplosions(Vector3 direction)
{
    for (int i = 1; i < 3; i++)
    {

        RaycastHit hit;

        Physics.Raycast(transform.position + new Vector3(0, .5f, 0), direction * 10, out hit, i, levelMask);

        if (!hit.collider)
        {
                Instantiate(explosionPrefab, transform.position + (i * direction * 10), explosionPrefab.transform.rotation);
        }

        else
        {
            break;
        }


        yield return new WaitForSeconds(.05f);
    }
}
private IEnumerator(矢量3方向)
{
对于(int i=1;i<3;i++)
{
雷卡斯特击中;
物理.光线投射(transform.position+新矢量3(0.5f,0),方向*10,外击,i,levelMask);
如果(!命中碰撞器)
{
实例化(explosionPrefab,transform.position+(i*方向*10),explosionPrefab.transform.rotation);
}
其他的
{
打破
}
返回新的WaitForSeconds(.05f);
}
}
if语句应该起到作用:墙有一个长方体组件碰撞器,粒子有一个长方体碰撞器组件作为触发器。
我错过什么了吗?请提供帮助,谢谢。

您可以在此子菜单中配置粒子系统中碰撞的工作方式,动态执行碰撞可能很困难:

在这方面:
Physics.Raycast(transform.position+newvector3(0.5f,0),direction*10,outhit,i,levelMask)
看起来你每次都在增加每次施放的距离,以到达下一个街区(顺便说一句,聪明的移动。我会用一种更复杂的方式来完成这项工作),但距离仅为3,而在所有关于爆炸位置的参考中,你都将其放大了10。 你是不是想做这样的事:

Physics.Raycast(transform.position + new Vector3(0, .5f, 0), direction, out hit, i * 10, levelMask)

其中,光线投射的方向只是您输入到函数中的方向,距离被放大十倍?

粒子系统有一个碰撞组件,您可以使用它来破坏它们,或者在它们撞到墙上时从墙上反弹。出于好奇,为什么要实例化多个粒子系统,而不是使用带有内置碰撞菜单的粒子系统?浪费的潜力。。。