Unity3D】Unity3D中碰撞器和触发器的概念是什么,两者有什么区别?

2020-08-09 10:13发布

如题,最近在接触unity,对触碰器和触发器两者的概念和区别不是很清楚

如题,最近在接触unity,对触碰器和触发器两者的概念和区别不是很清楚

6条回答
Transform
2楼 · 2020-08-12 12:18

发生物理碰撞的充分必要条件:双方均具备碰撞器,且发起方具有刚体。

碰撞器和触发器的回调方法不同,一共有六种:

不勾选is Trigger,既有碰撞效果,也执行方法,对应三种回调方法

image.png

勾选is Trigger,没有物理碰撞效果,但执行方法,对应三种回调方法

image.png


听雨
3楼 · 2020-08-09 17:30

碰撞器和触发器在游戏当中会经常使用。例如在玩王者荣耀时, 当英雄进入塔的攻击范围时, 塔会自动攻击英雄, 而英雄到达塔下时可以攻击塔, 但无法从塔中心穿透过去。该案例中塔的攻击范围使用的就是触发器, 而塔本身使用的就是碰撞器。


在Unity中经常会看到很多物体上有如下组件, 该组件即是碰撞器组件
image.png

我们在Unity中创建基本游戏物体后, 引擎会自动为该物体添加Collider(碰撞器)组件,其主要功能是进行碰撞检测。    碰撞器最大的特点就是, 物体一般不会穿透, 就类似于英雄在推塔时, 英雄是无法从塔身上穿透而过, 而是会发生碰撞。

碰撞发生必须具备三个条件:1:两个相碰撞的物体身上必须得有碰撞器,也就是Collider,2:其中一个物体身上必须具备刚体,3:两个物体需要发生相对运动。


上面讲了碰撞器, 那么什么是触发器呢?触发器其实也是非常常见的, 比如王者中回家的时候会自动恢复血量,但走出就就不会。或者游戏中的范围攻击技能, 你再一定范围内就会受伤害, 而出了范围就不会受伤害。


在Unity中, 碰撞器和触发器其实是一个组件,区别在于是否勾选IsTrigger属性, 勾选就是触发器, 不勾选就是碰撞器。触发器的最大特点就是可以被穿透,, 其他物体能够从塔身体中穿过去。   

image.png


碰撞器与触发器的区别:

一、特点上, 碰撞器是不能被穿透, 而触发器是可以的

二、检测回调方法上,当碰撞或者触发发生时都会有三个状态的回调方法, 即开始、持续与退出;

        但碰撞器对应状态的回调方法是:OnCollisionEnter、OnCollisionStay、OnCollisionExit

        触发器对应的回调方法是: OnTriggerEnter、OnTriggerStay、OnTriggerExit

蜗牛
4楼 · 2020-08-10 09:09

一楼回答的很是详细,建议采纳

碰撞器和触发器区别就是触发器有穿透效果 相当于现实中的感应门,进入到一个区域之后,感应门会自动打开

碰撞器,相当于没有感应门的房屋,你要是硬闯只能撞上去

水默
5楼 · 2020-08-11 20:32

碰撞器是物体的一个component,触发器是碰撞器的一个属性。

碰撞器只要与刚体相碰,就会触发相碰两者的碰撞脚本。触发器只要与刚体穿透,就会触发有触发器一方的的触发脚本。

碰撞器: 一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

触发器 ,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。


乐xenia
6楼 · 2020-08-12 17:27

要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

物体发生碰撞的必要条件

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。

 

碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

 

触发信息检测:

1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器

2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器

3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器

 

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器

2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器

3.MonoBehaviour.OnCollisionStay(Collision collision)  当逗留碰撞器

 

两个物体相接触时到底执行OnTriggerEnter还是执行OnCollisionEnter方法,这两个又有什么区别呢?

为了验证碰撞器与触发器的区别,现设计一个简单的游戏,让小汽车与小球发生碰撞。新建一个C#脚本文件,把它拖给小汽车对象,双击该脚本文件进入脚本编辑器,在该脚本中加入如下两个方法,并分别设置一个断点:

复制代码

void OnTriggerEnter(Collider collider)
{     //进入触发器执行的代码}void OnCollisionEnter(Collision collision) 
{     //进入碰撞器执行的代码}

复制代码

当未勾选碰撞器的Is Trigger选项时汽车与球体发生碰撞,进入方法OnCollisionEnter,碰撞之后汽车产生被球体撞飞的效果:

如果将碰撞器的Is Trigger属性选中,再次启动游戏让球体与汽车产生接触,这时进入方法OnTriggerEnter。之后球体直接穿过汽车,但球体与汽车都没有产生碰撞效果:

unity3d中的碰撞器和触发器的区别?

 

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性

当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;

当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

 

如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器


Mantra
7楼 · 2020-08-14 09:35

Collider它表示是一个实体,是有体积的,碰撞体之间在正常情况下是无法穿插的

Trigger它是虚体,正常情况下是可以穿插的。

比如说墙,一般就是一个Collider,人物无法穿墙;而一个传送门,就是一个Trigger,人物可以走进去


相关问题推荐

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • unity如何自学Unity3D 2022-01-06 15:24
    回答 18

    可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 2

    Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...

  • 回答 4

    文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...

  • 回答 7

    策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样!    游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...

  • 回答 7
    已采纳

    可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。

  • 回答 3
    已采纳

    游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...

  • 回答 5

    void Update(){          transform.rotation = Quaternion.Euler(Vector3.zero);}可以试一下,保证物体x轴和z轴为0就可以使其一直垂直。

  • 回答 3

    界面左右移动、上下移动。。本质都是:手指滑动。。。可以参考这些:https://www.cnblogs.com/coldcode/p/5362537.htmlhttps://blog.csdn.net/totosj/article/details/80112852https://blog.csdn.net/zcc858079762/article/details/85253120...

  • 回答 6

    首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存:AخA 1using UnityEngine;2using System.Collections;3public class MyFollow : MonoBehaviour4{5    public float distanceAway = 5;          // distance...

  • 回答 5

    安装高通的Vuforia插件即可。

  • 回答 5

    不可以,只能一个工程打一个包。

  • 回答 2

    Edit->Project Settings->Graphics 找到Shader Stripping 中fog mode设置为custom(原来是Automatic),然后选中你想要的模式,最后重新打包就ok

  • 回答 2

    用到的插件:System.Drawing.dllSystem.Windows.Forms.dllSystem.Deployment.dll(运用基于.Net4.x的dll打包时,需要用到该dll,否则会报错)代码如下:using System;using System.Runtime.InteropServices;using UnityEngine;using UnityEngine.UI; p......

  • 回答 6

    如下图,设置为none,然后删掉滑动条就可以了。

没有解决我的问题,去提问