【Unity发射射线击中目标怎么用】看这篇就够了

引言

在Unity开发中,射线(Ray)是一种非常强大的工具,常用于实现各种交互系统,如射击、点击检测、物体拾取等。本文将详细介绍如何在Unity中实现一个简单的射线发射系统,并通过射线击中目标后销毁目标并触发加分系统的功能。我们将通过一个具体的代码示例来逐步讲解实现过程。

代码实现

首先,我们来看一下完整的代码,并逐步解释每一部分的功能。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class ShMainShot : MonoBehaviour
{
    // 这个用来实现发射交互系统
    // 按下左键,发射射线、获取击中的物体、销毁物体、触发加分系统函数

    // 射线原理:第一 :Ray 创建一根射线(指定起点和方向) 第二:Physics.Raycast()投射出去 第三:击中目标拿到他的碰撞器(射线只能击中有碰撞器的物体)
    // 将来存储一个主角,用来提供射线发射的起点和方向
    // 用来存储一根射线
    public GameObject MainGun; // 主角的枪口对象,用于确定射线的起点和方向
    Ray OneRay; // 存储射线的变量
    Vector3 OnePoint; // 射线的起点坐标

    private void Update()
    {
        // 给射线赋值,指定一个起点和方向即可,这里用到的就是主角的坐标为起点,主角的前方为射线方向
        OnePoint = new Vector3(MainGun.transform.position.x, MainGun.transform.position.y, MainGun.transform.position.z + 1);
        OneRay = new Ray(OnePoint, MainGun.transform.forward);

        // 人物的坐标应该实时更新,保证射线的起点和方向始终是以角色最新的位置为起点

        RaycastHit TempObjHit; // 存储射线击中物体的信息
        if (Input.GetMouseButtonDown(0)) // 检测是否按下鼠标左键
        {
            // 按下鼠标
            if (Physics.Raycast(OneRay, out TempObjHit)) // 发射射线并检测是否击中物体
            {
                // 射线击中了物体
                Debug.Log(TempObjHit.transform.gameObject.name); // 输出击中物体的名称
                if (TempObjHit.transform.gameObject.name == "Terrain") // 判断是否击中了地面
                {
                    Debug.Log("你击中了地面"); // 输出提示信息
                }
                else
                {
                    GameObject.Destroy(TempObjHit.transform.gameObject, 1f); // 销毁击中的物体,延迟1秒
                    AddScore(); // 触发加分系统函数
                }
            }
            Debug.DrawRay(OnePoint, MainGun.transform.forward, Color.yellow); // 在场景中绘制射线,方便调试
        }
    }

    private void AddScore()
    {
        // 这个函数用来修改分数系统的得分变量
        Debug.Log("恭喜你击中目标!加分!"); // 输出提示信息
    }
}
代码详解
  1. 引入必要的命名空间

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    这些命名空间包含了我们在代码中需要使用的类和方法。
  2. 定义类和变量

    public class ShMainShot : MonoBehaviour
    {
        public GameObject MainGun; // 主角的枪口对象,用于确定射线的起点和方向
        Ray OneRay; // 存储射线的变量
        Vector3 OnePoint; // 射线的起点坐标

    MainGun 是主角的枪口对象,用于确定射线的起点和方向。OneRay 是存储射线的变量,OnePoint 是射线的起点坐标。

  3. Update 方法

    private void Update()
    {
        // 给射线赋值,指定一个起点和方向即可,这里用到的就是主角的坐标为起点,主角的前方为射线方向
        OnePoint = new Vector3(MainGun.transform.position.x, MainGun.transform.position.y, MainGun.transform.position.z + 1);
        OneRay = new Ray(OnePoint, MainGun.transform.forward);

    在 Update 方法中,我们实时更新射线的起点和方向。OnePoint 是射线的起点,MainGun.transform.forward 是射线的方向。

  4. 检测鼠标点击

    if (Input.GetMouseButtonDown(0)) // 检测是否按下鼠标左键
    {
        // 按下鼠标
        if (Physics.Raycast(OneRay, out TempObjHit)) // 发射射线并检测是否击中物体
        {
            // 射线击中了物体
            Debug.Log(TempObjHit.transform.gameObject.name); // 输出击中物体的名称
            if (TempObjHit.transform.gameObject.name == "Terrain") // 判断是否击中了地面
            {
                Debug.Log("你击中了地面"); // 输出提示信息
            }
            else
            {
                GameObject.Destroy(TempObjHit.transform.gameObject, 1f); // 销毁击中的物体,延迟1秒
                AddScore(); // 触发加分系统函数
            }
        }
        Debug.DrawRay(OnePoint, MainGun.transform.forward, Color.yellow); // 在场景中绘制射线,方便调试
    }

    当玩家按下鼠标左键时,代码会发射射线并检测是否击中物体。如果击中物体,会输出物体的名称,并根据物体的类型执行相应的操作(如销毁物体和加分)。

  5. 加分系统函数

    private void AddScore()
    {
        // 这个函数用来修改分数系统的得分变量
        Debug.Log("恭喜你击中目标!加分!"); // 输出提示信息
    }

    这个函数用于触发加分系统,并在控制台输出提示信息。

总结

通过以上代码,我们实现了一个简单的射线发射与目标销毁系统。玩家可以通过按下鼠标左键发射射线,击中目标后目标会被销毁,并触发加分系统。这个系统可以作为基础,进一步扩展以实现更复杂的功能,如不同类型的目标、不同的得分规则等。

希望这篇博客能帮助你理解如何在Unity中使用射线实现交互系统。如果你有任何问题或需要进一步的帮助,请随时提问!

猜你喜欢

转载自blog.csdn.net/leoysq/article/details/142653296