您的位置:首页 > 移动开发 > Unity3D

unity 粒子系统

2015-12-15 23:05 351 查看
最近在弄一个3d弹幕类游戏,美术给的子弹都是多个粒子系统的叠加,大量的子弹以及特效造成了系统的卡顿、丢帧严重。想来想去,无奈只好想出歪招,把粒子系统作为一个武器,粒子作为子弹,除了效果不好些,却也解决了问题。今天就写写粒子碰撞时遇到的问题。

首先,作为子弹,碰撞是不可少的。要是粒子也带碰撞,可以按下图进行设置。其中,Collision部分必须勾上,才会产生碰撞。如果要在脚本中能够接受到碰撞信息,则必须勾选上Send Collision Message部分。



Collision中一些参数:

1、Dampen:抑制(0~1),选这个为1时(完全抑制),碰撞之后,阻止了粒子,可以使碰撞的粒子消失;

2、Bounce:反弹(0~2),选完这个之后,可以让产生碰撞的粒子以某个角度反弹出去;

3、Lifetime Loss:生命周期损失(0~1),碰撞之后让粒子损失百分比的生命周期,为1时(生命周期完全损失),可以使粒子消失;

4、Min Kill Speed:最小清除速度,设置值越大,粒子发生碰撞之后被移除的速度越快,当达到某个值之后,可以近似碰撞之后立即消失。

综上说,如果要想粒子碰到物体就消失,则有三种方式,即设置Dampen为1;设置Lifetime Loss为1;设置较大的Min Kill Speed值。

在脚本中,可以通过OnParticleCollision(GameObject other)获得具体的碰撞信息(注意other为粒子系统,而不是某个粒子)。虽然知道怎么使用,但是期间还是走了很多歪路。要想OnParticleCollision真的能检测到信息,首先得保证碰撞物有rigidbody和collider,而且collider还不能勾选isTrigger选项。即便这样,我还是遇到不能检测到的情况,理由是还是给粒子带上速度(为毛啊~~)。

在ParticleSystem中必不能检测到每次发出的Particle是哪个,所以要想更新粒子,可以调用GetParticles和SetParticles方式进行设置。补充的说,如果要检测具体某个粒子的碰撞位置怎么办呢?可以使用GetCollisionEvents这个方法:

int safeLength = PS.GetSafeCollisionEventSize();
ParticleCollisionEvent[] collisionEvents;
collisionEvents = new ParticleCollisionEvent[safeLength];

int numCollisionEvents = PS.GetCollisionEvents(this.gameObject, collisionEvents);
int i = 0;
while (i < numCollisionEvents)
{
Debug.Log(collisionEvents[i].intersection);
GameObject.Instantiate(O, collisionEvents[i].intersection, Quaternion.identity);
i++;
}


就写这么多吧,以后在进行补充….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息