1. 程式人生 > >Unity利用粒子系統模擬下雪積雪效果

Unity利用粒子系統模擬下雪積雪效果

按我個人能力,這個方案的解決有兩種方式

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分鐘幀率才下降:

所以我們需要合併這個網格優化網格:合併網格請自行百度吧,記得要儲存這些圖片: