1、打开Unity,新建一个工程,具体如下图
2、在工程中新建两个 GameObject 调整好合适位置,为了方便观察,可以再其下添加子物体 Cube,具体如下图
3、在工程中新建脚本ChainLightning,双击打开编辑,具体如下图
4、ChainLightning 脚本的具体代码和代码说明如下图
5、ChainLightning 脚本的具体粝简肯惧内容如下:usingSystem.Collections.Generic;usingUnityEngine;[RequireComp泠贾高框onent(typeof(LineRenderer))][ExecuteInEditMode]//普通的类,加上ExecuteInEditMode,就可以在编辑器模式中运行publicclassChainLightning:MonoBehaviour{publicfloatdetail=1;//增加后,线条数量会减少,每个线条会更长。 publicfloatdisplacement=15;//位移量,也就是线条数值方向偏移的最大值publicTransformEndPostion;//链接目标 publicTransformStartPosition; publicfloatyOffset=0; privateLineRenderer_lineRender; privateList<Vector3>_linePosList;privatevoidAwake() {_lineRender=GetComponent<LineRenderer>(); _linePosList=newList<Vector3>(); }privatevoidUpdate() { //判断是否暂停,未暂停则进入分支 if(Time.timeScale!=0) { _linePosList.Clear(); Vector3startPos=Vector3.zero; Vector3endPos=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(inti=0,n=_linePosList.Count;i<n;i++) { _lineRender.SetPosition(i,_linePosList[i]); } } }//收集顶点,中点分形法插值抖动 privatevoidCollectLinPos(Vector3startPos,Vector3destPos,floatdisplace) { //递归结束的条件 if(displace<detail) { _linePosList.Add(startPos); } else {floatmidX=(startPos.x+destPos.x)/2; floatmidY=(startPos.y+destPos.y)/2; floatmidZ=(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;Vector3midPos=newVector3(midX,midY,midZ);//递归获得点 CollectLinPos(startPos,midPos,displace/2); CollectLinPos(midPos,destPos,displace/2); } }}
6、脚本编译正确回到Unity,导入一张闪电图,并新建一个怡觎现喾Material,把Shader改为Particles/Additive把导入的贴图给 Material 赋上,具体如下图
7、在场景中,新建一个空物体,把脚本挂载上去,适当的调整脚本参数的值,效果如下图
8、在调整Material的参数,使得只出现一条闪电,具体如下图
9、最终效果(作为参照的Cube可以删掉)如下图