这一次,要参照I Remember网站开始界面的那个光环,用粒子系统做一个类似的光环,当然,我做的没网站上的那么好看,就,增加一点儿自己的东西吧。

首先,来看一下成品图:

图中有两个环,它们转的方向相反,但每个环的粒子数都是一样的,同时还会有颜色的变化(这里设置了五种颜色轮流变换)。整个环由一个粒子系统生成,通过每一帧设定每个粒子的位置来达到粒子在旋转这一效果。
粒子的位置通过公式:x = cos(t); y = sin(t)来确定。

制作步骤

步骤一:

在场景中建立一个空对象(ParticleSystem),并在对象内新建一个粒子系统(ring):

步骤二:

新建一个C#脚本,命名为myRing,并将其挂载在ring上。

步骤三:

下面,就是用脚本对粒子的行为进行控制。

首先,提供下面的一些共有变量,使得我们可以在外部通过更改这些参数来设定光环的属性。

    public ParticleSystem particleSystem; //粒子系统对象public int particleNumber = 5000;       //发射的最大粒子数public float pingPong = 0.05f;public float size = 0.05f;             //粒子的大小public float maxRadius = 10f;          //粒子的旋转半径public float minRadius = 4.0f;public float speed = 0.05f;             //粒子的运动速度

另外,我们还需要对每个粒子进行处理,所以,需要存储粒子本身,以及他们的每个粒子的运动半径和位置偏转角。

    private float[] particleAngle;private float[] particleRadius; private ParticleSystem.Particle[] particlesArray;

在Start函数里面将要获得的组件和需要申请的内存都处理好后,就可以开始对粒子的初始位置进行设定了,通过随机生成粒子的夹角,半径,然后根据圆的极坐标公式表示,就可以将很多粒子排列成一个圆的样子了。

void init(){//对于每个粒子for (int i = 0; i < particleNumber; i++){//随机生成角度float angle = Random.Range(0.0f, 360.0f);//换回弧度制float rad = angle / 180 * Mathf.PI;//设定粒子的旋转半径float midRadius = (maxRadius + minRadius) / 2;float rate1 = Random.Range(1.0f, midRadius / minRadius);float rate2 = Random.Range(midRadius / maxRadius, 1.0f);float r = Random.Range(minRadius * rate1, maxRadius * rate2);//设定粒子的大小particlesArray[i].size = size;particleAngle[i] = angle;particleRadius[i] = r;//放置粒子particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);}}

至于角度那里,为什么要先生成角度制,再转回弧度制,大家可以自己去试验一下,直接用弧度制弄出来的环,放在舞台效果上还是不错的,但并不是我们这里所需要的那种光环。此时Start函数如下:

void Start(){particleSystem = GetComponent<ParticleSystem>();particlesArray = new ParticleSystem.Particle[particleNumber];particleSystem.maxParticles = particleNumber;particleAngle = new float[particleNumber];particleRadius = new float[particleNumber];particleSystem.Emit(particleNumber);particleSystem.GetParticles(particlesArray);init();particleSystem.SetParticles(particlesArray, particlesArray.Length);  }

到这一步后,我们运行一下,发现,刚开始时,粒子生成的已经是圆环的形状了,如下图,但随后粒子又会散开来。

为了让粒子保持圆环的形状,我们还要在Update函数上作处理,让粒子按一定的方向和角度进行旋转。为了模拟有两个环,且两个环旋转方向不同这一效果,决定将粒子平分为两类,一类顺时针旋转,一类逆时针旋转。此时Update函数如下:

void Update(){for (int i = 0; i < particleNumber; i++){if (i % 2 == 0){particleAngle[i] += speed;}else{particleAngle[i] += speed;}particleAngle[i] = (particleAngle[i] + 360) % 360;float rad = particleAngle[i] / 180 * Mathf.PI;particlesArray[i].position = new Vector3(particleRadius[i] * Mathf.Cos(rad), particleRadius[i] * Mathf.Sin(rad), 0f);}particleSystem.SetParticles(particlesArray, particleNumber);}

这时,圆环已经有点像样了,生成如下:

但是,现在这样,看起来还是有点死板,于是,我们可以再做下面这些改进:
1、设置不同的粒子旋转的速度不一样;
2、给粒子增加抖动效果
3、给粒子增加点色彩。

步骤四:

使不同的粒子旋转的速度不一样,只需要在粒子速度的增量那里作一点儿处理,使得粒子的速度分为十个级别。处理如下:

            if (i % 2 == 0){particleAngle[i] += speed * (i % 10 + 1);}else{particleAngle[i] -= speed * (i % 10 + 1);}

而使粒子增加抖动效果,可以使用PingPong方法,该方法可以使得值在范围内来回变动,具体可查看帮助文档。首先,增加一个时间计数器,用来记录粒子的运动时间。

public float pingPong = 0.05f;
private float time = 0; 

然后,将下面的代码放入Update的for循环里面:

            time += Time.deltaTime;particleRadius[i] += (Mathf.PingPong(time / minRadius / maxRadius, pingPong) - pingPong / 2.0f);

最后,就是为粒子增加颜色,首先,需要添加一个时钟来记录颜色的维持时间,以方便转换颜色,并且用一个颜色数组来记录所有可变换的颜色。

    private Color[] changeColor = { new Color(255, 255, 255), new Color(255, 0, 0),new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 0, 255) };private float colorTimeOut = 0;

然后,在Update函数中加入下面两条语句。其中,①语句在for循环外,②语句在for循环内部。

colorTimeOut += Time.deltaTime; //①
particlesArray[i].color = changeColor[(int)(colorTimeOut % 5)]; //②

此时,我们的圆环就算是完成了,如下:

改进:

虽然,圆环已经出来了,但是,我们可以看到,圆环很暗,在红色和蓝色的时候,几乎看不见环了,所以,为了让环清晰一点,我们可以让环发光。这时,只需要用到Glow11插件即可。
首先,得去下载Glow11插件,然后,通过Assets -> Import Package->Custom Package,找到Glow11插件,将其导入。
然后,选定摄像机,在Inspector面板中,在Add Component处,找到Glow11脚本,将其增加到摄像机的Inspector面板中(记得在脚本那里打钩)。
最后,选定粒子系统,将其Renderer处的Material改成Default-Material即可。

这时候再运行,光环就成文章开头那样子了,看起来也舒服了许多。

源代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyRing : MonoBehaviour {public ParticleSystem particleSystem; //粒子系统对象public int particleNumber = 5000;       //发射的最大粒子数public float pingPong = 0.05f;public float size = 0.05f;             //粒子的大小public float maxRadius = 10f;          //粒子的旋转半径public float minRadius = 4.0f;public float speed = 0.05f;             //粒子的运动速度private float[] particleAngle;private float[] particleRadius; private float time = 0;   private ParticleSystem.Particle[] particlesArray;private Color[] changeColor = { new Color(255, 255, 255), new Color(255, 0, 0),new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 0, 255) };private float colorTimeOut = 0;void Start(){particleSystem = GetComponent<ParticleSystem>();particlesArray = new ParticleSystem.Particle[particleNumber];particleSystem.maxParticles = particleNumber;particleAngle = new float[particleNumber];particleRadius = new float[particleNumber];particleSystem.Emit(particleNumber);particleSystem.GetParticles(particlesArray);init();particleSystem.SetParticles(particlesArray, particlesArray.Length);  }void Update(){colorTimeOut += Time.deltaTime;for (int i = 0; i < particleNumber; i++){time += Time.deltaTime;particlesArray[i].color = changeColor[(int)(colorTimeOut % 5)];particleRadius[i] += (Mathf.PingPong(time / minRadius / maxRadius, pingPong) - pingPong / 2.0f);if (i % 2 == 0){particleAngle[i] += speed * (i % 10 + 1);}else{particleAngle[i] -= speed * (i % 10 + 1);}particleAngle[i] = (particleAngle[i] + 360) % 360;float rad = particleAngle[i] / 180 * Mathf.PI;particlesArray[i].position = new Vector3(particleRadius[i] * Mathf.Cos(rad), particleRadius[i] * Mathf.Sin(rad), 0f);}particleSystem.SetParticles(particlesArray, particleNumber);}void init(){//对于每个粒子for (int i = 0; i < particleNumber; i++){//随机生成角度float angle = Random.Range(0.0f, 360.0f);//换回弧度制float rad = angle / 180 * Mathf.PI;//设定粒子的旋转半径float midRadius = (maxRadius + minRadius) / 2;float rate1 = Random.Range(1.0f, midRadius / minRadius);float rate2 = Random.Range(midRadius / maxRadius, 1.0f);float r = Random.Range(minRadius * rate1, maxRadius * rate2);//设定粒子的大小particlesArray[i].size = size;particleAngle[i] = angle;particleRadius[i] = r;//放置粒子particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);}}
}

有其他更好的光环改进效果,欢迎在评论区中提出来

Unity3d 粒子光环制作相关推荐

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

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

  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学习:制作粒子光环特效

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

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

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

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

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

  8. Unity3D粒子系统之制作火焰特效

    Unity3D粒子系统之制作火焰特效 本文将会介绍如何使用Unity内的粒子系统制作烟雾效果. 如果想了解Unity粒子系统中的基础属性,可以看这篇博客:Unity3D粒子系统之基础属性介绍 先上预览 ...

  9. Unity3d数字模型制作规范(更多资讯资料群:193521697邀请码:10026)

    Unity3d数字模型制作规范 本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸.单位 ...

最新文章

  1. TechParty Mini.0
  2. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少...
  3. 代码的世界中,一个逻辑套着另外一个逻辑,如何让每一种逻辑在代码中都有迹可循?...
  4. 使用MyEclipse简单调用WebServices
  5. 程序员修神之路--打通Docker镜像发布容器运行流程
  6. range作用于对象global失败_彻底弄懂JavaScript作用域问题
  7. zookeeper系列之通信模型(转)
  8. mfc大观之五、六(消息机制和消息运行)
  9. 洛谷 P1827 美国血统 American Heritage Label:字符串Water
  10. LINUX编译x265:make-Makefiles.bash: ccmake: not found
  11. kotlin学习二:初步认识kotlin
  12. 关于Unity可视化编程工具bolt的基本使用和思考
  13. Visio2016绘制框图的基本操作方法
  14. 课程设计 计算机公共基础,基于Moodle大学计算机公共基础课程设计.pdf
  15. oracle内连接和外连接
  16. 越狱环境下代码控制手机重启(IOS,XCODE)
  17. Ubuntu16.04如何设置静态IP地址
  18. 【C 语言】文件操作 ( fflush 函数 | 刷新缓冲区示例代码 )
  19. matlab纵坐标两边标注,matlab纵坐标标注
  20. java里面的悲观锁和乐观锁

热门文章

  1. 迷你型数字万用表使用说明
  2. UG8.5-UG11.0压铸模具离合器设计视频教程 流道 排气 渣包设计
  3. HTB-BountyHunter
  4. 全球大学生超级计算机竞赛排名,世界大学生超级计算机竞赛备受全球关注
  5. USBBOOT导致U盘空间变小容量丢失的解决办法
  6. 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition
  7. 曲柄压力机的离合器和制动系统设计
  8. linux篇(四)linux进程(上)
  9. 双螺旋式质量流量计的工作特点
  10. 我的世界服务端开服基础大全