Unity 之 RaycastHit(存储射线投射操作)

文章目录

总述

RaycastHit 类是 Unity 中的一个结构,用于存储射线投射操作的结果。射线投射是一种常用的技术,用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。RaycastHit 提供了关于射线与场景中对象的交互信息,包括碰撞点、碰撞法线、碰撞对象等。以下是关于 RaycastHit 的详细介绍:

  1. 射线投射: 在 Unity 中,可以使用 Physics.RaycastPhysics.RaycastAll 方法来进行射线投射。这些方法将返回一个 RaycastHit 对象,其中包含有关射线与场景中对象的交互信息。

  2. 属性和方法: RaycastHit 类提供了许多属性和方法,用于获取射线与碰撞对象的相关信息,包括但不限于:

    • point:碰撞点的世界坐标。
    • normal:碰撞点处的法线向量。
    • distance:射线起点到碰撞点的距离。
    • collider:与射线相交的碰撞器。
    • transform:与射线相交的游戏对象的变换。
    • 等等...
  3. 多次投射: 如果使用 Physics.RaycastAll 进行多次射线投射,将返回一个 RaycastHit[] 数组,其中包含所有射线与场景中对象的交互信息。这在需要获取所有碰撞点信息的情况下很有用。

具体使用场景

当使用 RaycastHit 类进行射线投射时,有许多不同的使用场景,包括检测碰撞、拾取物体、瞄准检测、物体高亮等。在以下每个场景示例中,我将向您展示如何使用 RaycastHit,并加入一些粒子效果("lizi",即粒子效果在中文中的写法)来增强可视化效果。

  1. 检测碰撞并发射粒子:

在这个场景中,我们将使用射线投射来检测是否与一个可交互的对象发生碰撞,然后在碰撞点发射一些粒子效果。

csharp 复制代码
using UnityEngine;

public class RaycastCollisionExample : MonoBehaviour
{
    public ParticleSystem collisionParticles; // 粒子效果

    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo))
        {
            // 碰撞点发射粒子效果
            if (collisionParticles != null)
            {
                collisionParticles.transform.position = hitInfo.point;
                collisionParticles.Play();
            }

            Debug.Log("碰撞对象:" + hitInfo.collider.gameObject.name);
        }
    }
}

在这个示例中,我们在碰撞点发射了一个粒子效果,从而在用户与可交互对象发生碰撞时产生视觉效果。

  1. 物体拾取与交互:

在这个场景中,我们将使用射线投射来检测是否与一个可拾取的物体发生碰撞,然后可以将物体拾取并交互。

csharp 复制代码
using UnityEngine;

public class ObjectPickupExample : MonoBehaviour
{
    private Transform pickedObject = null; // 当前拾取的物体

    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo))
        {
            // 拾取物体
            if (Input.GetKeyDown(KeyCode.E))
            {
                if (hitInfo.collider.CompareTag("Pickable"))
                {
                    pickedObject = hitInfo.collider.transform;
                    Debug.Log("拾取了:" + pickedObject.name);
                }
            }

            // 交互
            if (Input.GetKeyDown(KeyCode.F))
            {
                if (pickedObject != null)
                {
                    Debug.Log("与 " + pickedObject.name + " 进行了交互。");
                }
            }
        }
    }
}

在这个示例中,我们使用 Input.GetKeyDown(KeyCode.E) 来拾取与射线相交的可拾取物体,并使用 Input.GetKeyDown(KeyCode.F) 来与拾取的物体进行交互。

  1. 物体高亮效果:

在这个场景中,我们将使用射线投射来检测是否与一个物体发生碰撞,然后在碰撞对象上显示一个高亮的粒子效果。

csharp 复制代码
using UnityEngine;

public class ObjectHighlightExample : MonoBehaviour
{
    public ParticleSystem highlightParticles; // 高亮粒子效果

    private Transform lastHighlightedObject = null; // 上一个高亮的物体

    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo))
        {
            // 高亮物体
            if (hitInfo.collider.CompareTag("Highlightable"))
            {
                if (lastHighlightedObject != hitInfo.collider.transform)
                {
                    if (lastHighlightedObject != null)
                    {
                        highlightParticles.Stop();
                    }

                    lastHighlightedObject = hitInfo.collider.transform;
                    highlightParticles.transform.position = lastHighlightedObject.position;
                    highlightParticles.Play();
                }
            }
            else if (lastHighlightedObject != null)
            {
                highlightParticles.Stop();
                lastHighlightedObject = null;
            }
        }
    }
}

在这个示例中,我们使用高亮粒子效果来显示玩家当前所指的物体。粒子效果在物体上播放和停止,从而实现高亮效果。

这些场景示例演示了如何使用 RaycastHit 类来实现不同的功能,从检测碰撞到拾取物体以及物体高亮效果。粒子效果的添加使得交互和操作更加生动和有趣。根据您的需求,您可以在代码中添加其他功能和效果,以创造更丰富的游戏体验。

相关推荐
玖玥拾2 天前
C# 语言进阶(十四)Unity UI界面开发 + 网络消息联动
服务器·开发语言·网络·ui·unity·c#·游戏引擎
野区捕龙为宠2 天前
Unity 持久化数据
unity·游戏引擎·lucene
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
_ZHOURUI_H_3 天前
MyFramework: 同样是 Unity 游戏开发框架,和 HTFramework 的设计取向有什么不同?(下)
unity·游戏引擎·游戏开发·游戏ui·手游开发
小贺儿开发4 天前
Unity 知识库智能问答系统(RAG)
人工智能·unity·ai·大模型·智能问答·知识库·互动
丁小未4 天前
基于MVVM框架的XUUI 扩展的UI管理系统教程
unity·mvvm·ui框架·xuui·ui管理器
丁小未5 天前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
丁小未5 天前
基于MVVM框架的XUUI MoreComplex案例
unity·c#
EQ-雪梨蛋花汤5 天前
【Unity笔记】VR 一体机画面锯齿、模型边缘闪烁、接缝抖动排查:MSAA、Mipmap、Render Scale、Z-Fighting 全流程记录
笔记·unity·vr
松树戈5 天前
【Godot4精进之路】03~Godot编辑器常用界面介绍
编辑器·游戏引擎·godot