最近在学习Unity3D游戏开发,练习制作飞机大战的2D游戏,但激光的效果不知道如何实现,经过网上查询和调试,做了一个激光的摸拟效果。
1.首先,组件准备,如图
Player: 飞机
fire: 子弹和激光的发射点(因为激光射线也是碰撞体,所以发射点要放在Player的前面,不能重叠,会影响光线投射)
line和line1为激光和电光效果
MoveControl脚本拖入Player控件飞机操作,同时加入BOM爆作效果对象,主要参数如图:
fire为一个空对象,放在Player的前方就行,为射线的发射点
line和line1设置如图:
1.去掉linerenderer的对勾,禁用linerenderer,因为我们要通过脚本控制
2.两个line都使用 Use World Space
3.第一个line加上Materials,为激光的样式贴图
4.因为激光只有一个起始点和终点,即两个点所以line的Size设置2,line1电光效果可以有多个节点,这里我们设置为6个
5,将所有Position节点设置为0,我们将在脚本中控制
主要代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveControl : MonoBehaviour {
public Transform fire;//射线发射点
public GameObject bom;
public LineRenderer lineRenderer;
public LineRenderer lineRenderer2;//射线2在射线1上产生电光效果
public float minpos = -0.35f; //电光效果每个节点的最小值
public float maxpos = 0.35f; //最大值
void Update () {
//按下L键,开启激光
if(Input.GetKey(KeyCode.L))
{
lineRenderer.enabled = true;
lineRenderer2.enabled = true;
shotline(); //显示激光
shotline2(); //显示电光
}
//按键弹起后,禁用激光
if (Input.GetKeyUp(KeyCode.L))
{
lineRenderer.enabled = false;
lineRenderer2.enabled = false;
}
}
void shotline()//激光
{
RaycastHit2D hit;
hit = Physics2D.Raycast(fire.position,Vector2.up);
//光线投射,返回障碍物
if (hit && lineRenderer.enabled == true)//如果遇到障碍物且射线打开
{
enemy enemy = hit.transform.GetComponent();
if (enemy!=null)
{
Instantiate(bom, hit.point, Quaternion.identity);//在障碍物处产生爆炸效果
enemy.transform.position = new Vector3(Random.Range(-4.5f, 4.5f), 5.5f, 0);
}
else
Destroy(hit.transform.gameObject);
//射线的起始点
lineRenderer.SetPosition(0, fire.position);
//因为激光只有一个终点,所以障碍物位置为终点
lineRenderer.SetPosition(1, hit.point);
}
else
{
lineRenderer.SetPosition(0, fire.position);
lineRenderer.SetPosition(1, fire.position + Vector3.up * 100);
}
}
void shotline2()//电光6个节点
{
if (lineRenderer2.enabled == true)
{
lineRenderer2.SetPosition(0, fire.position );
lineRenderer2.SetPosition(1, fire.position+new Vector3(Random.Range(minpos,maxpos),0.5f,0));
lineRenderer2.SetPosition(2, fire.position +new Vector3(Random.Range(minpos, maxpos), Random.Range(1.5f, 2.5f), 0));
lineRenderer2.SetPosition(3, fire.position+new Vector3(Random.Range(minpos, maxpos), Random.Range(2.5f, 3.5f), 0));
lineRenderer2.SetPosition(4, fire.position+new Vector3(Random.Range(minpos, maxpos), Random.Range(3.5f, 4.5f), 0));
lineRenderer2.SetPosition(5, fire.position + new Vector3(0, 6.5f, 0));
}
}
}