求助,unity刚体碰撞不反弹和网格碰撞器不能同时用怎么办

要产生碰撞必须为游戏对象添加刚体(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函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果
阅读(...) 评论()Unity 组件手册
网格碰撞体 (Mesh Collider)
网格碰撞体 (Mesh Collider) 采用 并基于该网格构建其碰撞体 (Collider)。对于碰撞检测,这比将基元用于复杂网格要精确得多。标记为 凸体 (Convex) 的网格碰撞体 (Mesh Collider)可以与其他网格碰撞体 (Mesh Collider) 碰撞。
在水平几何结构上使用的网格碰撞体 (Mesh Collider)
属性:功能:
为触发器 (Is Trigger)如果启用,此碰撞体 (Collider) 则用于触发事件,会由物理引擎忽略。
材质 (Material)引用可确定此碰撞体 (Collider) 与其他碰撞体 (Collider) 的交互方式的。
网格 (Mesh)对用于碰撞的网格的引用。
平滑球体碰撞 (Smooth Sphere Collisions)启用此项时,会使碰撞网格法线平滑。应对平滑表面(例如没有硬边缘的丘陵地形)启用此项以使球体滚动更平滑。
凸体 (Convex)如果启用,则此网格碰撞体 (Mesh Collider) 会与其他网格碰撞体 (Mesh Collider) 碰撞。凸体网格碰撞体 (Convex Mesh Collider) 限制为 255 个三角形。
网格碰撞体 (Mesh Collider) 通过附加到游戏对象 (GameObject) 的 构建其碰撞表示形式,并读取附加的的属性以设置其位置并正确缩放。
碰撞网格使用背面剔除。如果对象与将以图形方式背面剔除的网格碰撞,则也不会以物理方式与它碰撞。
使用网格碰撞体 (Mesh Collider) 时有一些限制。通常,两个网格碰撞体 (Mesh Collider) 不能相互碰撞。所有网格碰撞体 (Mesh Collider) 都可以与任何基元碰撞体 (Collider) 碰撞。如果某个网格标记为 凸体 (Convex),则它可以与其他网格碰撞体 (Mesh Collider) 碰撞。
碰撞体 (Collider) 与刚体 (Rigidbody) 结合使用可使 Unity 中的物理变得生动。刚体 (Rigidbody) 使对象可以受物理控制,而碰撞体 (Collider) 使对象可以相互碰撞。碰撞体 (Collider) 必须独立于刚体 (Rigidbody) 添加到对象。碰撞体 (Collider) 并不一定需要附加刚体 (Rigidbody),但是必须刚体 (Rigidbody) 才能使对象由于碰撞而移动。
当两个碰撞体 (Collider) 之间发生碰撞时并且如果其中至少一个附加了刚体 (Rigidbody),会将向外发送给附加到它们的对象。这些事件可以在脚本中进行处理,使您可以在使用或不使用内置 NVIDIA PhysX 引擎的情况下创建独特行为。
触发器 (Trigger)
使用碰撞体 (Collider) 的备选方法是将其作为触发器 (Trigger),只需在检视视图 (Inspector) 中选中“为触发器”(IsTrigger) 属性复选框即可。触发器 (Trigger) 实际上会被物理引擎忽略,并具有一组独有的 ,这些消息会在与触发器 (Trigger) 发生碰撞时向外发送。触发器 (Trigger) 可用于触发游戏中的其他事件,如剧情画面、自动门打开、显示辅导消息等。请充分发挥您的想象力!
请注意,要使两个触发器 (Trigger) 在碰撞时向外发送触发器 (Trigger) 事件,其中之一必须还包括刚体 (Rigidbody)。要使触发器 (Trigger) 与普通碰撞体 (Collider) 碰撞,则其中之一必须附加刚体 (Rigidbody)。有关不同类型碰撞的详细图表,请参阅下面“高级”部分中的碰撞动作矩阵。
摩擦力和弹力
摩擦力、弹力和柔软度在 中定义。 包含最常见的物理材质 (Physisc Material)。要使用其中之一,请单击“物理材质”(Physisc Material) 下拉菜单并选择一个,例如“冰”(Ice)。还可以自己的物理材质 (Physisc Material) 并调整所有摩擦力值。
网格碰撞体 (Mesh Collider)
不能相互碰撞,除非它们标记为凸体 (Convex)。因此,它们对背景对象(如环境几何结构)最有用。
凸体 (Convex) 网格碰撞体 (Mesh Collider) 必须少于 255 个三角形。
基元碰撞体 (Collider) 对于处于物理控制下的对象成本较低。
将网格碰撞体 (Mesh Collider) 附加到游戏对象 (GameObject) 时,其“网格”(Mesh) 属性会默认为所渲染的网格。可以通过分配不同网格进行更改。
要为对象添加多个碰撞体(Collider),请创建子游戏对象 (GameObject) 并向每个子游戏对象 (GameObject) 附加碰撞体(Collider)。这样便可以独立处理每个碰撞体(Collider)。
可以在场景视图 (Scene View) 中查看小图示以了解在对象上计算碰撞体(Collider) 的方式。
碰撞体(Collider) 会尽量匹配对象的缩放。如果您具有不均匀缩放(在各个方向上不同的缩放),则只有网格碰撞体(Mesh Collider) 才能完全匹配。
如果通过其变换组件 (Component) 移动某个对象,但是希望接收碰撞体(Collider)/触发器 (Trigger) 消息,则必须将刚体 (Rigidbody) 附加到移动的对象。
碰撞体 (Collider) 组合
在 Unity 中可以进行许多不同的碰撞体 (Collider) 组合。每个游戏都是独一无二的,不同组合可能更适合于不同类型的游戏。如果在游戏中使用物理,则了解不同基本碰撞体 (Collider) 类型、其常见用途以及与其他类型对象的交互方式会十分有帮助。
静态碰撞体 (Static Collider)
这些是未附加刚体 (Rigidbody)、但的确附加了碰撞体 (Collider) 的游戏对象 (GameObject)。这些对象应保持静态,或很少移动。这些十分适用于环境几何结构。它们在刚体 (Rigidbody) 与之碰撞时不会移动。
刚体碰撞体 (Rigidbody Collider)
这些游戏对象 (GameObject) 同时包含刚体 (Rigidbody) 和碰撞体 (Collider)。它们通过脚本编写的力和碰撞,完全受物理引擎影响。它们可以与仅包含碰撞体 (Collider) 的游戏对象 (GameObject) 碰撞。这些很可能是使用物理的游戏中的主要碰撞体 (Collider) 类型。
运动学刚体碰撞体 (Kinematic Rigidbody Collider)
此游戏对象 (GameObject) 包含碰撞体 (Collider) 和标记有“为运动学”(IsKinematic) 的刚体 (Rigidbody)。要移动此游戏对象 (GameObject),请修改其 组件 (Component),而不是应用力。它们类似于静态碰撞体 (Static Collider),但是更适合于要经常四处移动碰撞体 (Collider) 的情况。有一些使用此游戏对象 (GameObject) 的其他专业方案。
此对象可以用于通常希望静态碰撞体 (Static Collider) 发送触发器 (Trigger) 事件的情况。因为触发器 (Trigger) 必须附加刚体 (Rigidbody),所以应添加刚体 (Rigidbody),然后启用“为运动学”(IsKinematic)。这可防止对象脱离物理影响,并使您可以在需要时接收触发器 (Trigger) 事件。
运动学刚体 (Kinematic Rigidbody) 可以方便地打开和关闭。这适合于在以下情况中创建布娃娃:通常希望角色跟随在动画之后,然后在发生碰撞时(通过爆炸或所选的任何其他事物进行提示)变为布娃娃。发生这种情况时,只需通过脚本将所有运动学刚体 (Kinematic Rigidbody) 转变为普通刚体 (Rigidbody)。
如果让刚体 (Rigidbody) 静止下来以便在一段时间内不移动,它们会“入睡”。即,它们在物理更新过程中不会进行计算,因为它们不会前往任何位置。如果将运动学刚体 (Kinematic Rigidbody) 从休眠的普通刚体 (Rigidbody) 下边移走,则休眠的刚体 (Rigidbody) 将被唤醒并在物理更新中重新准确计算。因此如果您具有许多要四处移动的静态碰撞体 (Static Collider) 并且让不同对象正确落到其上,请使用运动学刚体碰撞体 (Kinematic Rigidbody Collider)。
碰撞动作矩阵
根据两个碰撞对象的配置,可能发生一些不同动作。下图概述了可以基于附加到其的组件 (Component) 对两个碰撞对象进行的预计。一些组合仅导致两个对象之一受碰撞影响,因此请记住标准规则 - 物理不会应用于未附加刚体 (Rigidbody) 的对象。
进行碰撞检测并在碰撞时发送消息
&静态碰撞体 (Static Collider)刚体碰撞体 (Rigidbody Collider)运动学刚体碰撞体 (Kinematic Rigidbody Collider)静态触发碰撞体 (Static Trigger Collider)刚体触发碰撞体 (Rigidbody Trigger Collider)运动学刚体触发碰撞体 (Kinematic Rigidbody Trigger Collider)
静态碰撞体 (Static Collider)&Y&&&&
刚体碰撞体 (Rigidbody Collider)YYY&&&
运动学刚体碰撞体 (Kinematic Rigidbody Collider)&Y&&&&
静态触发碰撞体 (Static Trigger Collider)&&&&&&
刚体触发碰撞体 (Rigidbody Trigger Collider)&&&&&&
运动学刚体触发碰撞体 (Kinematic Rigidbody Trigger Collider)&&&&&&
碰撞时发送触发器 (Trigger) 消息
&静态碰撞体 (Static Collider)刚体碰撞体 (Rigidbody Collider)运动学刚体碰撞体 (Kinematic Rigidbody Collider)静态触发碰撞体 (Static Trigger Collider)刚体触发碰撞体 (Rigidbody Trigger Collider)运动学刚体触发碰撞体 (Kinematic Rigidbody Trigger Collider)
静态碰撞体 (Static Collider)&&&&YY
刚体碰撞体 (Rigidbody Collider)&&&YYY
运动学刚体碰撞体 (Kinematic Rigidbody Collider)&&&YYY
静态触发碰撞体 (Static Trigger Collider)&YY&YY
刚体触发碰撞体 (Rigidbody Trigger Collider)YYYYYY
运动学刚体触发碰撞体 (Kinematic Rigidbody Trigger Collider)YYYYYY
在 Unity 3.x 中,我们引入了某个称为基于层的碰撞检测 (Layer-Based Collision Detection) 的功能,现在可以有选择性地告知 Unity 游戏对象 (GameObject) 与它们附加到的特定层碰撞。有关更多信息,请单击
Page last updated:&两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型
Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了刚体(RigidBody)组件, 勾选了重力Gravity
但是, 运行的结果是:
正方块Cube下落, 掉到地面上停了下来
茄子下落,没有停下来, 穿透了地面,一直往下掉。
百事不得其解。。。
终于还是在官方文档中看到这段话:
There are some limitations when using the Mesh Collider. Usually, two Mesh Colliders cannot collide with each other. All Mesh Colliders can collide with any primitive Collider. If your mesh is marked as Convex, then it can collide with other Mesh Colliders.
使用网格碰撞器有一些限制条件。通常,两个网格碰撞器之间不会发生碰撞。所有的网格碰撞器可以和任何原型碰撞器碰撞。如果网格标记为凸起的(Convex),那么就可以和其他网格碰撞器碰撞。
试了一下, 把茄子Mesh Collider的Convex 勾上,
OK了, 停下来了!
还有一下注意事项:
http://www.ceeger.com/Components/class-MeshCollider.html
Hints 提示
Mesh Colliders&cannot&collide with each other unless they are marked as Convex. Therefore, they are most useful for background objects like environment geometry.&除非被标记为凸起的(Convex),否则网格碰撞器间不会发生碰撞。因此,它们最常被用于背景对象比如环境布景。
Convex Mesh Colliders must be fewer than 255 triangles.&凸起的网格碰撞器含有的三角形面不能多于255个。
Primitive Colliders are less costly for objects under physics control.&原型控制器对于对象的物理控制更加节省资源。
When you attach a Mesh Collider to a GameObject, its Mesh property will default to the mesh being rendered. You can change that by assigning a different Mesh.&当为游戏对象附加了网格碰撞器,其网格属性将被定义为用于渲染的网格,可以通过指派其他网格来改变。
To add multiple Colliders for an object, create child GameObjects and attach a Collider to each one. This allows each Collider to be manipulated independently.&要给一个对象添加多个碰撞器,应该创建子对象并给每个子对象添加一个碰撞器。这使每个碰撞器可以被单独操作。
You can look at the gizmos in the Scene View to see how the Collider is being calculated on your object.&可以通过场景视图(Scene View )中的线框(gizmos)来查看碰撞器在你的对象上的预期效果。
Colliders do their best to match the scale of an object. If you have a non-uniform scale (a scale which is different in each direction), only the Mesh Collider can match completely.&碰撞器尽量匹配对象的比例。如果有一组不规则伸缩(每一维度上的比例都不相同),只能使用网格碰撞器才能完全匹配。
If you are moving an object through its Transform component but you want to receive Collision/Trigger messages, you must attach a Rigidbody to the object that is moving.&如果你想接收通过Transform组件移动的对象的碰撞/触发信息,你必须给移动对象附件刚体。
阅读(...) 评论()351被浏览26,890分享邀请回答644 条评论分享收藏感谢收起167 条评论分享收藏感谢收起

我要回帖

更多关于 unity刚体碰撞反弹 的文章

 

随机推荐