Unity3D 雷电激光攻击LineRender和光线投射

时间:2024-03-28 22:09:25

最近在学习Unity3D游戏开发,练习制作飞机大战的2D游戏,但激光的效果不知道如何实现,经过网上查询和调试,做了一个激光的摸拟效果。

Unity3D 雷电激光攻击LineRender和光线投射

1.首先,组件准备,如图

Unity3D 雷电激光攻击LineRender和光线投射

Player: 飞机 

fire: 子弹和激光的发射点(因为激光射线也是碰撞体,所以发射点要放在Player的前面,不能重叠,会影响光线投射)

line和line1为激光和电光效果

MoveControl脚本拖入Player控件飞机操作,同时加入BOM爆作效果对象,主要参数如图:

Unity3D 雷电激光攻击LineRender和光线投射

fire为一个空对象,放在Player的前方就行,为射线的发射点

line和line1设置如图:

Unity3D 雷电激光攻击LineRender和光线投射Unity3D 雷电激光攻击LineRender和光线投射

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<enemy>();
            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));
        }
    }

}