Unity3D-程式碼控制粒子移動或者按照預定的路徑移動(ParticleSystem)
阿新 • • 發佈:2018-12-26
今天在做專案中,發現很多時候我們需要做一個金幣移動效果。
比如,點選某個按鈕之後,按鈕附近出現各種零散的金幣,然後他們都會向著顯示金幣的框框飛。
一般如果按鈕都是固定的話,那麼可以直接使用一個例子系統,然後調整好方向和速度,就可以達到要求!但是呢,有時候我們需要在很多地方都會使用這個效果。
一開始,我也是打算自己寫一個類去自動生成一個個的小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。