首页 > 其他分享 >Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)

Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)

时间:2023-01-05 13:00:47浏览次数:49  
标签:rigidbody 触发 触发器 区别 物体 碰撞 勾选 Trigger 移动


Rigidbody或者charactercontroller移动才可以用collider的碰撞。

正文:

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

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

charactercontroller组件。

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

碰撞器:

触发器


Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)_ide


触发信息检测:

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)这个函数;代码和图如下:

Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)_ide_02


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脚本);



Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)_ide_03


测试结果:

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

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

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

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


总结上面两种方法:

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

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

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


下面是别人博客论述:



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

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

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

当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。(然而在  charactercontroler控制的运动中运动物体的Is Trigger=true时照样可以发生碰撞,所以我个人认为这句话有问题)

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

例子:

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

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

研究测试总结了一下午,若有不妥之处,欢迎大家提出交流。

标签:rigidbody,触发,触发器,区别,物体,碰撞,勾选,Trigger,移动
From: https://blog.51cto.com/u_8378185/5990735

相关文章

  • Linux中的管道是什么?管道与共享内存的区别有哪些?
    管道是什么?简单来说就是,一个命令的结果作为另外一个命令(结果)的输入,管道是linux提供的一种常见的进程通信工具,也是很多shell命令能够灵活组合产生强大用途的一个重要......
  • C#实现treeview节点上下左右自由移动
    以下是节点移动类NodeMove.cs源码:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Collections;namespaceNo......
  • MySQL单列索引与多列索引的区别
    本文讨论当查询条件在两个以上时,单列索引与联合索引对查询性能的影响Mysql版本5.7,数据库引擎innodb测试中使用explain+具体sql可看索引使用情况一些影响索引性能......
  • HTTPS和HTTP的区别
    以前登录时候向服务器传递的是明文username:张三password:123456到了后台将123456密码用MD5加密后保存到数据库。现在就有了个问题,传输过程中是明文传输的,不安全。如何将......
  • 关于break和continue和return的区别
    break:结束本层循环,进入下层循环return:两层循环都结束continue:结束本次循环,开始下次循环<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><m......
  • 中国移动魔百盒 安装当贝桌面
    中国移动魔百盒安装当贝桌面TableofContents一、起因二、经过三、效果ReferenceTable1.修改历史日期修订人备注2022-12-25崔嘉诚......
  • mysql count(*) count(1)的区别
    COUNT(字段名)和COUNT(*)的查询结果有什么不同?COUNT(1)和COUNT(*)之间的效率哪个更高?你知道答案吗?很多人都认为COUNT(1)比COUNT(*)效率高,真的是这样吗?  1、认识COUN......
  • @NonNull 注解小记——非空判断的触发时机区别
    背景@NonNull:关于这个注解,lombok的一个注解,可以加在方法-入参,或构造函数上。本以为加了这个参数,会自动判断(编译阶段)会判断,但发现并不是这个意思。因为在编译的时候,传......
  • 自适应布局和响应式布局的区别
    这个网站介绍了一下,感兴趣的朋友可以自己体验:https://www.shejidaren.com/examples/responsive-web-design/感觉平常我们都会用到,取决于设计图吧。......
  • c# 游戏设计:地图移动
    想实现一个小游戏,先做地图移动。步骤记录如下:1、百度到一张大的迷宫地图,放在项目的debug目录下,备用。2、创建一个winform项目,不添加任何界面元素。3、添加数据成员如下:......