3D游戏编程与设计——粒子系统

粒子系统

制作简单粒子

制作光球

  1. 创建空对象

  2. 创建光效子粒子,进行如下设置
    光效设置1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 创建星光子粒子,进行如下设置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 设置后效果如图
    效果

添加动作效果

主要的效果为点击闪烁的光球,光球会发散出一条粒子轨迹
鼠标点击主要代码:

void OnMouseDown()
    {
        if (obj.active == true)
        {
            obj.SetActive(false);
        }
        else
        {
            obj.SetActive(true);
        }
    }
    private void OnGUI()
    {
        if (show_time > 0)
        {
            GUI.Label(new Rect(Screen.width / 2 - 50, 30, 150, 150), "点击光球展示特效");
        }
    }
    public IEnumerator ShowTip()
    {
        while (show_time >= 0)
        {
            yield return new WaitForSeconds(1);
            show_time--;
        }
    }

显示粒子路径主要代码:

public class ParticlePath : MonoBehaviour
{
    //粒子系统
    public ParticleSystem particle;
    //路径指定达到的点的坐标
    public List<Vector3> points;

    //每个坐标轴的速度变化曲线
    private AnimationCurve curveX = new AnimationCurve();
    private AnimationCurve curveY = new AnimationCurve();
    private AnimationCurve curveZ = new AnimationCurve();
    //关键帧所需要保存的信息
    private Queue<FrameDate> frames = new Queue<FrameDate>();

    void Start()
    {
        if (points.Count > 1)
        {
            //设置粒子发生点
            particle.transform.position = points[0];

            //路径的总长
            float totalDistance = 0;
            for (int i = 1; i < points.Count; i++)
            {
                //与下一个点距离
                float dis = Vector3.Distance(points[i], points[i - 1]);
                //向下一个点方向
                Vector3 dir = points[i] - points[i - 1];
                dir.Normalize();
                frames.Enqueue(new FrameDate(dir, dis));

                totalDistance += dis;
            }
            float time = 0;
            while (frames.Count > 0)
            {
                //关键帧的数据
                FrameDate data = frames.Dequeue();
                //将当前时刻和坐标轴值作为关键帧添加进曲线
                curveX.AddKey(new Keyframe(time, data.direction.x, float.PositiveInfinity, float.PositiveInfinity));
                curveY.AddKey(new Keyframe(time, data.direction.y, float.PositiveInfinity, float.PositiveInfinity));
                curveZ.AddKey(new Keyframe(time, data.direction.z, float.PositiveInfinity, float.PositiveInfinity));
                //设置下一时刻的关键帧
                time += (data.distance / totalDistance);
            }
            //设置粒子随着时间变化的速度
            var velocity = particle.velocityOverLifetime;
            velocity.enabled = true;
            velocity.space = ParticleSystemSimulationSpace.Local;
            //单位时间需要移动的长度
            float distancePerTime = totalDistance / particle.startLifetime;
            velocity.x = new ParticleSystem.MinMaxCurve(distancePerTime, curveX);
            velocity.y = new ParticleSystem.MinMaxCurve(distancePerTime, curveY);
            velocity.z = new ParticleSystem.MinMaxCurve(distancePerTime, curveZ);
        }
    }

实现效果:
在这里插入图片描述

项目地址

GitHub

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值