特效系统
粒子系统:可以用来模拟刀光,火焰,爆炸,水滴,风雨等各种环境特效
拖尾:通常用来制作一些人物或者武器移动的拖尾特效。
粒子力场:在一个区域范围内模拟一个力场钢的效果,改变粒子的表现。
粒子系统:作用:在Unity中,粒子系统可以用来模拟刀光,火焰,爆炸,水滴,风雨等各种环境特效,
通常由负责制作特效的同事制作好,提供给我们程序员,然后导入到Unity使用。
创建粒子:在层级面板中右键---效果---粒子系统完成创建。
脚本和粒子组件交互
克隆:可以先做成预设,然后从Resources文件夹加载出来,跟实例其他物体一样进行克隆即可。
播放:ParticleSystem.Play();
停止:ParticleSystem.Stop();
暂停:ParticleSystem.Pause();
销毁:跟其他物体一样使用Destory();方法销毁即可。
设置属性:首先获得要设置的模块,然后设置模块里面的属性
碰撞回调:OnParticleCollision(GameObject go);
对粒子控制脚本进行编辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleTest : MonoBehaviour
{
GameObject particleGo;
ParticleSystem particle;
// Start is called before the first frame update
void Start()
{
particleGo = GameObject.Instantiate(Resources.Load<GameObject>("22_RFX_Fire_Campfire1"));
particleGo.transform.position = transform.position;
particle = particleGo.GetComponent<ParticleSystem>();
ParticleSystem.MainModule mainModule = particle.main;
mainModule.loop = true;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("a"))
{
particle.Play();
}
if (Input.GetKeyDown("b"))
{
particle.Stop();
}
if (Input.GetKeyDown("c"))
{
particle.Pause();
}
if (Input.GetKeyDown("d"))
{
Destroy(particleGo);
}
}
}
粒子碰撞回调
脚本控制程序
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleTest : MonoBehaviour
{
//GameObject particleGo;
//ParticleSystem particle;
// Start is called before the first frame update
void Start()
{
//particleGo = GameObject.Instantiate(Resources.Load<GameObject>("22_RFX_Fire_Campfire1"));
//particleGo.transform.position = transform.position;
//particle = particleGo.GetComponent<ParticleSystem>();
//ParticleSystem.MainModule mainModule = particle.main;
//mainModule.loop = true;
}
private void OnParticleCollision(GameObject go)
{
Debug.Log("粒子发生了碰撞,碰撞到物体:" + go.name);
}
// Update is called once per frame
void Update()
{
//if (Input.GetKeyDown("a"))
//{
// particle.Play();
//}
//if (Input.GetKeyDown("b"))
//{
// particle.Stop();
//}
//if (Input.GetKeyDown("c"))
//{
// particle.Pause();
//}
//if (Input.GetKeyDown("d"))
//{
// Destroy(particleGo);
//}
}
}
粒子系统触发回调
触发回调方法OnParticleTrigger();触发函数比较特殊,每帧都会执行的,大多是用在于需要对发生触发的粒子进行一些处理的时候用的。
获取发生触发的粒子:GetTriggerParticles();参数是触发类型和List<ParticleSystem.Particle>,其中List是用来缓存这一帧发生触发的粒子的。
脚本控制程序触发回调
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleTest : MonoBehaviour
{
//GameObject particleGo;
ParticleSystem particle;
// Start is called before the first frame update
void Start()
{
particle = transform.GetComponent<ParticleSystem>();
//particleGo = GameObject.Instantiate(Resources.Load<GameObject>("22_RFX_Fire_Campfire1"));
//particleGo.transform.position = transform.position;
//particle = particleGo.GetComponent<ParticleSystem>();
//ParticleSystem.MainModule mainModule = particle.main;
//mainModule.loop = true;
}
private void OnParticleTrigger()
{
//用来缓存这一帧触发的粒子的
List<ParticleSystem.Particle> particles = new List<ParticleSystem.Particle>();
//获取每一帧发生触发的粒子
int numEnter = particle.GetTriggerParticles(ParticleSystemTriggerEventType.Enter,particles);
for(int i =0; i < numEnter; i++)
{
ParticleSystem.Particle pt= particles[i];
pt.startColor = Color.red;
particles[i] = pt;
}
particle.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, particles);
}
// Update is called once per frame
void Update()
{
//if (Input.GetKeyDown("a"))
//{
// particle.Play();
//}
//if (Input.GetKeyDown("b"))
//{
// particle.Stop();
//}
//if (Input.GetKeyDown("c"))
//{
// particle.Pause();
//}
//if (Input.GetKeyDown("d"))
//{
// Destroy(particleGo);
//}
}
}
特效系统之拖尾
拖尾:作用:拖尾经常会用于做一些人物或者武器等移动后产生的拖尾效果。
脚本中常用的属性:TrailRenderer.emitting属性,是一个布尔值,true代表开始根据位置变化产生拖尾,false代表暂停产生拖尾。
编写脚本控制拖尾,脚本名字为RenderTest.cs,挂载到机器人身上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RenderTest : MonoBehaviour
{
GameObject go;
// Start is called before the first frame update
void Start()
{
go = GameObject.Instantiate(Resources.Load<GameObject>("Accelerate"));
go.transform.SetParent(transform);
go.transform.localPosition = new Vector3(0,0.5f,0f);
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("a"))
{
go.GetComponent<TrailRenderer>().emitting = true;
}
if (Input.GetKeyDown("b"))
{
Destroy(go);
}
}
}
特效系统之粒子力场