当前位置:   article > 正文

unity粒子特效实现_unity代码控制粒子系统

unity代码控制粒子系统

本博客参考 i-remember.fr 这类网站,使用粒子流编程控制制作了一些效果,参考了一些师兄的代码,最后实现的效果还是很好看的

效果如图:图片为静态,实际的动态效果感觉不错,类似老师说的粒子光环

实现过程:

1、添加粒子系统

先在界面中加入一个空白对象,增加两个子对象,子对象下添加粒子系统:

2、添加脚本

首先在脚本中定义一些需要用到的数据:

  1. private ParticleSystem particleSys;
  2. private ParticleSystem.Particle[] particles;
  3. private CirclePosition[] circles;
  4. private int tier = 10;
  5. public Gradient colorGradient;
  6. public int count = 10000;
  7. // 粒子数量
  8. public float size = 0.03f;
  9. // 粒子大小
  10. public float minRadius = 5.0f;
  11. // 最小半径
  12. public float maxRadius = 12.0f;
  13. // 最大半径
  14. public bool clockwise = true;
  15. // 顺时针|逆时针
  16. public float speed = 2f;
  17. // 速度
  18. public float pingPong = 0.02f;
  19. // 游离范围

接下来在start中,初始化粒子的位置和渐变颜色:

  1. void Start () {
  2. particles = new ParticleSystem.Particle[count];
  3. circles = new CirclePosition[count];
  4. //初始化粒子系统
  5. particleSys = this.GetComponent<ParticleSystem>();
  6. particleSys.startSpeed = 0;
  7. particleSys.startSize = size;
  8. particleSys.loop = false;
  9. particleSys.maxParticles = count; // 设置最大粒子量
  10. particleSys.Emit(count); // 发射粒子
  11. particleSys.GetParticles(particles);
  12. //初始化颜色
  13. GradientAlphaKey[] alphaKeys = new GradientAlphaKey[5];
  14. alphaKeys[0].time = 0.0f;
  15. alphaKeys[0].alpha = 1.0f;
  16. alphaKeys[1].time = 0.4f;
  17. alphaKeys[1].alpha = 0.4f;
  18. alphaKeys[2].time = 0.6f;
  19. alphaKeys[2].alpha = 1.0f;
  20. alphaKeys[3].time = 0.9f;
  21. alphaKeys[3].alpha = 0.4f;
  22. alphaKeys[4].time = 1.0f;
  23. alphaKeys[4].alpha = 0.9f;
  24. GradientColorKey[] colorKeys = new GradientColorKey[2];
  25. colorKeys[0].time = 0.0f;
  26. colorKeys[0].color = Color.white;
  27. colorKeys[1].time = 1.0f;
  28. colorKeys[1].color = Color.white;
  29. colorGradient.SetKeys(colorKeys, alphaKeys);
  30. RandomlySpread(); // 初始化各粒子位置
  31. }
  32. void RandomlySpread()
  33. {
  34. for (int i = 0; i < count; i++)
  35. {
  36. float midRadius = (maxRadius + minRadius) / 2;
  37. float minRate = Random.Range(1.0f, midRadius / minRadius);
  38. float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
  39. float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
  40. // 随机每个粒子的角度
  41. float angle = Random.Range(0.0f, 360.0f);
  42. float theta = angle / 180 * Mathf.PI;
  43. // 随机每个粒子的游离起始时间
  44. float time = Random.Range(0.0f, 360.0f);
  45. circles[i] = new CirclePosition(radius, angle, time);
  46. particles[i].position = new Vector3(circles[i].radius * Mathf.Cos(theta), circles[i].radius * Mathf.Sin(theta), 0f);
  47. }
  48. particleSys.SetParticles(particles, particles.Length);
  49. }

这里涉及到了另外一个类——CirclePosition,这个类是来定义每一个粒子绕圈运动时后的半径、角度和时间的。

  1. public class CirclePosition
  2. {
  3. public float radius = 0f, angle = 0f, time = 0f;
  4. public CirclePosition(float radius, float angle, float time)
  5. {
  6. this.radius = radius;
  7. this.angle = angle;
  8. this.time = time;
  9. }
  10. }

最后要让粒子转动起来,应该在最开始的ParticleHalo类的Update函数中实现:

  1. // Update is called once per frame
  2. void Update()
  3. {
  4. for (int i = 0; i < count; i++)
  5. {
  6. if (clockwise)
  7. circles[i].angle -= (i % tier + 1) * (speed / circles[i].radius / tier);
  8. else
  9. circles[i].angle += (i % tier + 1) * (speed / circles[i].radius / tier);
  10. circles[i].time += Time.deltaTime;
  11. circles[i].radius += Mathf.PingPong(circles[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f;
  12. circles[i].angle = (360.0f + circles[i].angle) % 360.0f;
  13. float theta = circles[i].angle / 180 * Mathf.PI;
  14. particles[i].position = new Vector3(circles[i].radius * Mathf.Cos(theta), circles[i].radius * Mathf.Sin(theta), 0f);
  15. particles[i].color = colorGradient.Evaluate(circles[i].angle / 360.0f);
  16. }
  17. particleSys.SetParticles(particles, particles.Length);
  18. }

最后一步就是将脚本挂在两个粒子系统上,注意到,在脚本中定义了一个clockwise的变量,可以选择粒子转动的方向,将一个粒子系统定义为顺时针旋转,另一个粒子系统定义为逆时针旋转,就完成了制作了。

3、设置天空盒

由于粒子系统的亮度比较低,所以需要一个比较暗的背景或者反差比较大的背景,这里我是在Assets Store中下载了一个天空盒,效果如下:

最后效果:

视频:粒子光环。。。。-其他-高清完整正版视频在线观看-优酷 (youku.com)

代码地址:3d-game/粒子光环/ParticleHalo at main · wujf37/3d-game (github.com)

本博客对粒子效果的实现有了一些尝试,通过对文章的学习掌握了一些粒子流编程,对老师没有要求必做的任务进行了一些尝试,最后实现的效果尚可,同时之前也完成了老师要求奖励的部分—

(奖励)编写《Unity制作神奇的粒子海洋!》教程,在bilibili发布

教程链接如下:Unity3d神奇的粒子海洋 - 哔哩哔哩

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/666114
推荐阅读
相关标签
  

闽ICP备14008679号