【Unity基础】Unity中碰撞及触发类物理交互应用场景说明

一、碰撞类回调方法

在Unity中,碰撞类回调方法是用于处理物体间碰撞的逻辑。这些方法常用于 MonoBehaviour 脚本中,以便在物体发生碰撞时进行响应。以下是最常用的三个碰撞类回调方法的详细说明:

1. OnCollisionEnter(Collision collision)

  • 触发时机:当物体首次与另一物体发生碰撞时触发。
  • 参数说明collision 参数提供有关碰撞的信息,包括碰撞的对象(collision.gameObject)、碰撞点、碰撞法线、碰撞的接触点等。
  • 常见用途
    • 处理初次碰撞时的行为,比如播放声音、触发动画、减少生命值等。
    • 检查碰撞对象的标签、层级或其他属性,以便进行特定的逻辑处理。
  • 应用场景:

    OnCollisionEnter 是物体首次与其他物体发生碰撞时触发的回调,因此它适合用来处理首次接触时需要执行的行为。典型的应用场景包括:

    • 玩家与敌人碰撞时:当玩家与敌人首次接触时,可以在此回调中触发一些反应,比如减少玩家生命、播放击中动画或声音。
    • 玩家与道具碰撞时:当玩家接触到道具或捡起物品时,可以在此回调中增加玩家的得分、触发道具效果(如恢复生命、增加攻击力等)。
    • 物理效果:处理物体首次碰撞后产生的物理反应,如在地面与球体碰撞时触发“弹跳”效果。
  • 示例代码
void OnCollisionEnter(Collision collision)
{if (collision.gameObject.CompareTag("Enemy")){// 播放撞击声音、减少玩家生命值AudioSource.PlayClipAtPoint(hitSound, transform.position);playerHealth -= 10;}else if (collision.gameObject.CompareTag("PickUp")){// 播放捡起道具的声音、增加玩家分数AudioSource.PlayClipAtPoint(pickUpSound, transform.position);score += 100;Destroy(collision.gameObject);  // 捡起物品后将其销毁}
}
解释:
  • 当玩家与敌人碰撞时,触发伤害机制,减少玩家生命值并播放音效。
  • 当玩家接触到捡起物品时,增加得分并销毁物品。

2. OnCollisionStay(Collision collision)

  • 触发时机:当物体持续与另一个物体发生碰撞时触发。这个回调方法在两个物体碰撞并保持接触时每帧都会被调用。
  • 参数说明collision 参数包含有关碰撞的信息,类似于 OnCollisionEnter
  • 常见用途
    • 处理持续碰撞期间的逻辑,例如造成持续伤害、状态变化等。
    • 实现物体在碰撞中的滑动、摩擦等效果。
  • 应用场景:

OnCollisionStay 会在物体与其他物体保持接触的期间不断调用。这种方法适合处理那些需要持续作用的效果,或者需要在碰撞持续过程中保持某种状态的场景。典型应用包括:

  • 持续伤害:比如玩家踩到火坑、被敌人持续攻击等,碰撞期间每帧对玩家施加伤害。
  • 摩擦力和阻力:在滑动或滚动的物体上应用摩擦力或空气阻力,防止物体在碰撞后持续滑动。
  • 物体停留状态:比如玩家与平台碰撞并停留在上面时,判断玩家是否仍然站在平台上,从而执行某些动作。
示例代码:
void OnCollisionStay(Collision collision)
{if (collision.gameObject.CompareTag("Lava")){// 每帧对玩家造成持续伤害playerHealth -= 1;  // 玩家在火焰中持续受伤}else if (collision.gameObject.CompareTag("Ground")){// 如果玩家站在地面上,可以触发跳跃或走路状态if (isJumping){// 玩家刚落地,停止跳跃动画isJumping = false;animator.SetBool("IsJumping", false);}}
}
解释:
  • 当玩家站在火焰上时,持续每帧扣除生命值,模拟持续的火焰伤害。
  • 当玩家站在地面上时,检查是否落地并停止跳跃动画。

 

3. OnCollisionExit(Collision collision)

  • 触发时机:当物体与另一物体的碰撞结束时触发。即物体停止碰撞后,会调用此方法。
  • 参数说明collision 参数提供碰撞结束时的相关信息。
  • 常见用途
    • 处理碰撞结束后的清理工作,比如停止某些特效、恢复物体状态、更新游戏状态等。
  • 应用场景:

OnCollisionExit 会在物体与其他物体的碰撞结束时触发,适合用于碰撞结束后的清理工作或触发某些后续事件。典型应用场景包括:

  • 停止伤害:当玩家离开某个伤害区域(如火焰、敌人攻击范围等),需要停止伤害的计算。
  • 恢复状态:比如物体从平台上掉下来后,恢复物体的“自由掉落”状态。
  • 碰撞结束后触发事件:当某个物体不再与其他物体碰撞时,可以触发一些特效、状态重置等操作。
示例代码:
void OnCollisionExit(Collision collision)
{if (collision.gameObject.CompareTag("Lava")){// 玩家离开火焰时停止伤害Debug.Log("Player left the lava, no more damage.");}else if (collision.gameObject.CompareTag("Ground")){// 玩家从地面离开时,恢复跳跃状态if (!isJumping){isFalling = true;  // 玩家开始掉落animator.SetBool("IsFalling", true);}}
}

解释:

  • 当玩家离开火焰时,停止伤害。
  • 当玩家离开地面时,触发“掉落”状态,播放相应的动画。

总结:

  • OnCollisionEnter:适用于碰撞首次发生时执行的逻辑,如伤害、音效、道具触发等。
  • OnCollisionStay:适用于碰撞持续期间需要不断处理的逻辑,如持续伤害、摩擦力、停留状态等。
  • OnCollisionExit:适用于碰撞结束后的清理和后续处理,如停止伤害、恢复状态、触发后续事件等。

二、触发类回调方法

Unity中的触发类回调(Trigger-based)是基于碰撞体(Collider)被设置为触发器(Trigger)的机制。当物体的碰撞体被设置为触发器时,它将不会发生物理碰撞,而是通过触发事件来响应交互。常用的触发类回调方法有三个:OnTriggerEnterOnTriggerStayOnTriggerExit。这些方法的主要应用场景通常与物体进入、停留或离开触发区时触发某些事件或逻辑,适用于需要检测物体区域交互的情况。

1. OnTriggerEnter(Collider other)

应用场景:

OnTriggerEnter 是物体第一次进入触发区域时调用的回调方法。它适用于那些只需要在物体首次进入某个区域时执行的逻辑。常见的应用场景包括:

  • 玩家进入区域:比如玩家进入某个特定区域(如敌人的视野范围、陷阱区域、任务区域等),可以触发某些行为或事件。
  • 物品拾取:当玩家靠近并进入道具的触发范围时,触发道具拾取的事件。
  • 区域激活:当玩家或物体进入某个触发区域时,激活某些对象或效果,例如开启门、触发动画、播放音效等。
示例代码:
void OnTriggerEnter(Collider other)
{if (other.CompareTag("Player")){// 播放音效、显示提示信息或开始任务AudioSource.PlayClipAtPoint(doorOpeningSound, transform.position);OpenDoor();}else if (other.CompareTag("PickUp"))
{// 播放捡起音效、增加玩家得分AudioSource.PlayClipAtPoint(pickUpSound, transform.position);playerScore += 100;Destroy(other.gameObject);  // 销毁捡起的道具}
}
解释:
  • 当玩家进入触发器区域时,播放开门音效并执行开门操作。
  • 当玩家进入道具区域时,增加分数并销毁道具。

2. OnTriggerStay(Collider other)

应用场景:

OnTriggerStay 在物体持续停留在触发器区域内时,每帧都会调用。它适用于需要在物体持续处于某个区域时进行持续处理的场景。常见的应用场景包括:

  • 持续伤害或影响:例如玩家在火焰或毒气区域中持续受到伤害。
  • 持续触发效果:当物体持续处于某个触发区域时,需要持续施加某种影响,比如减速、增加状态或触发持续动画等。
  • 交互状态:例如玩家与某个区域互动时,保持一段时间的状态。
示例代码:
void OnTriggerStay(Collider other)
{if (other.CompareTag("Lava")){// 玩家在火坑内持续受伤playerHealth -= 1 * Time.deltaTime;  // 每秒受到伤害}else if (other.CompareTag("SlowZone")){// 玩家在减速区持续受到减速效果playerSpeed = 2f;  // 将玩家速度设置为减速状态}
}
解释:
  • 当玩家在火坑区域持续停留时,按时间扣除生命值(持续伤害)。
  • 当玩家进入减速区域时,每帧更新速度,使玩家运动变慢。

3. OnTriggerExit(Collider other)

应用场景:

OnTriggerExit 在物体离开触发器区域时触发,适用于物体退出某个区域后的处理逻辑。常见的应用场景包括:

  • 结束伤害或效果:例如玩家离开火焰区域后停止持续伤害。
  • 恢复状态:如玩家离开减速区域后恢复原来的运动速度。
  • 停止交互:例如当物体离开某个触发区域后,停止某种效果或事件。
示例代码:
void OnTriggerExit(Collider other)
{if (other.CompareTag("Lava")){// 玩家离开火坑时停止伤害Debug.Log("Player left the lava zone, no more damage.");}else if (other.CompareTag("SlowZone")){// 玩家离开减速区恢复原速playerSpeed = 5f;  // 恢复原速}
}
解释:
  • 当玩家离开火坑区域时,停止伤害效果。
  • 当玩家离开减速区域时,恢复正常速度。

总结:

  1. OnTriggerEnter:适用于物体首次进入触发区域时的逻辑,如开始任务、播放音效、拾取物品等。
  2. OnTriggerStay:适用于物体持续停留在触发区域内时的持续效果,如持续伤害、状态变化等。
  3. OnTriggerExit:适用于物体离开触发区域时的处理,如停止伤害、恢复状态、停止交互等。

这些触发类回调方法通常用于区域控制、交互逻辑和特效触发。它们与物理碰撞(如OnCollisionEnter等)不同,因为触发器(Trigger)不会直接影响物体的物理行为,而更多地是用于检测区域内的物体并做出反应。触发器是处理各种交互、状态变化、事件触发等非常灵活的方式,特别适合用于游戏中的区域限制、任务触发、环境效应等场景。

参考:

1. 【Unity基础】对比Unity中碰撞类与触发类交互机制-CSDN博客

2. 【Unity基础】对比OnCollisionEnter与OnTriggerEnter-CSDN博客

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

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

相关文章

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样,苹果手机打开的时候是正常的,但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法,也在官方查看了map相关的文档,发现并没有给label设置zIndex的属性,只看到…

Redisson的可重入锁

初始状态: 表示系统或资源在没有线程持有锁的情况下的状态,任何线程都可以尝试获取锁。 线程 1 获得锁: 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁: 在持有锁的情况下,线程 1 再次请求锁&a…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask,Django,其它 您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

Swagger UI

Swagger UI 是一个开源工具,用于可视化、构建和交互式地探索 RESTful API。 它是 Swagger 生态系统的一部分,Swagger 是一套用于描述、生成、调用和可视化 RESTful Web 服务的工具和规范。 Swagger UI 可以自动生成 API 文档,并提供一个交互…

thinkphp6 --数据库操作 增删改查

一、数据库连接配置 如果是本地测试,它会优先读取 .env 配置,然后再读取 database.php 的配置; 如果禁用了 .env 配置,则会读取数据库连接的默认配置: # .env文件,部署服务器,请禁用我 我们可以…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…

让Git走代理

有时候idea提交代码或者从github拉取代码&#xff0c;一直报错超时或者:Recv failure: Connection was reset,下面记录一下怎么让git走代理从而访问到github。 1.打开梯子 2.打开网络和Internet设置 3.设置代理 记住这个地址和端口 4.打开git bash终端 输入以下内容 git c…

vivo 游戏中心包体积优化方案与实践

作者&#xff1a;来自 vivo 互联网大前端团队- Ke Jie 介绍 App 包体积优化的必要性&#xff0c;游戏中心 App 在实际优化过程中的有效措施&#xff0c;包括一些优化建议以及优化思路。 一、包体积优化的必要性 安装包大小与下载转化率的关系大致是成反比的&#xff0c;即安装…

Struts扫盲

Struts扫盲 这里的struts是struts1。以本文记录我的那些复习JavaEE的痛苦并快乐的晚上 Struts是什么 框架的概念想必大家都清楚&#xff0c;框架即“半成品代码”&#xff0c;是为了简化开发而设计的。一个项目有许多分层&#xff0c;拿一个MVC架构的Web应用来说&#xff0c;有…

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

时序预测 | 改进图卷积+informer时间序列预测,pytorch架构

时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构 目录 时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构预测效果基本介绍参考资料 预测效果 基本介绍 改进图卷积informer时间序列预测代码 CTR-GC卷积,informer&#xff0c;CTR-GC 图卷积…

从入门到精通:一文掌握 Dockerfile 的用法!(多阶段构建与缓存优化)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Dockerfile基础用法 📒📝 什么是 Dockerfile?📝 Dockerfile 的常见指令🔖 构建指令🔖 命令指令🎈 完整示例:构建一个 Python Flask 应用🔖 1. 项目结构🔖 2. 编写 Dockerfile🔖 3. 构建和运行 Docker 镜像�…

Go语言开发基于SQLite数据库实现用户表修改接口(四)

背景 上一章 Go语言开发基于SQLite数据库实现用户表查询详情接口(三) 这一章我们实现用户表的修改接口 代码实现 mapper层 type UserMapper interface {UpdateById(user *model.User, id uint64) error}type userMapper struct { }func (m *userMapper) UpdateById(user *m…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

844.比较含退格的字符串

java用 O&#xff08;1&#xff09;空间这个方法&#xff0c;容易挺多bug的… O&#xff08;1&#xff09;空间 #&#xff1a;删除前一个字符 》 从后面开始判断&#xff08;这样可以用跳过的思想&#xff09;不能使用两次 i- - 来处理 # 的操作&#xff0c;会造成误删了前面…

大数据实训室建设的必要性

一、大数据发展的背景 大数据作为当今信息技术领域的核心驱动力&#xff0c;正在深刻地改变着社会的各个方面。它不仅仅是指数据量庞大&#xff0c;更重要的是指数据的多样性、实时性和复杂性。随着云计算、物联网等技术的迅猛发展&#xff0c;大数据已成为推动经济社会发展的…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能&#xff0c;如果要实现复杂的 SQL 功能&#xff0c;还是建议使用 XML 来配置映射语句&#xff0c;将 SQL 语句写在 XML 配置文件中 如果要操作数据库&#xff0c;需要做以下的配置&#xff0c;与注解…

K8S如何基于Istio实现全链路HTTPS

K8S如何基于Istio实现全链路HTTPS Istio 简介Istio 是什么?为什么选择 Istio?Istio 的核心概念Service Mesh(服务网格)Data Plane(数据平面)Sidecar Mode(边车模式)Ambient Mode(环境模式)Control Plane(控制平面)Istio 的架构与组件Envoy ProxyIstiod其他组件Istio 的流量管…