前言:
最近一个项目需要,我得了解一下Unity下2D灯光如何实现反射,特找来一篇教程——原视频链接太长了,不能复制过来,有兴趣请去b站找UP主——EvadeGame
2D灯光反射
先在2D场景中创建几个2D物体,并赋予碰撞盒
然后我们创建一个sprite,我这里起名叫:LaserGun,
并写给这个sprite写一个脚本——LaserGun.cs
然后我们在Unity场景中创建一个激光线
简单调整一下光线属性,然后把它让在LaserGun的下面,成为它的子物体,注意这时要将LineRenderer的UseWorldSpace勾选上(如果你不把他作为子物体,在后面的代码里从外面拖拽,那就不用这样了)
下面是核心代码:
public class LaserGun : MonoBehaviour
{
//Laser 本体
private LineRenderer laser;
//存储 Laser 经过的路径的列表
public List<Vector3> laserPoint = new List<Vector3>();
private void Start()
{
laser = transform.Find("Line").GetComponent<LineRenderer>();
}
private void Update()
{
//使LaserGun以一定速度旋转
transform.Rotate(Vector3.forward * 10f * Time.deltaTime);
if (Input.GetKey(KeyCode.Space))
{
laser.gameObject.SetActive(true);
CasetLaser();
laser.positionCount = laserPoint.Count;
laser.SetPositions(laserPoint.ToArray());
}
else {
laser.gameObject.SetActive(false);
}
}
void CasetLaser() {
//清空旧的LaserPoint
laserPoint.Clear();
//从Laser Gun的位置出发
Vector3 startPoint = transform.position;
//发射方向
Vector3 direction = transform.right;
//有了第一个出发点
laserPoint.Add(startPoint);
int i = 0;
do
{
RaycastHit2D hitInfo=Physics2D.Raycast(startPoint, direction);
//添加射线击中点到路径中
laserPoint.Add(hitInfo.point);
//新的发射方向
/*借助Unity内置的reflect函数,可以通过入射向量(inDirection)
和法向量(hit.normal),得到反射后的向量derection。
但是 startPoint已经改变了,所以先求方向
*/
direction = Vector2.Reflect(hitInfo.point-(Vector2)startPoint, hitInfo.normal);
//将下一次发射起点设定为击中点
startPoint = (Vector3)hitInfo.point+direction*0.01f;
i++;
} while (i<6);
}
}
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢