ui金币收集效果

韦星文
2023-12-01

很多时候我们需要做一个金币移动效果。

比如,点击某个按钮之后,按钮附近出现各种零散的金币,然后他们都会向着显示金币的框框飞。

一般如果按钮都是固定的话,那么可以直接使用一个例子系统,然后调整好方向和速度,就可以达到要求!但是呢,有时候我们需要在很多地方都会使用这个效果。

一开始,我也是打算自己写一个类去自动生成一个个的小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。

 类似资料: