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这个方法:
就写这么多吧,以后在进行补充….
首先,作为子弹,碰撞是不可少的。要是粒子也带碰撞,可以按下图进行设置。其中,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++; }
就写这么多吧,以后在进行补充….
相关文章推荐
- 我是运营,我没有假期
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- VB实现的《QQ美女找茬游戏》作弊器实例
- 3D设计 Adobe Acrobat 3D 8.1.0 英文版 下载
- C#实现洗牌游戏实例
- C#实现的算24点游戏算法实例分析
- C#实现简单的井字游戏实例
- C++编写简单的打靶游戏
- C++实现基于控制台界面的吃豆子游戏
- 纯javascript实现的小游戏《Flappy Pig》实例
- JavaScript实现俄罗斯方块游戏过程分析及源码分享
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- jquery带翻页动画的电子杂志代码分享
- jquery 3D 标签云示例代码
- jQuery+CSS3实现3D立方体旋转效果