关于unity 射线(FPS)的一些见解

2015年03月14日 11:11 0 点赞 0 评论 更新于 2025-11-21 17:01

在游戏开发领域,射击类游戏是一个重要的模块,涵盖了第一人称射击(FPS)和第三人称射击等多种类型。而在射击类游戏中,射线碰撞和射线检测是不可或缺的技术。从技术角度理解,事件的触发通常基于碰撞或通知机制。以射击游戏为例,判断子弹是否击中目标,既可以通过在枪口设置射线与敌人的碰撞体(Collider)进行检测,也可以让发出的子弹自行检测是否与敌人发生碰撞。对于子弹的管理,可以采用对象池技术(关于对象池技术,我曾在蛮牛教育的论坛上进行过讨论,感兴趣的读者可以前往查看)。

今天,我们暂时不讨论子弹管理的问题,而是专注于为像我一样的初学者普及射线碰撞的相关知识。希望通过本文的介绍,大家能够掌握基本的射线碰撞原理,并制作出一个简单的射击游戏 Demo。

代码实现与解释

以下是一段示例代码,将其应用到枪口或者炮弹口的相关脚本中,运行游戏即可看到射线检测的效果。

using UnityEngine;
using System.Collections;

/**
* By__Robin
*/
public class rayy : MonoBehaviour
{
// Use this for initialization
void Start()
{
// 此处可添加初始化逻辑
}

// Update is called once per frame
void Update()
{
// 生成一道射线,从相机屏幕上鼠标位置发射
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 用于存储射线碰撞信息的结构体
RaycastHit hit;
// 在场景中可视化显示这条射线,方便调试
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);

// 当按下鼠标左键时
if (Input.GetMouseButtonDown(0))
{
// 进行射线检测,检测距离为 100 单位
if (Physics.Raycast(ray, out hit, 100))
{
// 如果射线碰到的物体的标签(Tag)为 "cu"
if (hit.collider.tag == "cu")
{
// 打印相关信息,原代码此处缺少括号,补充完整
Debug.Log("射线击中了标签为 cu 的物体");
}
}
}
}
}

代码详细解释

  1. 射线生成Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 这行代码通过 Camera.main 获取主相机,并根据鼠标在屏幕上的位置生成一条射线。
  2. 射线碰撞信息存储RaycastHit hit; 定义了一个 RaycastHit 结构体变量,用于存储射线碰撞的详细信息,如碰撞点、碰撞物体等。
  3. 射线可视化Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow); 使用 Debug.DrawRay 方法在场景中绘制一条黄色的射线,长度为 10 单位,方便开发者在调试时观察射线的方向和范围。
  4. 鼠标事件检测if (Input.GetMouseButtonDown(0)) 检测鼠标左键是否被按下,当按下时执行射线检测逻辑。
  5. 射线检测Physics.Raycast(ray, out hit, 100) 调用 Physics.Raycast 方法进行射线检测,检测距离为 100 单位。如果射线碰到了物体,将碰撞信息存储在 hit 变量中,并返回 true
  6. 标签判断if (hit.collider.tag == "cu") 检查射线碰到的物体的标签是否为 "cu",如果是,则执行相应的逻辑,这里通过 Debug.Log 打印一条信息。

通过以上步骤,我们就实现了一个简单的射线碰撞检测功能。在实际的射击游戏开发中,可以根据具体需求对射线检测的逻辑进行扩展和优化,例如处理不同类型的目标、实现伤害计算等。

作者信息

boke

boke

共发布了 3994 篇文章