Unity利用粒子系統模擬下雪積雪效果
阿新 • • 發佈:2019-01-26
按我個人能力,這個方案的解決有兩種方式
1、 運用shader的法線和夾角來決定積雪位置,強度,厚度;
2、 運用粒子系統下雪,利用粒子碰撞檢測生成雪花落地,因為大批量的雪花其實是一張張圖片組成的,把他們的載體網格合併成一個大的全刪掉,不停的新增新生成的地上的雪花;
我現在來說一下這個簡單的模擬下雪,因為很方便所以才說一說,適合當做PlanB 如果能用shader做的千萬別用這個,好low啊;
過程步驟:
1、 建立場景和粒子發射器
粒子系統發射器的掛載指令碼:(這個指令碼不涉及到網格合併,這個方面網上教程很多也不復雜,我就不加了,麻煩。。。)
2、 粒子系統必須要點開的元件選項:
一定要傳送碰撞訊息,這樣才能檢測碰撞和獲取資訊:
指令碼貼一下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ParticleSySC : MonoBehaviour {//指令碼掛在粒子物件上 public List<ParticleCollisionEvent> partcollision; //儲存一幀內的所有碰撞資訊 public ParticleSystem _part; //這個例子系統 public List<GameObject> Snow=new List<GameObject>(); //儲存所有生成的物件 public GameObject Snows;//雪的預製體 // Use this for initialization void Start () { partcollision = new List<ParticleCollisionEvent>(); _part = transform.GetComponent<ParticleSystem>(); } // Update is called once per frame void Update () { } private void OnParticleCollision(GameObject other) { _part.GetCollisionEvents(other, partcollision); //把資料存入這個碰撞資訊集合裡,自動就新增完了//下一幀 會清空 Quaternion q = Quaternion.FromToRotation(Snows.transform.forward, -partcollision[0].normal);//計算這個生成物體的旋轉。 GameObject s= GameObject.Instantiate(Snows, partcollision[0].intersection, q); //生成建立 Snow.Add(s); // Debug.Log(partcollision[0].intersection); } }
結果執行如下圖(我這裡沒有雪的透明圖就直接白底代替了):
當它執行到這裡的時候幀率並沒有下降:
後來測試大概得執行30分鐘幀率才下降:
所以我們需要合併這個網格優化網格:合併網格請自行百度吧,記得要儲存這些圖片: