3D游戏作业8:仿制“奥苏安大漩涡”(粒子系统)

作业8:仿制“奥苏安大漩涡”(粒子系统)

灵感来源

粒子效果,就是从一个点发送许多粒子,粒子在经过材质的装修后,扩散开来形成密密麻麻的一篇,给人视觉上的美感(如烟花,汽车尾气)。

但是光靠系统提供的几种粒子扩散方法显然不够,因此我开始学习怎么自己定义粒子的运动轨迹

我需要找不规则的形状。

作为XXXX,我不自觉地想到了这个:

在这里插入图片描述

这是中古战锤世界里,位于世界中心的“大漩涡”,守护他们的正是“奥苏安”的精灵们。

我觉得这种螺旋升天的水,就是一种不规则的运动。

因此我开始用粒子效果仿制一个“奥苏安大漩涡”。

效果

截图如下:

在这里插入图片描述
(肯定比原本的丑一点)

动态的生成过程请看视频:blibli

制作原理

大体思路

(1)在粒子系统组件ParticleSystem中,有一个选项叫Start Speed。这是粒子的速度,一般情况下,粒子会按照这个速度匀速运动。但是unity自带的粒子效果中,粒子总是走直线,不能运行曲线。运行曲线需要其他算法。

(2)在ParticleSystem组件中有函数GetParticles。作用是得到所有的particle(具体用法可以在后面的代码中查看)。得到了所有的particle粒子后,就可以对其位置进行更改,从而完成自定义的运动轨迹。

综上两点,可以通过Start Speed调整初始速度,使粒子匀速上升,自动完成垂直方向的运动。
通过GetParticled函数,更改每一个粒子的位置,对粒子水平方向的运动进行操作。
最后,增加生成频率,大规模生产粒子,从而达到连续的效果。

在unity中对ParticleSystem组件操作

通过不断调试,调节关于粒子的速度,生成频率,存在周期等参数,这个只能一遍遍试,才能有较好的视觉体验。

我的部分参数如下:
在这里插入图片描述
在这里插入图片描述

接下来制作材质:

由于漩涡并不是光滑的,波涛汹涌的水纹看起来粗糙,残缺,所以我自己画了如下的粒子材质:

在这里插入图片描述

将材质导入后直接拖到粒子组件上,就会自动应用。这样看起来才更有斑斓的质感。

在代码中对ParticleSystem进行操作

SController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SController : MonoBehaviour
{
    public ParticleSystem ps;
    public ParticleSystem.Particle[] particles;

    public int speed=5;
    public float k=0.05f;
    public float b=1;
    public Transform tr;
    void Start()
    {
        ps=gameObject.GetComponent<ParticleSystem>();
        particles=new ParticleSystem.Particle[ps.maxParticles];
        tr.position=new Vector3(0,0,0);
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        int num=ps.GetParticles(particles);
        float x,y,z;
        float r,nowr,rate;
        for (int i=0;i<num;++i){
            Vector3 v=particles[i].position;
            
            x=v.x;
            y=v.y;
            z=v.z;

            nowr=(new Vector3(0,y,0)-particles[i].position).magnitude;
            r=y*y*k+b;
            
            if (nowr<=0.5){
                x=1;
                z=0;
            }else{
                rate=r/nowr;
                x=x*rate;
                z=z*rate;
            }

            tr.position=new Vector3(x,y,z);
            
            tr.RotateAround(new Vector3(0,y,0),Vector3.up,speed);

            particles[i].position=tr.position;
        }
        ps.SetParticles(particles,num);
    }
}

主要步骤是:
通过
int num=ps.GetParticles(particles);
将所有粒子的信息储存在数组particles中,返回值num是总共的粒子数,然后遍历数组,就可以了。

其他的就是很基本的操作了,比如Transform.RotateAround(),还有每一个高度上的半径,这些都可以自定义。

最后,别忘了
ps.SetParticles(particles,num);
使用粒子系统的SetParticles函数对粒子系统进行覆盖,否则,之前更改的位置信息,全都无效。

至此,完成制作原理的解释。

项目亮点

(1)采用了自定义粒子轨迹,使应用更加灵活多变。
(2)自定义了粒子的材质,了解了材质中黑,白,灰在unity中的作用。
(3)通过调节渐变色,使漩涡底部粒子集中区不会过于明亮。较为美观 (至少我认为挺好看)

项目链接

如果想看代码,这里是代码链接:代码链接

想要下载项目,在这里:项目下载

下载后使用方法:

新建项目,用我的Assets覆盖你的Assets,刷新unity。双击打开一个名叫“u”的Scene,就可以运行了(这个名字是随便起的,反正也只有一个Scene)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值