这一次做的是用粒子流编程做一个粒子系统,参考了师兄的博客。
效果展示:

基本配置

首先,打开Unity并创建一个空的对象,这里我命名为ParticalHalo,然后在ParticalHalo下创建两个空对象,分别为inner和outer,并为两个对象添加粒子系统Particle System。到这里,基本的配置就差不多了,接下来就是脚本的控制了。

脚本控制

由于两个空对象inner和outer使用同一个脚本控制,因此只用写一个脚本即可。创建脚本命名为ParticalHalo.cs。
首先添加粒子系统,粒子数组以及粒子属性的数组:

private ParticleSystem particleSys;  // 粒子系统
private ParticleSystem.Particle[] particleArr;  // 粒子数组
private CirclePosition[] circle;  //粒子属性

然后我们从简单的开始,先定义该粒子属性的类:

public class CirclePosition
{  public float radius = 0f, angle = 0f, time = 0f;  public CirclePosition(float radius, float angle, float time)  {  this.radius = radius;    this.angle = angle;      this.time = time;        }
}  

这个类中定义了每个粒子的半径,角度,游离的起始时间。这个类会在初始化每个粒子位置时用到。
接下来要定义一堆东西,包括粒子数量,粒子的运动半径范围,粒子大小,运动方向等:

public int count = 10000;
public float size = 0.06f;
public float minRadius = 5.0f;
public float maxRadius = 12.0f;
public bool clockwise = true;
public float speed = 2f;
public float pingPong = 0.02f;  // 游离范围
public Gradient colorGradient;

值得一提的是Gradient是unity控制渐变的类,定义一个类的实例,在之后的光环渐变中用到,这些属性都定义成public以便于实时调节和设定。
之后可以对粒子系统进行初始化了:

void Start () {particleArr = new ParticleSystem.Particle[count];  circle = new CirclePosition[count];  // 初始化粒子系统  particleSys = this.GetComponent<ParticleSystem>();  particleSys.startSpeed = 0;            // 粒子位置由程序控制  particleSys.startSize = size;          // 设置粒子大小  particleSys.loop = false;  particleSys.maxParticles = count;      // 设置最大粒子量  particleSys.Emit(count);               // 发射粒子  particleSys.GetParticles(particleArr);   RandomlySpread();   // 初始化各粒子位置
}

这些粒子系统的属性都可以在UI界面找到,这里只是用脚本控制。
然后实现其中的RandomlySpread()函数:

for (int i = 0; i < count; ++i)
{   // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近  float midRadius = (maxRadius + minRadius) / 2;  float minRate = Random.Range(1.0f, midRadius / minRadius);  float maxRate = Random.Range(midRadius / maxRadius, 1.0f);  float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);  // 随机每个粒子的角度  float angle = Random.Range(0.0f, 360.0f);  float theta = angle / 180 * Mathf.PI;  // 随机每个粒子的游离起始时间  float time = Random.Range(0.0f, 360.0f);  circle[i] = new CirclePosition(radius, angle, time);  particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
}  particleSys.SetParticles(particleArr, particleArr.Length);

用极坐标控制每个粒子的位置,保证每个粒子在平均半径附近。
这样就基本上固定了粒子的位置,大概是一个圆吧,然后就需要让每个粒子动起来,绕着圆旋转,这一步在update中实现:

for (int i = 0; i < count; i++)
{  if (clockwise)  // 顺时针旋转  circle[i].angle -= Time.deltaTime * speed / 10; else            // 逆时针旋转  circle[i].angle += Time.deltaTime * speed / 10;  // 保证angle在0~360度  circle[i].angle = (360.0f + circle[i].angle) % 360.0f;  circle[i].time += Time.deltaTime;  circle[i].radius += Mathf.PingPong(circle[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f; float theta = circle[i].angle / 180 * Mathf.PI;  particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
} 

其中

 Mathf.PingPong(circle[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f; 

这段语句保证了粒子可以在最大半径和最小半径之间游动,而不必非要绕着环跑。
做到这里基本上实现了粒子的循环跑动:

接下来就是加特效的时间了,这里我只添加了一个特效,就是用到上面提及的渐变器让粒子光环能够在跑动中变换颜色:

void changeColor () {
for (int i = 0; i < (int)Mathf.Sqrt(count); i++) {for (int j = 0; j < (int)Mathf.Sqrt (count); j++) {float value = (Time.realtimeSinceStartup - Mathf.Floor (Time.realtimeSinceStartup));value += circle [(int)(i*Mathf.Sqrt(count) + j)].angle / 2 / Mathf.PI;while (value > 1)value--;particleArr [(int)(i*Mathf.Sqrt(count) + j)].color = colorGradient.Evaluate (value);}
}
}

这里调用了colorGradient.Evaluate (value)这个函数传入时间来控制颜色的变化,这就要求我们再UI界面编辑渐变器。这里值得一提的是我将整个圆环分成了100块,在每一块中都会出现颜色的渐变达到上面展示的最终效果。当然,这还需要一个前提就是设置Particle System中render中的material为默认的空白材料,不然的话渐变的效果基本没有。
所以,整个的update为:

void Update () {for (int i = 0; i < count; i++)  {  if (clockwise)  // 顺时针旋转  circle[i].angle -= Time.deltaTime * speed / 10; else            // 逆时针旋转  circle[i].angle += Time.deltaTime * speed / 10;  // 保证angle在0~360度  circle[i].angle = (360.0f + circle[i].angle) % 360.0f;  circle[i].time += Time.deltaTime;  circle[i].radius += Mathf.PingPong(circle[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f; float theta = circle[i].angle / 180 * Mathf.PI;  particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta)); }  changeColor ();particleSys.SetParticles(particleArr, particleArr.Length);
}

最后,还可以通过导入包来添加render中的材料,毕竟unity自带的材料不太好看就是了。
搞定之后挂载inner和outer对象上就可以了,顺时针,逆时针什么的可以直接在UI界面操作。

Unity3d-粒子光环相关推荐

  1. Unity3d 粒子光环制作

    这一次,要参照I Remember网站开始界面的那个光环,用粒子系统做一个类似的光环,当然,我做的没网站上的那么好看,就,增加一点儿自己的东西吧. 首先,来看一下成品图: 图中有两个环,它们转的方向相 ...

  2. Unity3D——粒子光环

    参考网站首页的光环效果:http://i-remember.fr/en 这次作业总的来说属于简单的场景设置,前段时间学习各种模式编程小游戏的时候,整的学起来有点吃力有点难,这次作业的体验很赞,可能因为 ...

  3. Unity3d Note8(粒子光环)

    1.作业要求 2.实现过程 2.1游戏对象建立 2.2圆环制备 2.3旋转 2.4改进 3.源代码 1.作业要求 参考 http://i-remember.fr/en 这类网站,使用粒子流编程控制制作 ...

  4. 【Unity3d学习】粒子光环的制作——粒子编程初体验

    写在前面 Unity3d学习制作的实验资料包括本次实验都在老师的课程网站上:传送门 视频地址:传送门 实验项目文件在Github上面:Github传送门 实验参考博客:感谢指导! Unity3D学习笔 ...

  5. ## Unity3D实现粒子光环效果

    Unity3D实现粒子光环效果 参考效果: http://i-remember.fr/en 基本思路如下 1. 使用unity3d自带的粒子系统 2. 为圆环设置最大半径maxR和最小半径minR 3 ...

  6. Unity3D学习:制作粒子光环特效

    最近看到一个网站,感觉里面的特效不错http://i-remember.fr/en 所以我尝试制作一下里面的粒子光环,鼠标悬停中间的按钮就会粒子收缩,移开就会扩散,先上效果图如下: 下面讲讲思路:首先 ...

  7. 粒子编程初试——粒子光环制作

    写在前面 实验参考博客:感谢指导! Unity3D学习笔记(9)-- 粒子光环 Unity3d--ParticleSystem粒子光环 堂上编程练习(有错误,仅作参考):Unity制作神奇的粒子海洋! ...

  8. Unity 3D游戏九:粒子光环

    前言 中山大学数据科学与计算机学院3D游戏课程学习记录博客. 游戏代码: gitee 参考师兄的博客: 师兄博客 游戏要求 制作粒子光环 游戏分析 在制作粒子光环之前,首先要学习粒子系统的相关知识.粒 ...

  9. Unity3d——ParticleSystem粒子光环

    记录一下学习的过程. 首先是Inspector视窗中Particle System的属性: 可以通过修改属性来改变粒子的效果. 基本属性 Duration:发射器发送粒子持续的时间.比如设置为5,就是 ...

  10. Unity3d-制作粒子光环特效

    利用Unity3d制作一个特效,与这个网站效果类似: 首先,在Unuty3d下面建立了一个object,命名为Particle. 然后建立一个脚本:并挂在刚刚建立的gameobject下面 然后然后依 ...

最新文章

  1. 无重复字符串的排列组合
  2. 月薪40-60k| 银牛微电子Inuitive招计算机视觉算法、应用软件等岗位
  3. Python踩坑记录
  4. Vue.js 源码分析(二十三) 指令篇 v-show指令详解
  5. Redis 常见命令
  6. 世界对一名颓废者的惩罚——SDOI2019R1游记
  7. 【数据结构与算法】之深入解析“零钱兑换”的求解思路与算法示例
  8. 解决css firefox火狐浏览器IE浏览器下的兼容性问题
  9. webpack --- html-webpack-plugin
  10. Java 多线程 —— ReentrantLock 与 Condition
  11. STM32H743+CubeMX-QSPI+DMA读取外部FLASH(W25Q128JVSQ)
  12. IT职场健康杀手与应对宝典 (虽然是IT职场,可是对于常上网的ggmm也是很有用的)...
  13. 记录搭建Odoo框架
  14. mysql数据库诊断_MySQL数据库诊断——InnoDB关机问题 【转】
  15. pp助手苹果版本_腾讯桌球安卓和苹果系统如何进28以及怎么解决没有金币时的烦恼...
  16. 【STM32F429的DSP教程】第1章 初学数字信号处理准备工作
  17. 【概率论】极大似然估计和最大后验估计
  18. Linux PCI和PCIe总线
  19. 什么是Service(服务)?
  20. 360安全杀毒软件扫描计算机病毒,360木马查杀能扫描病毒吗

热门文章

  1. pytorch实现:数据集归一化处理
  2. 杜永光老师讲述微信小店将是电商的新开始
  3. 2018年年末的一些思考
  4. Windows下x86和x64平台的Inline Hook介绍
  5. python生成exe文件运行闪退解决方法
  6. WEB漏洞扫描的开源工具
  7. 支撑阿里 99% 数据开发的 DataWorks 在技术架构变革方面的实践
  8. 2、金融之关于BOLL
  9. 移动-联通-电信网关
  10. C# DataGridView 置顶操作