Unity给对象添加可见红外射线及射击功能
程序员文章站
2022-07-13 08:31:38
...
欢迎来到橘子广场。进入正题:
首先给枪添加LineRenderer组件,这里我选择的是局部坐标控制(世界坐标容易出问题),勾选1可以增加射线亮度,取消2勾选,3处调节射线范围大小
接下来就是代码部分(挂在给枪对象):
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;
}
}
注意:枪口位置是设置的一个空物体,调整到枪口位置,拖拽给gunEnd即可。
如上图,Selection为空物体,画布为子物体(RenderMode设置为WorldSpace模式);按钮可自行添加(每个按钮添加Outline组件,属性自行设置,初始为未**状态,通过代码控制);碰撞体的话可以添加在按钮中,我是添加在一个空物体上,让其作为按钮的子物体,然后调节大小和位置,使其贴在按钮上。(我只给ShartBtn添加了事件,其他按钮事件可自行添加)射击的特效及音效可自行添加,就可以愉快地进行游戏了。
上一篇: Unity制作《打地鼠》游戏思路详解
下一篇: RPG游戏装备合成算法