unity实现烟花案例 点击球体实现烟花的播放

597 阅读2分钟

1.烟花静态

1.在新建材质的基础上把材质颜色改为紫色的效果

2.新建粒子系统

image.png

3.配置粒子系统对应的配置

image.png

设置持续时间为3秒、起始生命周期设置为一个区间值(双常数随机值),起始颜色设置为渐变颜色,-不断的添加新建并且添加颜色

image.png

设置突发数量、周期可以设置为无穷大或者1,形状类型改为球体,这样烟花才能按照圆的四周进行扩散。

4.效果如下:

动画4.gif

2.烟花控制动态

1.将烟花设置为对象

将设置好的烟花(粒子系统)重命名为firework,将它拖拽到assets文件夹里面,并将上面的firework删除即可。

image.png

2.导入新资产,将声音导入

3.在camera脚本文件声明烟花对象,并将对象拖拽到其中去

    //拿到烟花--关联烟花
    public GameObject firework;

image.png

4.编写部分camera脚本文件

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

public class camera : MonoBehaviour
{
    //拿到烟花--关联烟花
    public GameObject firework;
    //拿到摄像机的组件
    private Camera mainCamera;
    //初始化光线变量
    private Ray ray;

    private Collider target; //碰撞的物体
    void Start()
    {
        //先拿到当前摄像机组件
        mainCamera = GetComponent<Camera>();

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            //创建一个射线  从某个点发出--鼠标点击的点
            //Debug.Log(Input.mousePosition); //鼠标点击的位置 --z轴方向是没有变的,拿到的是x和y轴的变化的值
            //从这个点Input.mousePosition-鼠标点击的位置发射一条直线出来
            ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            //获取碰撞的结果

            //创建一个信息收集器 hit--碰撞的物体
            RaycastHit hit;
            //判断是否碰撞到
            bool res = Physics.Raycast(ray, out hit); //这个表示碰撞结果返回的布尔值,同时将碰撞到的物体返回出来给你
             //判断碰撞是否为小球

            //只有碰撞了才有理论可写
            if (res && hit.collider.tag == "light")
            {
                target = hit.collider;
                Light childLight = hit.collider.GetComponentInChildren<Light>();
                childLight.enabled = childLight.enabled ? false : true;

                //播放烟花  和烟花声音  隔了一秒之后爆炸还有显示
                AudioSource audio = hit.collider.GetComponent<AudioSource>();
                audio.Play();
                //延迟去播放烟花特效
                Invoke("fireShow", 2f);

            }
        }

    }
    //创建一个播放烟花的方法
    private void fireShow()
    {
        //克隆烟花
        GameObject clone = Instantiate(firework, target.transform.position, target.transform.rotation);
        Destroy(clone, 3f);
    }
}

代码是在实现灯光案例的基础上进行实现的,所以代码有些跟上面实现灯光的代码重复了。

本质上先声明烟花对象,将对象拖入挂载到相机身上的firework对象中,其次声明碰撞对象, 当点击了球的时候,将当前碰撞的物体赋值给target,

    //播放烟花  和烟花声音  隔了一秒之后爆炸还有显示
                AudioSource audio = hit.collider.GetComponent<AudioSource>();
                audio.Play();
                //延迟去播放烟花特效
                Invoke("fireShow", 2f);

通过延迟播放烟花声音来实现

    private void fireShow()
    {
        //克隆烟花
        GameObject clone = Instantiate(firework, target.transform.position, target.transform.rotation);
        Destroy(clone, 3f);
    }

动画5.gif