最近看到一个网站,感觉里面的特效不错http://i-remember.fr/en

所以我尝试制作一下里面的粒子光环,鼠标悬停中间的按钮就会粒子收缩,移开就会扩散,先上效果图如下:

下面讲讲思路:首先肯定要用到粒子系统,怎么让它们呈圆环状分布呢?可以用三角函数来解决,对于一个特定的圆心和半径,r*sin(弧度)就是该粒子的y轴坐标,r*cos(弧度)为x轴坐标,z轴就置零。因为这是一个环,有最小半径和最大半径,因此r要在这之间取随机数,而角度就360内都行(最后要转换成弧度制)。然后在里面的特效中的粒子应该是有顺时针也有逆时针的,这个我用奇偶数来实现,偶数顺时针,奇数逆时针~

附上我的粒子系统参数:

这时候的效果是这样的:

这样的粒子分布太均匀了,我们需要调整一下粒子的半径的概率。

我的方法有点复杂,因为最小半径跟最大半径不能改变,但是r的随机范围又不能在最大和最小之间均分(中间最多),这时候我可以增大中间半径的概率。

我先让r 的随机下界在最小半径到中间半径之间均匀随机,上界在中间半径和最大半径之间均匀随机,这样子的话,粒子在中间半径的概率就是其他位置的两倍了。

如图:

这样的效果就跟网站上的差不多了:

接下来就是鼠标悬停中间后粒子收缩的效果,鼠标悬停的判断呢,我是用光线射击到中间物体的方法。

收缩的实现就是先得出收缩后的粒子位置以及记录好收缩前的粒子位置。(在代码中有实现以及解释)

完成后就大功告成了~

最后附上代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class init : MonoBehaviour {public ParticleSystem particleSystem;public Camera ca;private ParticleSystem.Particle[] particleRing;private int particleNum = 10000;private float radius = 5.0f;private float maxRadius = 10.0f;private float[] particleAngle;private float[] particleR;  //各个粒子的半径private int level = 5;private float speed = 0.1f;private float[] circleR;    //收缩前粒子位置private float[] collectR;   //收缩后粒子位置private bool ischange = false;  //是否收缩private float collectSpeed = 2f;// Use this for initializationvoid Start () {particleAngle= new float[particleNum];  //存储各个粒子的角度particleR = new float[particleNum];     circleR = new float[particleNum];collectR = new float[particleNum];particleRing = new ParticleSystem.Particle[particleNum];    //代表各个粒子particleSystem.maxParticles = particleNum;      //粒子总数目particleSystem.Emit(particleNum);particleSystem.GetParticles(particleRing);for (int i = 0; i < particleNum; i++)   //初始化粒子位置{float midR = (maxRadius + radius) / 2;  //中间半径float temp1 = Random.Range(radius, midR);   //下界float temp2 = Random.Range(midR, maxRadius);    //上界float r = Random.Range(temp1, temp2);   //最终粒子半径float angle = Random.Range(0.0f, 360.0f);particleAngle[i] = angle;particleR[i] = r;//得出收缩后的粒子位置以及记录好收缩前的粒子位置circleR[i] = r;collectR[i] = r - 1.5f * (r / radius);if(collectR[i]<radius+0.5f){float midRadius = radius + 0.25f;float temp = Random.Range(radius, midRadius);   //随机下界,防止收缩后成了原线而不是小圆环collectR[i] = Random.Range(temp, (radius + 0.5f));}}}// Update is called once per framevoid Update () {for (int i = 0; i < particleNum; i++){if (ischange){if(particleR[i]>collectR[i]){particleR[i] -= collectSpeed * (particleR[i] / collectR[i]) * Time.deltaTime;}} else{if(particleR[i]<circleR[i]){particleR[i] += collectSpeed * (circleR[i] / particleR[i]) * Time.deltaTime;} else if(particleR[i] > circleR[i]){particleR[i] = circleR[i];}}if (i % 2 == 0) //分为5个级别的粒子速度{particleAngle[i] += (i % level + 1) * speed;}else{particleAngle[i] -= (i % level + 1) * speed;}particleAngle[i] = particleAngle[i] % 360;float rad = particleAngle[i] / 180 * Mathf.PI;particleRing[i].position = new Vector3(particleR[i] * Mathf.Cos(rad), particleR[i] * Mathf.Sin(rad), 0f);}particleSystem.SetParticles(particleRing, particleNum);Ray ray = ca.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit) && hit.collider.gameObject.tag == "button"){ischange = true;} else{ischange = false;}}
}

Unity3D学习:制作粒子光环特效相关推荐

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

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

  2. 【老物转载】如何学习制作卡拉OK特效

    原文地址:http://malakith.net/aegisub/index.php?topic=1566.0 中文翻译:soleil艾,MeteorX 前排提醒,这篇文章有点老了,不完全适用于201 ...

  3. Android制作粒子爆炸特效

    简介 最近在闲逛的时候,发现了一款粒子爆炸特效的控件,觉得比较有意思,效果也不错. 但是代码不好扩展,也就是说如果要提供不同的爆炸效果,需要修改的地方比较多.于是我对源代码进行了一些重构,将爆炸流程和 ...

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

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

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

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

  6. 【Unity3d学习】使用物理引擎——打飞碟游戏的物理引擎改进与射箭游戏设计

    文章目录 写在前面 HitUFO的物理引擎改进版本 物理引擎的改进版本思路与实现 PhysicsAction PhysicsManager 新接口类IActionManager 动作管理器基类的变化 ...

  7. Unity3D学习笔记:粒子特效参数

    Unity3D学习笔记:粒子特效参数含义 转载 https://blog.csdn.net/asd237241291/article/details/8433534 粒子特效 粒子系统检视面板 初始化 ...

  8. unity3D制作粒子

    参考网站首页的光环效果:http://i-remember.fr/en 用unity3d的粒子系统做一个粒子光环 向上效果图 可以看到该粒子效果由两部分组成,一部分是粒子光环,另一部分是粒子海洋 设计 ...

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

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

最新文章

  1. GitHub App终于来了,iPhone用户可尝鲜,「同性交友」更加便捷
  2. ios 中的基本算数函数
  3. mysql-5.7.21 二进制安装 | Jemalloc内存优化 | 备份恢复|修改密码
  4. 未能加载文件或程序集“xxx”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集...
  5. margin的简单应用
  6. HTML怎么去除数组的重复元素,js去除数组中重复元素并排序
  7. usb端点轮询_使用Spring Integration轮询http端点
  8. array python 交集_模糊数学Python库简介和评测
  9. 机器学习 —— 概率图模型(Homework: CRF Learning)
  10. 【算法系列之二】反波兰式
  11. php传递字符串给python,用PHP和Python生成短链接服务的字符串ID
  12. nginx实现https网站设置
  13. JSK-132 判断字符串是否是手机号码【入门】
  14. 360度动态漫游技术(html格式)
  15. 网络传输大文件使用什么软件可以高速传输?
  16. outlook配置126邮箱
  17. php统计页面访问量_PHP 统计 网页 总访问次数 附代码
  18. ES插件es-head下载和安装
  19. 净亏10.89亿欧元!法雷奥:2021年仍需保持谨慎,ADAS业务表现最佳
  20. Intro to Deep Learning Backpropagation 深度学习模型介绍及反向传播算法推导详解

热门文章

  1. 为什么叔本华认为年轻人很早洞察人事、谙于世故预示着本性平庸?
  2. linux指令英文含义,Linux —— 常见指令及其英文全称
  3. 小家电遇冷,苏泊尔、九阳、小熊电器求变
  4. 101-A1-kali安装(虚拟机版本)
  5. 计算机信息安全易错题目整理4
  6. Linux文件名排序
  7. 金蝶云星空简单账表列汇总
  8. Android ListView+ArrayAdapter简单用法
  9. [Java开发之路](8)输入流和输出流
  10. 找工作就像找对象,愿程序员不再孤单。。。