Unity3D】Unity3D中碰撞器和触发器的区别是什么?

2020-06-03 15:48发布

4条回答
男孩无衣
1楼 · 2020-06-03 15:55.采纳回答

1)二者都是用作物理位置关系检测,且别在于碰撞的两物体会弹开,触发的两物体可以互相交叉。


2)在Unity中,二者的发生条件不同:碰撞【双方都有碰撞器、至少一个带刚体】,触发【双方都有碰撞器、至少一个带刚体、二者至少有一个勾选了触发器】。


3)回调方法名称不同:碰撞【OnCollisionEnter】,触发【OnTriggerEnter】。


4)回调方法中的参数不同:碰撞【Collision,它包含了碰撞两物体的详细信息,如碰撞点的位置、法线,甚至是几个碰撞点】,触发【比较简单,只有进入触发区域物体的Collider组件信息】。


Ross
2楼 · 2020-06-04 17:43

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

物体发生碰撞的必要条件:

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体或者charactercontroller组件

在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)  当逗留碰撞器

charactercontroler的控制移动碰撞:

unity5.0版本和unity4.0版本都一样的效果

直接建立两个cube就有collider,默认就可以发生碰撞。

为了验证碰撞器与触发器的区别,现设计一个简单的测试,首先建立两个cube(命名为move 和state)让move与state发生碰撞。move要加上charactercontroler和第一人称移动脚本(不用加rigidbody),同时给state加上 void OnTriggerEnter( Collider game)这个函数;代码和图如下:

using UnityEngine;
using System.Collections;

public class testco : MonoBehaviour {

void OnTriggerEnter( Collider game)//测试是否触发触发器
{
print(“enter”);
if (game.tag == “aa”)
{
print(“enterd”);
}
}
}

 测试结果:
当两物体全未勾选碰撞器的Is Trigger选项时可以发生碰撞

当只有move勾选时可以发生碰撞

当只有state 勾选时不发生碰撞;只有此时触发器触发,其他情况都不触发;

当两物体全都勾选不发生碰撞

Rigidbody的控制移动碰撞:

unity5.0版本 和unity4.0版本都一样的效果

与上述方法类似建立2个物体;capsule(用来移动,用rigidbody.MovePosition方法(移动方法可参照我之前博客文章(4.0和5.0方法不同))),cube静止,(绑定void OnTriggerEnter( Collider game)即上面代码testco脚本);

测试结果:

当两物体全未勾选碰撞器的Is Trigger选项时可以发生碰撞,cube上的触发器不触发

当只有capsule勾选时不发生碰撞 此时触发器触发

当只有cube 勾选时不发生碰撞;此时触发器触发;

当两物体全都勾选不发生碰撞,此时触发器触发

总结上面两种方法:

无论哪种方法要让触发器必然发生碰撞必须要将触发器的is Trigger勾选;无论哪种方法要让两个物体发生碰撞可以同时不勾选is Trigger.。

要让两物体同时发生碰撞和触发是不可能的;

如果混用了上述两种移动方法那么移动的物体必须勾选is Trigger ,这样才可以发生碰撞。如果要触发触发器那就两个物体全部勾选is Trigger。

源址:https://blog.csdn.net/u010707274/article/details/71642815

Transform
3楼 · 2020-06-21 20:34

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

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

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

image.png

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

image.png


蜗牛
4楼 · 2020-06-22 10:10

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

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

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

 

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

 

例子:

碰撞器:汽车被撞飞、皮球掉在地上又弹起效果

触发器:人站在靠近门的位置门自动打开效果



相关问题推荐

  • 回答 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,然后删掉滑动条就可以了。

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