欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity给对象添加可见红外射线及射击功能

程序员文章站 2022-07-13 08:31:38
...

欢迎来到橘子广场。进入正题:
Unity给对象添加可见红外射线及射击功能
首先给枪添加LineRenderer组件,这里我选择的是局部坐标控制(世界坐标容易出问题),勾选1可以增加射线亮度,取消2勾选,3处调节射线范围大小
Unity给对象添加可见红外射线及射击功能
接下来就是代码部分(挂在给枪对象):

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class RayView : MonoBehaviour
{
    public float weaponRange = 50f;//武器最远射程
    public GameObject selection;//游戏初始选择(通过射击选择)
    //选择按钮
    public Button start;
    public Button checkpoint;
    public Button exit;
    Vector3 rangePos;//记录射线最大射程位置
    // FPS相机
    public Camera fpsCam;//用于一人称跟随的相机
    // GunEnd游戏对象
    public Transform gunEnd;//枪口位置
    // 射击轨迹
    private LineRenderer rayLine;//绘制射线
    private void Awake()
    {
        rayLine = GetComponent<LineRenderer>();
        rangePos = rayLine.transform.InverseTransformPoint(gunEnd.forward * weaponRange);//将枪口正前方最远距离处转为绘制射线的局部坐标
    }
    void Start()
    {
        
    }
    void Update()
    {    
        // 显示射击轨迹
        rayLine.enabled = true;
        //获取按钮的Outline组件置位false
        start.GetComponent<Outline>().enabled = false;
        checkpoint.GetComponent<Outline>().enabled = false;
        exit.GetComponent<Outline>().enabled = false;       
        // 声明RaycastHit存储射线射中的对象信息
        RaycastHit hit;
        // 将射击轨迹起点设置为GunEnd对象的位置
        rayLine.SetPosition(0, rayLine.transform.InverseTransformPoint(gunEnd.position));      
        // 检测射线是否碰撞到对象
        if (Physics.Raycast(gunEnd.position, gunEnd.forward, out hit, weaponRange))
        {
            // 将射击轨迹终点设置为碰撞发生的位置
            rayLine.SetPosition(1, rayLine.transform.InverseTransformPoint(hit.point));
			//获取碰撞体对象名
			//如果为开始游戏,则使selection对象不可见
            if (hit.collider.gameObject.name == "Start")
            {
            	//射线射向按钮时使Outline组件**触发选中框
                start.GetComponent<Outline>().enabled = true;
                //开枪
                if (Input.GetMouseButtonDown(0))
                {
                    GetComponent<RayView>().enabled = false;
                    selection.SetActive(false);
                }
            }
            if (hit.collider.gameObject.name == "Checkpoint")
            {
                checkpoint.GetComponent<Outline>().enabled = true;
            }
            if (hit.collider.gameObject.name == "Exit")
            {
                exit.GetComponent<Outline>().enabled = true;
            }
        }
        else
            // 如果未射中任何对象,则将射击轨迹终点设为相机前方的武器射程最大距离处
            rayLine.SetPosition(1, rangePos);
    }
    //进入游戏后对象未**射线轨迹不可见
    private void OnDisable()
    {
        rayLine.enabled = false;
    }
}

Unity给对象添加可见红外射线及射击功能
注意:枪口位置是设置的一个空物体,调整到枪口位置,拖拽给gunEnd即可。
如上图,Selection为空物体,画布为子物体(RenderMode设置为WorldSpace模式);按钮可自行添加(每个按钮添加Outline组件,属性自行设置,初始为未**状态,通过代码控制);碰撞体的话可以添加在按钮中,我是添加在一个空物体上,让其作为按钮的子物体,然后调节大小和位置,使其贴在按钮上。(我只给ShartBtn添加了事件,其他按钮事件可自行添加)射击的特效及音效可自行添加,就可以愉快地进行游戏了。
Unity给对象添加可见红外射线及射击功能