Unity2d不用unity 刚体 碰撞的话能做碰撞检测吗

unity不使用刚体的碰撞检测 - Unity3d技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho
unity不使用刚体的碰撞检测
目的: 这篇文章的主要目的是为了让您了解有关于在Unity内如何使用没有刚体的碰撞检测。
在这里,检查的只是垂直运动方向,但可以通过修改脚本,将对象添加到场景检查其他方向 (或更改cube 的位置。
unity就是 3D 的游戏引擎,带有内置物理Nvidia PhysX。游戏对象应用物理模拟必须具有刚体。它常用于碰撞检测。
假设我们只想要碰撞检测模拟物理学,然后只对碰撞检测使用物理引擎可能会降低整体性能。
有两个解决办法:
解决办法-1: 使刚体运动学和捕获触发器事件。
解决方案-2: 不使用的刚体 (可能是最好的解决办法)!!!使用 Raycast 是一个很好的选择。
你可以投数以百计的每帧的光线而多降低性能。这是(提供)一种casting来源射线的方向,然后确定光线如果投射与任何碰撞器的方法。我们可以使用这个处理碰撞检测,通过casting射线在 x 和 y 轴,以得到确认的游戏物体的周围环境。
我们将按照下面给出的步骤:
1、获得游戏对象的方向。
2、投射光线。
3、从命中结果确定碰撞体。
简单的 raycast 代码看起来像这样:
if (Physics.Raycast(transform.position, Vector3.forward, 10))
print(&There is something in front of the object!&);
在这里,第一个参数是射线的原点,第二个参数是射线的方向和第三个参数是射线的长度。Unity允许获取结果,
RaycastHit hitI
if (Physics.Raycast(transform.position, Vector3.down, out hitInfo))
print(&There is something & + hitInfo.distance +&m away from gameobject&);
例如,让我们使Cube,当它与另一个Cube相撞的可以回去。
1.3个Cube,如下图所示。
添加 Box Collider。将 CollisionDetector 脚本添加到中间的Cube,放置在其他两个Cube (在上面的图像中选取) 之间的。在 CollisionDetector 脚本中,使之Cube与上方或下方的碰撞 就相反。
CollisionDetector.cs
using UnityE
using System.C
public class CollisionDetector : MonoBehaviour
public float MovingF
Vector3 StartP
public int NoOfRays = 10;
RaycastHit HitI
float LengthOfRay, DistanceBetweenRays, DirectionF
float margin = 0.015f;
void Start ()
//Length of the Ray is distance from center to edge
LengthOfRay = collider.bounds.extents.y;
//Initialize DirectionFactor for upward direction
DirectionFactor = Mathf.Sign (Vector3.up.y);
void Update ()
// First ray origin point for this frame
StartPoint = new Vector3 (collider.bounds.min.x + margin,transform.position.y,transform.position.z);
if (!IsCollidingVertically ()) {
transform.Translate (Vector3.up * MovingForce * Time.deltaTime * DirectionFactor);
bool IsCollidingVertically ()
Origin = StartP
DistanceBetweenRays = (collider.bounds.size.x - 2 * margin) / (NOofRays - 1);
for (i = 0; i&NOofR i++) {
// Ray to be casted.
ray = new Ray (Origin, Vector3.up * DirectionFactor);
//Draw ray on screen to see visually. Remember visual length is not actual length.
Debug.DrawRay (Origin, Vector3.up * DirectionFactor, Color.yellow);
if (Physics.Raycast (ray, out HitInfo, LengthOfRay)) {
print (&Collided With & + HitInfo.collider.gameObject.name);
// Negate the Directionfactor to reverse the moving direction of colliding cube(here cube2)
DirectionFactor = -DirectionF
Origin += new Vector3 (DistanceBetweenRays, 0, 0);
在这里 NoOfRays 和Moving force 是公共变量,所以它可以在运行时根据需要改变了。请确保移动速度不超过该Cube在顶部和底部之间的距离。
DirectionFactor 成倍增加的运动力和射线的方向,因为它用来决定的方向。最初,它设置为向上 (正 y 轴) 方向。尽快移动相撞其他Cube的Cube被扭转这个方向决胜局。通过改变方向矢量,可以根据要求改变方向。DirectionFactor 仅用于反转方向。
作者:孙广东
你还没有登录,请先或!
Unity3D技术交流1群
泰课Unity3D公开课
工作时间:9:00 - 18:30
北京客服:010 -
广州客服:020 -[Unity3D] Collider,Rigidbody 和碰撞检测 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了63862字,被85人关注,获得了55个喜欢
[Unity3D] Collider,Rigidbody 和碰撞检测
刚体是启用一个物体物理行为的主要组件。一旦附加刚体组件,物体将收重力影响。如果刚体附加了Collider,则可以检测碰撞。刚体可以接受力和扭矩,但Transform不能。对于刚体的运动,请不要使用Transform的属性来进行位移和旋转,而应该对物体附加力来让物理引擎自己计算结果。
Kinematic有时你需要一个物体附加了刚体组件但却不想使用物理引擎控制它(比如需要进行Trigger检测),这时你可以将Rigidbody 设置为Kinematic 。
Sleeping当刚体运动速度降低当一个值,即物理引擎认为它的运动停止时,它将进入“sleeping”模式,知道下次受到力或碰撞,它都将保持这个睡眠模式。这意味着睡眠模式中,并没有处理器时间分配到更新刚体状态,知道它再次激活。大多数时候,刚体的休眠与唤醒的发生都是非常明显的。但是,当一个静态碰撞器通过改变其Transform的位置,令其移动进入刚体或移出刚体是,这个刚体可能会无法唤醒。此时,这个刚体可以使用函数 WakeUp 来唤醒。
更多请查看: and
Collider为物理碰撞定义了一个物体形状。包括几种基础图形碰撞:Box、Capsule、Sphere,还有Mesh Collier。另外还有Character Controller、Wheel Collider、Terrain Colllider等。其中基本图形碰撞器效率比较高,Mesh Collider当mesh比较复杂时效率较低。
对于复杂物体的碰撞器设置,有三种方法,一种是用多个基本图形碰撞复合模拟出大概的样子,一种是直接使用Mesh Collider,还有一种是再为模型制作一个简单的Mesh,用这个mesh做Mesh Collider。
注意:复合Colliders多作为子物体使用,但要注意RigidBody只能有一个,必须置于最顶层的父物体上。还有,一个Mesh Collider 无法与另一个Mesh Collider产生碰撞,此时设置其中一个为convex 才行。总之最好是尽量避免使与Mesh Collider。
静态碰撞:对于墙、地面这类不会运动的物体,可以仅添加Collider不添加Rigidbody,这称为Static Colliders。通常,配置好后,最好不要再重新设置静态碰撞的Transform的Position。因为这会非常影响物理引擎的性能。添加于有Rigidbody物体的Collider则是 dynamic colliders。静态碰撞物体可以与动态碰撞产生物理作用,但并不会对碰撞产生回应。
物理材质 Physics materials当物体产生碰撞,它们的表面可以模拟不同的物理材质。比如冰表面很滑而橡胶球则有很大摩擦力。尽管Collider的形状在碰撞时并不会变形,但通过Physics Materials.可以设置它的摩擦力和弹力。更多内容查看官方手册:
触发器 Triggers可以设置一个Collider为Trigger,触发器不受物理引擎控制,允许其他碰撞器穿过。当一个Collider穿过其中,OnTriggerEnter 事件将会触发。
碰撞触发函数主要有两类,一类是碰撞器的,一类是触发器的。每类有三种,分别是进入、保持和离开。OnTriggerEnter, OnTriggerStay, OnTriggerExit 是触发类消息,参数是Collider。OnCollisionEnter, OnCollisionStay, OnCollisionExit 是碰撞类消息,参数是Collision。
下面看一下各种情况的触发条件:首先说明一下,碰撞器的种类。
Static Collider:静态碰撞器。有Collider,没有Rigidbody,没有Trigger。简称SC。
Rigidbody Collider:刚体碰撞器。有Collider,有Rigidbody,没有Trigger。简称RC。
Kinematic Rigidbody Collider:运动学刚体。有Collider,有Rigidbody,刚体是Kinematic,没有Trigger。简称KR。
Static Trigger Collider:静态触发器。有Collider,没有Rigidbody,有Trigger。简称ST。
Rigidbody Trigger Collider:刚体触发器。有Collider,有Rigidbody,有Trigger。简称RT。
Kinematic Rigidbody Trigger Collider:运动学刚体触发器。有Collider,有Rigidbody,刚体是Kinematic,有Trigger。简称KRT。
Collision 碰撞检测规则:
Trigger 触发检测规则:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:文章 - 16&评论 - 5&trackbacks - 0
此问题是在做特殊关卡遇到的,一个可以移动的碰撞体如果速度过快会穿过另一个碰撞体,慢的话是可以的,问题原因找到了,只需要一个设置就行
对于Unity引擎而言,是可以直接解决这个问题的。
Unity的Rigidbody里有个Collision
Detection的碰撞检测属性。该属性有三个选项:Discrete(离散), Continuous(连续), Continuous
Dynamic(动态连续)。
其中的Discreet一词应为笔误,实为Discrete(Discreet意为慎重,两者意思相差很大)。整个Manual里没有第二处用到Discreet的地方,也没有任何官方说明提到该词。翻译过来基本上就是碰撞检测属性:用于防止快速移动的物体穿过其他物体而不触发碰撞检测。离散(Discrete):-
碰撞体在遇到本场景其他碰撞体时使用离散式碰撞检测(Discrete)。- 其他碰撞体在遇到它时会使用离散式碰撞检测(Discrete)。-
用于正常碰撞。(这是默认值)连续(Continuous):-
碰撞体在遇到其他动态碰撞体(即包含rigidbody)使用离散式碰撞检测(Discrete),在遇到静态MechColliders(即不含rigidbody)时使用连续式碰撞检测(Continuous)。-
设为动态连续(Continuous Dynamic)的碰撞体在遇到该物体时使用连续式碰撞检测(Continuous),
其他碰撞体在遇到该物体时使用离散式碰撞检测(Discrete)。- 用于设定被动态连续(Continuous
Dynamic)的物体所碰撞的物体。(会影响物理引擎的性能表现。如果你没有快速运动物体的碰撞问题,就乖乖设为离散吧)动态连续(Continuous
Dynamic):- 碰撞体在遇到其他设为连续(Continuous)或动态连续(Continuous
Dynamic)的物体时使用连续式碰撞检测(Continuous)。在遇到静态MeshColliders(即不含rigidbody)时也使用连续式的碰撞检测。遇到其他碰撞体则使用离散式碰撞检测(Discrete)。-
用于快速运动的物体。理成一个碰撞检测属性与碰撞检测方式的对应表格就是:
如果你有一个快速运动的小球,它会穿过一个静态的墙,那么将球设为Continuous即可解决问题。但如果你有多个这样的小球,它们之间则依旧会遇到互相穿过对方的问题,那么将球都设为Continuous
Dynamic更好。所以遇到题主的问题时,将快速运动的物体设为Continuous/Continuous
Dynamic即可。理论上你可以设定所有物体为Continuous
Dynamic,然而这样的物体数量一旦增加起来,对性能会有很大的影响。&
因为我这是2D,只有一个Continuous属性, 选择后在运行,OK,没问题了
阅读(...) 评论() &当前位置: >
关于碰撞面检测方法
时间: 08:52 来源:Unity之家 作者:unity.jb51.net 浏览:
unity3d制作2D游戏中我们熟知的碰撞检测应该是碰撞点的检测 collision,那么我们如果要实现一个多边形的碰撞面检测要如何实现呢一:最笨的办法就是在脚本里取范围区间来判断面的碰撞二:可以给物体的每个面添加一个子物体来判断碰撞对象,如果是不规则的多边形这样做是很麻烦的三:我现在所使用的是用碰撞点的法线来判断所碰撞的面,用一个正方体来举例,首先拿到碰撞点的法线对象&&&&&&&&public&void&OnCollisionEnter(Collision&collision)
&&&&&&&&&&&&foreach&(ContactPoint&contact&in&collision.contacts)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&contact.
&&&&&&&&&&&&}
&&&&&&&&}然后判断 取到的normal对象的值 他是Vector3类型的对象 &x值表示左右的法线角度正方体是 1和-1; y、z分别表示上下 和前后法线的值.那么我的判断是:if(contact.normal.x=1)
&&&&&&print(&碰到右边&);
if(contact.normal.y=1)
&&&&&&print(&碰到上边&);
}OK,赶快测试下吧。。。
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity入门 ??????

我要回帖

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

 

随机推荐