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

news2024/11/24 9:11:21

文章目录

  • 总述
  • 具体使用场景

在这里插入图片描述

总述

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. 检测碰撞并发射粒子:

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

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. 物体拾取与交互:

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

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. 物体高亮效果:

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

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 类来实现不同的功能,从检测碰撞到拾取物体以及物体高亮效果。粒子效果的添加使得交互和操作更加生动和有趣。根据您的需求,您可以在代码中添加其他功能和效果,以创造更丰富的游戏体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新型Windows内核池风水利用工具研究

引用 这篇文章的目的是介绍一种新型基于内核态分页内存和非分页内存的越界写入通用利用技术和相关工具复现. 文章目录 引用简介分页模式利用分析分页模式利用调试分析非分页模式利用分析非分页模式利用调试分析工具使用方法工具使用效果相关引用参与贡献 简介 笔者的在原作者利…

硕士研究生小论文写作方法

本人985硕博毕业-曾多次辅导本硕同学完成成毕设,下面分享一些经验 图为当年大论文外审结果!!! 当撰写一篇硕士研究生的小论文时,以下是每个部分的写作方法的详细描述,: 摘要(Abst…

零基础在家就可以做的副业,3个兼职项目推荐

做副业最需要注重的是什么?我觉得有收益,稳定,上手快,可以学到东西,下面3个副业适合新手快速变现的副业,大可以随便挑一两个尝试一下 第一个:在小红书的发手记 满5000粉丝们就可以申请品牌合作…

OMT画图的五种结构表达方式

实例化:A类依赖于B类。 class B {doSth () {} }class A {constructor () {}run () {const b new B()b.doSth()} }new A().run()委托:A对象依赖于B对象。 class B {doSth () {} } const b new B()class A {constructor () {}run () {b.doSth()} } new A…

为什么 Lemon8 是今年值得关注的社交媒体应用?

社交媒体应用逐渐成为了用户联系亲朋好友的一种方式,也成为了营销推广有利的平台。近期,Lemon8也快速崛起,一度荣登美国APP下载排行榜前十名,在社交和电子商务市场中,也占据了很大的份额,在日本以及泰国多地更为流行。为什么Lemon8会成为最值得关注的社交媒体应用呢? 什么原因…

基于springboot+vue的博物馆藏品平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

TouchGFX之安装

1.安装X-CUBE-TOUCHGFX​ 帮助 ->管理嵌入式软件包 转到“STMicroelectronics”选项卡。 滚动直至找到“X-CUBE-TOUCHGFX”,然后展开节点。 点击“TouchGFX Generator”复选框,然后点击“立即安装”。 将下载软件包并显示许可协议。 找到TouchGFX Gen…

(成功踩坑)electron-builder打包过程中报错

目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…

PostgreSQL基本操作总结

安装按PostgreSQL数据库后,会默认创建用户postgres和数据库postgres,这个用户是超级用户,权限最高,可以创建其他用户和权限,在实际开发过程中,会新创建用户和业务数据库,本文主要介绍用户权限和…

Vue中DOM的更新为什么是异步的?

在 Vue 中,DOM 的更新是异步的机制是为了优化性能和提升用户体验。这个机制被称为“异步更新队列”。 Vue的异步更新队列机制是其实现高效渲染的关键。它通过将多次数据变化合并到一个批处理中,从而减少了不必要的DOM操作,提高了性能。下面是…

[推荐] MyBatis框架初学笔记-为之后拾遗

目录 1. mybatis的简介 2.MyBatis的环境搭建 2.1 导入pom依赖 2.2 数据库文件导入连接 2.3 修改web.xml文件 2.4 安装插件 (1)Free mybatis plugin (2)Mybatis generator (3) mybatis tools &#x…

Excel/PowerPoint条形图改变顺序

条形图是从下往上排的,很多时候不是我们想要的效果 解决方案 选择坐标轴,双击,按下图顺序点击 效果

函数栈帧理解

本文是从汇编角度来展示的函数调用,而且是在vs2013下根据调试展开的探究,其它平台在一些指令上会有点不同,指令不多,简单记忆一下即可,在我前些年的学习中,学的这几句汇编指令对我调试找错误起了不小的作用…

Python爬虫实战案例——第一例

X卢小说登录(包括验证码处理) 地址:aHR0cHM6Ly91LmZhbG9vLmNvbS9yZWdpc3QvbG9naW4uYXNweA 打开页面直接进行分析 任意输入用户名密码及验证码之后可以看到抓到的包中传输的数据明显需要的是txtPwd进行加密分析。按ctrlshiftf进行搜索。 定位来到源代码中断点进行调…

Qt应用开发(基础篇)——纯文本编辑窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是:Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙,确保内容显示完整。这…

ARM--day6(实现字符、字符串收发的代码和现象,分析RCC、GPIO、UART章节)

uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC/GPIO/UART4章节初始化 void hal_uart4_init();//发送一个字符函数 void hal_put_char(const c…

Roxy-Wi 命令执行漏洞复现

漏洞描述 Roxy-WI是开源的一款用于管理 Haproxy、Nginx 和 Keepalived 服务器的 Web 界面 Roxy-WI 6.1.1.0 之前的版本存在安全漏洞,该漏洞源于系统命令可以通过 subprocess_execute 函数远程运行,远程攻击者利用该漏洞可以执行远程代码。 免责声明 技术文章仅供参考,任…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的: 左右两侧都留了大块空白,很难看 解决方案 点击横坐标,双击,然后按下图顺序点击 效果

开发调试更便捷!火山引擎 DataLeap 提供 Notebook 交互式开发体验

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 Notebook 是一种支持 REPL 模式的开发环境。 所谓「REPL」,即「读取-求值-输出」循环:输入一段代码,立刻得到相应的结果&#x…