Unity利用粒子系统模拟下雪积雪效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37283423/article/details/78614150

按我个人能力,这个方案的解决有两种方式

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分钟帧率才下降:

所以我们需要合并这个网格优化网格:合并网格请自行百度吧,记得要存储这些图片:

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试