Unity 闪电特效之 闪电链效果的简单实现

2025-09-28 06:02:45

1、打开Unity,新建一个工程,具体如下图

Unity 闪电特效之 闪电链效果的简单实现

2、在工程中新建两个 GameObject 调整好合适位置,为了方便观察,可以再其下添加子物体 Cube,具体如下图

Unity 闪电特效之 闪电链效果的简单实现

Unity 闪电特效之 闪电链效果的简单实现

3、在工程中新建脚本 ChainLightning,双击打开编辑,具体如下图

Unity 闪电特效之 闪电链效果的简单实现

4、ChainLightning 脚本的具体代码和代码说明如下图

Unity 闪电特效之 闪电链效果的简单实现

Unity 闪电特效之 闪电链效果的简单实现

5、ChainLightning 脚本的具体内容如下:

using System.Collections.Generic;

using UnityEngine;

[RequireComponent(typeof(LineRenderer))]  

[ExecuteInEditMode]  //普通的类,加上ExecuteInEditMode, 就可以在编辑器模式中运行

public class ChainLightning : MonoBehaviour {

    public float detail = 1;//增加后,线条数量会减少,每个线条会更长。  

    public float displacement = 15;//位移量,也就是线条数值方向偏移的最大值  

    public Transform EndPostion;//链接目标  

    public Transform StartPosition;  

    public float yOffset = 0;  

    private LineRenderer _lineRender;  

    private List<Vector3> _linePosList;  

    private void Awake()  

    {          _lineRender =GetComponent<LineRenderer>();  

        _linePosList = new List<Vector3>();  

    }  

    private void Update()  

    {  

        //判断是否暂停,未暂停则进入分支

        if(Time.timeScale != 0)  

        {  

            _linePosList.Clear();  

            Vector3 startPos =Vector3.zero;  

            Vector3 endPos =Vector3.zero;  

            if (EndPostion != null)  

            {  

                endPos =EndPostion.position + Vector3.up *yOffset;  

            }  

            if(StartPosition != null)  

            {  

                startPos =StartPosition.position + Vector3.up *yOffset;  

            }  

            //获得开始点与结束点之间的随机生成点

            CollectLinPos(startPos,endPos, displacement);  

            _linePosList.Add(endPos);  

            //把点集合赋给LineRenderer

            _lineRender.SetVertexCount(_linePosList.Count);  

            for (int i = 0, n = _linePosList.Count; i< n; i++)  

            {  

                _lineRender.SetPosition(i, _linePosList[i]);  

            }  

        }  

    }  

    //收集顶点,中点分形法插值抖动  

    private void CollectLinPos(Vector3 startPos,Vector3 destPos,float displace)  

    {  

        //递归结束的条件

        if (displace < detail)  

        {  

            _linePosList.Add(startPos);  

        }  

        else  

        {  

            float midX = (startPos.x + destPos.x) / 2;  

            float midY = (startPos.y + destPos.y) / 2;  

            float midZ = (startPos.z + destPos.z) / 2;  

            midX += (float)(UnityEngine.Random.value - 0.5) * displace;  

            midY += (float)(UnityEngine.Random.value - 0.5) * displace;  

            midZ += (float)(UnityEngine.Random.value - 0.5) * displace;  

            Vector3 midPos =new Vector3(midX,midY,midZ);  

            //递归获得点

            CollectLinPos(startPos,midPos, displace / 2);  

            CollectLinPos(midPos,destPos, displace / 2);  

        }  

    } 

}

6、脚本编译正确回到Unity,导入一张闪电图,并新建一个Material,把Shader改为Particles/Additive把导入的贴图给 Material 赋上,具体如下图

Unity 闪电特效之 闪电链效果的简单实现

Unity 闪电特效之 闪电链效果的简单实现

Unity 闪电特效之 闪电链效果的简单实现

7、在场景中,新建一个空物体,把脚本挂载上去,适当的调整脚本参数的值,效果如下图

Unity 闪电特效之 闪电链效果的简单实现

Unity 闪电特效之 闪电链效果的简单实现

8、在调整Material的参数,使得只出现一条闪电,具体如下图

Unity 闪电特效之 闪电链效果的简单实现

9、最终效果(作为参照的Cube可以删掉)如下图

Unity 闪电特效之 闪电链效果的简单实现

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢