Unity 闪电特效之 闪电链效果的简单实现
1、打开Unity,新建一个工程,具体如下图
2、在工程中新建两个 GameObject 调整好合适位置,为了方便观察,可以再其下添加子物体 Cube,具体如下图
3、在工程中新建脚本 ChainLightning,双击打开编辑,具体如下图
4、ChainLightning 脚本的具体代码和代码说明如下图
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 赋上,具体如下图
7、在场景中,新建一个空物体,把脚本挂载上去,适当的调整脚本参数的值,效果如下图
8、在调整Material的参数,使得只出现一条闪电,具体如下图
9、最终效果(作为参照的Cube可以删掉)如下图