2D刚体和碰撞体

本文详细介绍了Unity2D中刚体的各种属性及其作用,包括质量、线性阻尼、角阻尼等,并深入探讨了不同类型的碰撞器如PolygonCollider2D的用法。此外还讲解了如何通过调整这些属性实现更真实的物理效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://bbs.9ria.com/thread-421453-1-1.html


我们看下Rigidbody 2D刚体的属性。


            



        mass:0代表着无限大,也就是“静态刚体”。范围:0.001到100000。


        linear Drag:线性阻尼,也就是物体在运动过程中收到的阻力。


        Angular Drag:角度阻尼系数,刚体在旋转过程中受到的阻力。


        Gravity Scale:重力缩放,控制着重力的大小,其数值范围为-100000到100000.


        Fixed angle:固定角度,指刚体在运动过程中保持固定的角度,这就相当于关闭了刚体的选择功能。


        Is Kinematic:关节,控制刚体是否变为运动学物体,就是我们的刚体不在受物理引擎的控制,而受transform或者是动画等等的控制。


        Sleeping Mode:睡眠,unity会临时把处于静止状态的物理模拟去除,这样主要是节省计算资源。


        Never Sleep:永远不睡眠。


        start awake:awake时就进入睡眠。


        start asleep:立即进入睡眠。


        Collision Detection:碰撞发现。


        Discrete:正常状态下的检测。


        Continuous:继续性检测。


           


        2D碰撞器:


        我们给我们游戏的前景添加上去,大家照着原项目做吧,哈哈。关键是我们给前景添加上碰撞体,看下图那个黄色框就是添加了碰撞体的碰撞范围。


        


        


        unity2D的碰撞体和3D的差不多。在unity2D中,有Box Collider2D(盒子碰撞器),Circle Collider2D(圆形碰撞器),Edge Collider2D(边缘碰撞器)和Polygon Collider2D(多边形碰撞器)。Edge Collider2D和Polygon Collider2D是3D项目里面没有的。


        


        (PS:解释可能有点生硬,大家不要见怪,自己添加实践下就容易理解了。);


        


        


        


        下面我们以UFO飞船为例来介绍下Polygon Collider2D。给UFO添加Polygon Collider2D。对于多边形碰撞器有一个比较特殊的功能,也就是可以编辑多变形碰撞器的外形。例如我们在按住Shift的同时,我们可以在多边形上拖动可以出现一个顶点,拖动次顶点,可以改变碰撞器的外形。按住Ctrl键的同时,单击顶点,可以把顶点删除。


        


        刚体属性的介绍:


        Material:定义刚体表面的一些物理特性,例如摩擦力,柔软程度等,由此决定了它对其他物体的反弹能力等。


        Is Trigger:属于3D碰撞的都应该知道这个属性的作用。勾了就会产生的是刚体碰撞。不勾就是触发碰撞,此时碰撞的两个物体之间可以不使用刚体去进行驱动。


        


        对于unity2D来说,我们可以简单的理解为其实就是3D的物理工具中减去以为,也就是只是在x,z轴方向的计算,对于z轴的计算省略罢了。


        


        下面我们来看一张表


        


        


        这张表主要介绍了不同类型的刚体和碰撞器,以及它们之间的碰撞及触发关系。例如静态碰撞器指只是用了碰撞器组件的碰撞刚体,也就是类似于我们的UFO物体。


        而RigidBody指的是是用了刚体组件以及碰撞器的刚体物体。


        表的上半部分,就是对这些是用了不同组件类型的物体,它们之间的碰撞发现以及信息传递。而表的下半部分是,是对于这些不同类型的物体之间的触发碰撞关系以及信息传递。我们在第三列可以看到Kinematic Rigidbody Collider。


        此项指的是打开Kinematic选项的并且使用了collider组件的刚体物体,它与横列中Rigidbody Collider物体,也就是使用了rigidbody和collider组件的物体之间会发生碰撞,Y表示他们之间发生碰撞,并且会进行信息传递。而它与静态刚体之间就不会发生碰撞及信息传递。


在 Love2D 中,刚体碰撞回调函数的处理需要分两步来实现: 1. 注册刚体碰撞回调函数:可以使用 `world:setCallbacks()` 函数来注册刚体碰撞回调函数。该函数需要传入四个函数作为参数,它们分别是开始碰撞回调函数、结束碰撞回调函数、碰撞前回调函数碰撞后回调函数。这些函数中,碰撞碰撞后回调函数可以用来处理碰撞的逻辑。 2. 在碰撞回调函数中处理碰撞逻辑:在碰撞回调函数中,可以使用 `fixture:getUserData()` 函数获取碰撞的用户数据,从而区分不同的刚体。然后根据需要实现不同的碰撞逻辑,例如修改刚体的速度、应用力等等。 以下是一个简单的刚体碰撞回调函数的示例代码: ```lua function love.load() world = love.physics.newWorld(0, 9.81 * 64) -- 创建两个刚体 body1 = love.physics.newBody(world, 400, 300, "dynamic") shape1 = love.physics.newRectangleShape(50, 50) fixture1 = love.physics.newFixture(body1, shape1) body2 = love.physics.newBody(world, 500, 300, "dynamic") shape2 = love.physics.newRectangleShape(50, 50) fixture2 = love.physics.newFixture(body2, shape2) -- 设置初始速度为 0 body1:setLinearVelocity(0, 0) body2:setLinearVelocity(0, 0) -- 注册碰撞回调函数 world:setCallbacks(beginContact, endContact, preSolve, postSolve) end function love.update(dt) -- 更新物理世界 world:update(dt) end function love.draw() love.graphics.rectangle("fill", body1:getX() - 25, body1:getY() - 25, 50, 50) love.graphics.rectangle("fill", body2:getX() - 25, body2:getY() - 25, 50, 50) end function beginContact(fixture1, fixture2, contact) -- 获取碰撞的用户数据 local userData1 = fixture1:getUserData() local userData2 = fixture2:getUserData() -- 在这里实现碰撞逻辑 print("beginContact", userData1, userData2) end function endContact(fixture1, fixture2, contact) -- 获取碰撞的用户数据 local userData1 = fixture1:getUserData() local userData2 = fixture2:getUserData() -- 在这里实现碰撞逻辑 print("endContact", userData1, userData2) end function preSolve(fixture1, fixture2, contact) -- 获取碰撞的用户数据 local userData1 = fixture1:getUserData() local userData2 = fixture2:getUserData() -- 在这里实现碰撞逻辑 print("preSolve", userData1, userData2) end function postSolve(fixture1, fixture2, contact, normal_impulse, tangent_impulse) -- 获取碰撞的用户数据 local userData1 = fixture1:getUserData() local userData2 = fixture2:getUserData() -- 在这里实现碰撞逻辑 print("postSolve", userData1, userData2) end ``` 以上代码中,刚体碰撞回调函数的四个参数分别是碰撞的两个碰撞碰撞点的信息碰撞的法向量。在碰撞回调函数中,可以根据需要获取碰撞的用户数据,并实现不同的碰撞逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值