3D游戏第八次作业

3D游戏第八次作业

一、简单粒子制作

  • 按参考资源要求,制作一个粒子系统,参考资源
  • 使用 3.3 节介绍,用代码控制使之在不同场景下效果不一样

1. 模拟烟花发射

效果展示:

实现:

给空对象挂载一个名为moveup的粒子系统模拟烟花发射

Emission控制粒子上升

设置Size over Lifetime上升过程中闪光

2. 模拟爆炸

效果展示 :

实现:

在一个对象上挂载一个粒子系统名为explosion,将形状设置为Sphere,然后设置Radius设置为0.01,Radius Thickness设置为0

设置Size over Lifetime模拟爆炸后效果,开始显示颜色后颜色逐渐变浅直至消失

3. 粒子光环

效果展示:

实现:

添加粒子系统

 public ParticleSystem particleSystem; 	//粒子系统对象
    public int particleNumber = 5000;       //最大粒子数
    public float pingPong = 0.05f;
    public float size = 0.05f;             //大小
    public float maxRadius = 10f;          //旋转半径
    public float minRadius = 4.0f;
    public float speed = 0.05f;             //运动速度
    private float[] particleAngle;
    private float[] particleRadius;
 
    private float time = 0;
    private ParticleSystem.Particle[] particlesArray;
 
    private Color[] changeColor = { new Color(255, 255, 255), new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 0, 255) };
    private float colorTimeOut = 0;

对粒子系统进行初始化位置:

void Start()
    {
        particleSystem = GetComponent<ParticleSystem>();
 
        particlesArray = new ParticleSystem.Particle[particleNumber];
        particleSystem.maxParticles = particleNumber;
        particleAngle = new float[particleNumber];
        particleRadius = new float[particleNumber];
 
        particleSystem.Emit(particleNumber);
        particleSystem.GetParticles(particlesArray);
 
        init();
 
        particleSystem.SetParticles(particlesArray, particlesArray.Length);
    }
 
void init()
    {
 
        for (int i = 0; i < particleNumber; i++)
        {
         
            float angle = Random.Range(0.0f, 360.0f);
        
            float rad = angle / 180 * Mathf.PI;
           
            float midRadius = (maxRadius + minRadius) / 2;
            float rate1 = Random.Range(1.0f, midRadius / minRadius);
            float rate2 = Random.Range(midRadius / maxRadius, 1.0f);
            float r = Random.Range(minRadius * rate1, maxRadius * rate2);
      
            particlesArray[i].size = size;
 
            particleAngle[i] = angle;
            particleRadius[i] = r;
      
            particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);
        }
    }

控制粒子运动:

每一次Update的 colorTimeOut中都定义了一个循环。首先粒子会不断扩大,当粒子扩大到设置的相应的阈值后就会缩小,并且缩小的速度会大于放大的速度

void Update()
    {
        //每一个colorTimeOut实现一次缩放
        colorTimeOut += Time.deltaTime;
        for (int i = 0; i < particleNumber; i++)
        {
            time += Time.deltaTime;
            particlesArray[i].color = changeColor[(int)(colorTimeOut % 5)];
            particleRadius[i] += (Mathf.PingPong(time / minRadius / maxRadius, pingPong) - pingPong / 2.0f);
            if (i % 2 == 0)//放大
            {
                particleAngle[i] += speed * (i % 10 + 1);
            }
            else//缩小
            {
                particleAngle[i] -= speed * (i % 10 + 1);
            }
            particleAngle[i] = (particleAngle[i] + 360) % 360;
            float rad = particleAngle[i] / 180 * Mathf.PI;
 
            particlesArray[i].position = new Vector3(particleRadius[i] * Mathf.Cos(rad), particleRadius[i] * Mathf.Sin(rad), 0f);
        }
        particleSystem.SetParticles(particlesArray, particleNumber);
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值