文章目录
0 前言
项目内容:利用粒子系统创造简易的绽放爱心群,并辅以控制组件
灵感来源:很多图片和视频都有类似的特效,所以就想看看能不能做出效果更炫的特效。
1 效果以及项目地址
视频链接:粒子系统 - 爱心群绽放
项目地址:大作业:粒子系统(爱心群) · Eh/3d-game - 码云 - 开源中国 (gitee.com)
2 构建粒子系统
2.1 基础物体创建
2.1.1 材料准备
需要准备如下材料:
-
带有透明通道的爱心 png 图片(可以用 photoshop(PS如何快速画出红色实心的心形-百度经验 (baidu.com)) 自制, 但我没有photoshop,是在 iconfont 下载的);
-
(可选)在asset store 下载暗色的背景(我下载的是
Urban Night Sky
)并导入,便于效果展示。-
首先选择“添加至我的资源”,加载后单击 “在unity中打开”,确认后跳转至 unity;
图1:asset store搜索资源 -
在unity中,选择“Download-import-import”,资源包就添加到如下目录了:
-
2.1.2 创建爱心 Material
- 新建
Material
:在 Asset 目录下的空白位置(如图3红色箭头所示)右击鼠标,移动到Create
处,在子目录下选择Material
,并重命名为 heart, 结果如图3所示:
- 参数设置:按照图4步骤,将爱心的
Shader
和Particle Texture
参数设置好。
2.1.2 创建粒子系统
- 新建一个
ParticleSystem
作为父物体,命名为ParticleParent
;
- 参数设置:如图6所示,关闭它的粒子渲染,仅作为选中可播放粒子效果使用。
2.2 其他参数设置
2.2.1 第一层效果
- 主要负责:爱心跳动效果。
-
创建子粒子系统
heart
,基本参数设置如图7;
图7:勾选 Renderer — Material 设为 heart texture -
参数设置:如图8,设置
Shape
为Sphere
使得爱心从中间生成,Velocity
添加Y向上的效果,Color over Lifetime
设置渐显渐隐的效果,Size over Lifetime
添加渐大渐小的爱心跳动的感觉;
图8:heart 其他参数设置 (1) - 更多参数设置:如图9,
Start Lifetime
调小,心跳的效果会更明显,Start Rotation
使得 生成的爱心轻微左右有变化,不那么单一的正向,其他根据自己需要调整即可;
图9:heart 其他参数设置 (2) - 更多参数设置:如图9,
2.2.2 第二层效果
- 主要负责:由中心发散爱心效果。
-
创建子粒子系统
heart (1)
基本参数设置如图7; -
其他参数设置:如图10,勾选
Emission
,设置Shape
为Sphere
使得爱心从中间生成(半径大小根据Start Speed
适当调整),Color over Lifetime
设置渐显渐隐的效果,Size over Lifetime
添加渐大渐小的爱心跳动的感觉;
![在这里插入图片描述](https://img-blog.csdnimg.cn/6581c3dbe16040b395a3667f84a85781.png#pic_center#=50%x图10:heart (1) 其他参数设置 -
更多参数设置:如图11
Start Lifetime
适当比第一层爱心调长,Start Speed
调快一点,Start Size
适当调小,配合第一层放大心跳的感觉效果;
图11:heart (1) 其他参数设置 备注:因为我的爱心图片比较小(模糊),所以在后期我把上面的参数都调大了不少倍,效果才相对清晰一些。
2.3 设置背景
-
添加
skybox
组件:如图12,单击MainCamera
— 选择 Add Component — 选择 Skybox;
图12 -
把
Custom Skybox
设为 skybox,效果如图13:
2.4 拖尾效果
原本想再做一个爆炸效果,但是感觉爱心爆炸怪怪的,就算了……
- 新建子发射器:在
heart (1)
内勾选Sub_Emitters
,会自动生成一个子发射器,命名为tail
,Material
也是爱心;
tail
参数设置:注意把Size over lifetime
设置为线性递减的直线,这样才能达到拖尾的效果,即逐渐变小直至消失;
3 设置控制组件
3.1 创建滑动条
设置参数如图16:
3.2 脚本:control.cs
功能:
- 设置两个按钮,控制开始和结束绽放爱心群;
- 利用
startLifetime
控制爱心的绽放速率。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class control : MonoBehaviour
{
public GameObject play;
public ParticleSystem ParticleParent, heart;
public GUIStyle buttonstyle;
// 滑动条
public Slider slider;
public float hSliderValue = 3.0F;
// public ParticleSystem[] child;
// public float value; // 保存滑动条的值
void OnGUI(){
if (GUI.Button (new Rect (0,Screen.height-55,80,55), "开始绽放")) {
ParticleParent.Play();
}
if (GUI.Button (new Rect (80,Screen.height-55,80,55), "停止绽放")) {
ParticleParent.Stop();
}
GUI.Label (new Rect(20, 25, 100, 30),"绽放速度:");
hSliderValue = GUI.HorizontalSlider(new Rect(80, 30, 100, 30), hSliderValue, 0.0F, 10.0F);
// speed = slider.value;
}
// Start is called before the first frame update
void Start()
{
play = GameObject.Find("play");
slider = play.GetComponent<Slider>();
heart = GetComponent<ParticleSystem>();
// child = ParticleParent.GetComponentsInChildren<ParticleSystem>();
// for(int i=0; i<child.Length; i++ )
// {
// if(child[i].name=="heart (1)")
// {
// heart = child[i];
// }
// }
}
// Update is called once per frame
void Update()
{
var main = heart.main;
main.startLifetime = hSliderValue;
}
}
3.3 操作
将脚本 control.cs
挂在到 GameObject play
上,各参数设置如下:
3.3 操作
将脚本 control.cs
挂在到 GameObject play
上,各参数设置如下:
至此,项目效果如下: