很多时候我们需要做一个金币移动效果。
比如,点击某个按钮之后,按钮附近出现各种零散的金币,然后他们都会向着显示金币的框框飞。
一般如果按钮都是固定的话,那么可以直接使用一个例子系统,然后调整好方向和速度,就可以达到要求!但是呢,有时候我们需要在很多地方都会使用这个效果。
一开始,我也是打算自己写一个类去自动生成一个个的小Image,然后里面加逻辑去控制他们移动。后面写到一半,感觉实在太费事了,为什么就不能控制粒子系统里面粒子移动呢?
于是在官方文档看到这个控制粒子属性的方法,还挺方便的,在这里贴一下。
自己写了一个类去控制,不用去记录粒子的位置,可是省了很多麻烦哦~
[RequireComponent(typeof(ParticleSystem))]
public class ParMove : MonoBehaviour {
ParticleSystem par;
ParticleSystem.Particle[] arrPar;
int arrCount = 0;
public RectTransform target;//指向要移动的目的
public float speed = 0.1f;
void Awake()
{
par = GetComponent<ParticleSystem>();
arrPar = new ParticleSystem.Particle[par.main.maxParticles];
}
void Update () {
if (target && par && par.isPlaying){
arrCount = par.GetParticles(arrPar);//获取到当前激活的粒子
Vector3 pos = Vector3.zero;
for(var i=0;i<arrCount;i++){
arrPar[i].position = Vector3.Lerp(arrPar[i].position, pos, speed);//设置他们的位置
}
par.SetParticles(arrPar, arrCount);//再把更新过的粒子数据设置回去
}
}
public void Play(){
if (par.isStopped){
par.Play(true);//供外边调用
}
}
}
我加了一个target指向移动目的地,开始不知道怎么回事,移动的老是不对,这是因为他们的坐标系不同,所以需要转换一下。
我这里后面再次加了一个设置Target的函数,然后在里面做了设置,主要是将粒子生成的空间改成和target是一样的,这样就只要让粒子都移动到0,0,0的位置就可以了
public void SetTarget(RectTransform transform){
target = transform;
ParticleSystem.MainModule module = par.main;//更改生成的空间,使用自定义的
module.simulationSpace = ParticleSystemSimulationSpace.Custom;
module.customSimulationSpace = transform;//把target设置给它
}
public void Play(RectTransform transform){//新加了一个play,可以根据不同需求去设置并且播放。
SetTarget(transform);
Play();
}
这些都做好之后,我后面还加了一个碰撞区域,是用来让粒子产生碰撞,自动消失的。想想粒子飞到金币框之后,是不是要让他消失呢,所以需要在target对象上面添加一个box collider 2d组件,不然粒子会超过金币框,知道它的生命时间终结为止哦。
最后把粒子系统的Trigger打上勾,如下图所示:
Colliders 要设置成金币框,这个其实也可以在代码中设置,我是都固定飞往一个地方,所以直接在编辑器中设置了。
好了,到此,本效果就新鲜出炉啦~
看看效果,金币不会超过哟~它们会在碰到框框之后小时,因为上面我选择的是Kill。