Unity3D-代码控制粒子移动或者按照预定的路径移动(ParticleSystem)

参考:http://blog.csdn.net/pz789as/article/details/54573621

 

今天在做项目中,发现很多时候我们需要做一个金币移动效果。

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

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

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

 

 

 

我加了一个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打上勾,如下图所示:

Unity3D-代码控制粒子移动或者按照预定的路径移动(ParticleSystem)_第1张图片

Colliders 要设置成金币框,这个其实也可以在代码中设置,我是都固定飞往一个地方,所以直接在编辑器中设置了。

好了,到此,本效果就新鲜出炉啦~

看看效果,金币不会超过哟~它们会在碰到框框之后消失,因为上面我选择的是Kill。

Unity3D-代码控制粒子移动或者按照预定的路径移动(ParticleSystem)_第2张图片

你可能感兴趣的:(Unity3D,Unity摸索记录)