unity3D之简单的碰撞检测 .

article/2025/11/11 2:37:55

   

   大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

   今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了伤害,在射击类游戏中我们需要判断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其它物体的力的影响并发生位置或者状态上的改变,我们就可以称为碰撞。在Unity3D中系统已经提供了碰撞检测的相关方法,这里我们介绍两种碰撞检测的方法:

   Collision检测:使用Collision检测需要用到下面三个重要的方法:OnCollisionEnter()在刚体与刚体接触时立即调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。

   Trigger检测使用Trigger检测需要勾选IsTrigger属性,并用到下面的三个重要方法:OnTriggerEnter():开始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。

   那么两种检测方法的区别是什么呢?Collision将造成物理碰撞,Trigger将造成非物理碰撞 。于此同时,请牢记下面的碰撞原则:发生接触(Trigger)的前提是:双方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。发生碰撞(Collision)的前提是:双方都有碰撞器,且至少一方有刚体。

   下面我们来看一个演示项目,首先创建如图所示的场景。



  

   这里我们对碰撞的目标做了判断,如果我们碰撞的对象的Sphere,则会执行目标对象的脚本中的方法,并输出碰撞信息。目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果,如我们所预期的那样,屏幕上打印出了碰撞信息,控制台同样输出了相应的信息。

   在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。

   首先我们来看为Cube编写的部分脚本代码:

[csharp]  view plain copy
  1.        //一个控制台输出方法  
  2. public void Log(string msg)  
  3. {  
  4.   Debug.Log(msg);  
  5. }  
  6.   
  7. //碰撞开始  
  8. void OnCollisionEnter(Collision collision)  
  9. {  
  10.   if(collision.gameObject.name=="Sphere")  
  11.   {  
  12.      Message="进入碰撞,碰撞名称:"+collision.gameObject.name;  
  13.      collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  14.   }  
  15. }  
  16.   
  17. //碰撞中  
  18. void OnCollisionStay(Collision collision)  
  19. {   
  20.   if(collision.gameObject.name=="Sphere")  
  21.   {  
  22.     Message="碰撞中,碰撞名称:"+collision.gameObject.name;  
  23.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  24.   }  
  25. }  
  26.   
  27. //碰撞结束  
  28. void OnCollisionExit(Collision collision)  
  29. {   
  30.   if(collision.gameObject.name=="Sphere")  
  31.   {  
  32.     Message="碰撞结束,碰撞名称:"+collision.gameObject.name;  
  33.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  34.     collision.gameObject.rigidbody.Sleep();  
  35.   }  
  36. }  



    为什么这里要编写两个输出到控制台的方法呢?因为在实际的游戏开发中,当发生碰撞的时候,我们可能需要作出一些更为实际的事情,比如给敌人减血啦,给我方加血啦,这里只是简单地了解了Unity3D的碰撞机制,Trigger检测和这个基本类似,这里就不再赘述啦,谢谢大家,今天的内容就是这样啦!


http://chatgpt.dhexx.cn/article/ZIKXjuin.shtml

相关文章

Unity碰撞检测的必要条件

Unity中有两个独立的物理引擎&#xff0c;一个用于3D物理系统&#xff0c;一个用于2D物理系统。两个引擎是使用不同的组件实现的。因此BoxCollider和Rigidbody一起使用&#xff0c;代码中用OnTriggerEnter才能检测到触发;BoxCollider2D和Rigidbody2D一起使用&#xff0c;代码中…

Unity3D入门(二):碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent)&#xff0c;一些背景对象则可以取消该组件。 2.在unity3d中&#xff0c;能检测碰撞发生的方式有两种&#xff0c;一种是利用碰撞器&#xff0c;另一种则是利用触发器。这两种方式的应用非…

Unity碰撞检测机制的原理(更新中...)

总是碰到关于碰撞的问题&#xff0c;今天实在忍不住了&#xff0c;来把它搞懂&#xff0c;不然听到八叉树&#xff0c;BSP什么的就怕可不行。 转自&#xff1a;http://www.manew.com/thread-102595-1-1.html 碰撞机制 最近做动态地形生成的时候&#xff0c;发现碰撞检测无效&…

Unity 3D之碰撞检测

一、碰撞器 碰撞检测两大必备条件&#xff1a;1.其中一方具备刚体&#xff0c;碰撞双方碰撞器 1、刚体 2、盒子碰撞器 3、碰撞检测方法 void Start(){this.gameObject.AddComponent<Rigidbody>();//添加刚体}void OnCollisionEnter(Collision other){if (other.gameOb…

Unity2d 学习笔记(四)碰撞检测

碰撞检测功能在游戏开发里是比较常用的&#xff0c;比如地图上无法穿越的部分&#xff0c;以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。 参考视频&#xff1a;Unity碰撞检测_哔哩哔哩_bilibili 首先&#xff0c;我们需要为想要进行碰撞检测的对象添…

2022-04-20 Unity入门7——物理系统之碰撞检测

文章目录 一、刚体 Rigid Body二、碰撞器 Collider三、物理材质四、碰撞检测函数五、刚体加力 一、刚体 Rigid Body ​ 刚体利用体积&#xff08;碰撞器 Collider&#xff09;进行碰撞计算&#xff0c;模拟真实的碰撞效果&#xff0c;产生力的作用 ​ 碰撞产生的必要条件&…

Unity3D —— 碰撞检测

&#xff08;一&#xff09;两种碰撞检测方式 &#xff08;1&#xff09;Collider&#xff1a;碰撞器 ➜需要与刚体一起添加到游戏对象上才能触发碰撞&#xff0c;没有碰撞体的刚体会彼此相互穿过。 碰撞信息检测函数&#xff1a; //碰撞开始 void OnCollisionEnter(Collis…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…

Unity3D教程:简单的碰撞检测

需求&#xff1a;当立方体Cube碰到地面Plane的时候&#xff0c;输出碰撞物体的名称&#xff0c;则表述检测到立方体碰撞了地面。 1.搭建一个简单的场景。 在新的工程中选择File->new Scene创建新的场景。然后在该场景中添加地板&#xff1a;GameObject->Create Other-&…

Unity学习笔记(二) 碰撞检测与触发检测

正好看到了Roll a ball这个游戏&#xff0c;于是就温故一下碰撞检测和触发检测 1.前期准备 中间省去建造一些基础的物体的过程&#xff0c;最后呈现如下图 我们的主角就是中间的球体 其GameObject名为player,我们在其身上添上刚体组件(Rigidbody)使其可以进行物理移动 …

Python实战——过采样数据的处理之改进的SMOTE算法

文章目录 1 理论2 实现3 补充3.1 原理介绍3.1.1 欠采样与过采样3.1.2 Tomek Link 法欠采样3.1.3 Random Over Sampling 随机过采样3.1.4 SMOTE 过采样3.1.5 综合采样 3.2 Python实战3.2.1 数据探索3.2.2 不同的抽样方法对训练集进行处理3.2.2.1 拆分自变量与因变量3.2.2.2 抽样…

机器学习中非平衡数据的处理 —— smote算法

目录&#xff1a;SMOTE算法 1、不平衡数据的背景知识2、SMOTE算法的理论思想3、SMOTE模块的使用 1、不平衡数据的背景知识 在实际应用中&#xff0c;分类问题中类别的因变量可能存在严重的偏倚&#xff0c;即类别之间的比例严重失调&#xff0c;如欺诈问题&#xff0c;欺诈类观…

Python:SMOTE算法

17.11.28更新一下&#xff1a;最近把这个算法集成到了数据预处理的python工程代码中了&#xff0c;不想看原理想直接用的&#xff0c;有简易版的python开发&#xff1a;特征工程代码模版 &#xff0c;进入页面后ctrlF搜smote就行&#xff0c;请自取 之前一直没有用过python&…

探索SMOTE算法

摘要 SMOTE是一种综合采样人工合成数据算法&#xff0c;用于解决数据类别不平衡问题(Imbalanced class problem)&#xff0c;以Over-sampling少数类和Under-sampling多数类结合的方式来合成数据。本文将以Nitesh V. Chawla&#xff08;2002&#xff09;的论文为蓝本&#xff0…

不均衡数据集采样1——SMOTE算法(过采样)

SMOTE: Synthetic Minority Over-sampling Technique 论文地址:https://www.jair.org/index.php/jair/article/download/10302/24590 SMOTE的算法思路是&#xff1a; 使用K近邻&#xff0c;在附近&#xff08;最少选附近5个点&#xff09;随便找一个同一类别的点&#xff0c;然…

数据不平衡问题——SMOTE算法赏析

春节前后好久没有总结问题了&#xff0c;这一段时间一直在做NLP的文本分类&#xff08;二分类&#xff09;问题&#xff0c;遇到了各种问题 。分别如下&#xff1a; 1、数据打标问题。运营人手不够可把兄弟们累坏了&#xff0c;是我给兄弟们分的任务&#xff0c;别打我嘿嘿。 …

SMOTE算法代码实现

类别不平衡问题 类别不平衡问题&#xff0c;顾名思义&#xff0c;即数据集中存在某一类样本&#xff0c;其数量远多于或远少于其他类样本&#xff0c;从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题&#xff0c;例如逻辑回归在欺诈检测问题中&a…

有关不平衡学习与SMOTE算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言因为最近的任务中运用到了Smote算法&#xff0c;但是我找了网上好多帖子都没有解决问题&#xff0c;因此去阅读了imblearn库的User guide。然后在这边写下所得到…

Borderline-SMOTE算法介绍及Python实现【内附源代码】

&#x1f496;作者简介&#xff1a;大家好&#xff0c;我是车神哥&#xff0c;府学路18号的车神&#x1f947; ⚡About—>车神&#xff1a;从寝室到实验室最快3分钟&#xff0c;最慢3分半&#xff08;那半分钟其实是等红绿灯&#xff09; &#x1f4dd;个人主页&#xff1a;…

SMOTE算法原理及Python代码实现

SMOTE算法原理及Python代码实现 文章目录 SMOTE算法原理及Python代码实现预备知识SMOTE算法内容的简单复习SMOTE算法的详细分析创建类对象和初始化构建训练函数构建合成样本函数 SMOTE算法的完整代码示例代码 预备知识 向量代数的知识&#xff1a;对于点 x 1 \mathbf{x}_1 x1​…