1. 程式人生 > >Unity3D-程式碼控制粒子移動或者按照預定的路徑移動(ParticleSystem)

Unity3D-程式碼控制粒子移動或者按照預定的路徑移動(ParticleSystem)

今天在做專案中,發現很多時候我們需要做一個金幣移動效果。

比如,點選某個按鈕之後,按鈕附近出現各種零散的金幣,然後他們都會向著顯示金幣的框框飛。

一般如果按鈕都是固定的話,那麼可以直接使用一個例子系統,然後調整好方向和速度,就可以達到要求!但是呢,有時候我們需要在很多地方都會使用這個效果。

一開始,我也是打算自己寫一個類去自動生成一個個的小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。