分类

链接

2021 年 8 月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > Unity3D > 正文
共享办公室出租
Unity2D 平台类游戏 人物移动
Unity3D 暂无评论 阅读(151)

通常使用刚体与碰撞体共同构成人物移动的物理系统。

有这么几点需要注意:

1、动态刚体一旦与一个没有弹性的碰撞体碰撞了后,那么其速度立刻变为0,并且不会反弹回来,没有其他操作,其速度一直为0,并且只有动态刚体才能与其他的碰撞体发生反应,调用OnColliderEnter和OnTriggerEnter。

2、动态刚体使用AddForce,它真的应用了物理模拟。也就是说,F*S=0.5*m*V^2。只要你一直给它加力,那么这个动态刚体就会一直获得动能,它的速度就会一直加快。如果没有设置线性阻尼,没有与groud的摩擦力,那么这个物体就会一直匀速直线运动。所以真的很真实。需要注意,摩擦力这个是需要在物理材质中进行设置的。

3、Unity物理系统的碰撞检测是离散的,是按固定间隔0.02秒进行检测(其他的所有物理行为都是按固定间隔进行计算的,但是这个间隔是可以在Editor中设置的。还有我们要注意Update的帧间隔,与固定0.02秒的物理间隔的关系。嗯~ o(* ̄▽ ̄*)o,他们的关系就是没有关系。因为他们不属于一个次元。但是我们要明白,Update的帧间隔在机器性能差的时候会影响到Unity物理系统,严重时会使物理系统瘫痪掉,也就是无法进行各种计算。各种各样的奇怪情况。)具体的情况参考https://blog.csdn.net/mao_xiao_feng/article/details/52605370

Rigidbody2D详解
一些事项:

1.任何添加到同一个 GameObject身上或者其子物体身上的 2D Collider组件都隐式的 附属于 那个 Rigidbody 2D.

2.当一个Collider 2D组件附属到一个Rigidbody 2D身上时,它就跟随Rigidbody 2D移动。这时不应该通过直接设置Transform 或者 Collider的偏移量来 移动。

3.附属于同一个 Rigidbody 2D的所有 Collider 2D,它们相互是不会发生碰撞检测的。

刚体类型:

1. Rigidbody 2D 有三个类型:Dynamic、Kinematic、Static

2. 刚体类型主要影响一下几个要素:

a. 移动行为(位置、旋转)

b. 碰撞体交互

3. 注意一点,虽然Rigidbody 经常被描述成 是与其它 rigidbody 相互碰撞,但是实际上是 附加在Rigidbody上的Collider在进行碰撞检测,Rigidbody在没有Collider的情况下,是没法相互碰撞的。

4. 改变Rigidbody 2D的类型是一个比较麻烦的事情。当一个刚体类型改变,许多关联的变量会立马重置,并且需要重新赋值,而且与刚体关联的所有Collider需要在下一个FixiedUpdate之前重新认知,这样可能会导致奇怪的表现。

刚体类型: Dynamic


概括来说,这种类型是为了 物理仿真运动而设计的。(让物体看起来更像现实世界行为)它的运动受重力、质量、摩擦力、其他力影响。并且这种类型会与其他所有刚体类型发生碰撞。代码适宜使用AddForce,Velocity进行移动。

通常我们设置Linear Drag(线性阻力)为0,但是这个物体跑着跑着还是会停止是因为它与别的碰撞体有摩擦力。

Simulated:该组件是否与仿真模拟交互。
Collision Detection:碰撞体之间的碰撞检测方式:
Discrete:在一个 物理更新期间,物理可以相互重叠、穿越。当速度太快时,碰撞只会在最新的位置检测,这就意味着,如果速度太快,使用这个选项会有问题。
Continuous:这个就不会存在Discete的问题,但是CPU消耗高。
Sleeping Model:在什么情况下,会休眠以节省性能。
Never Sleep:从不休眠
Start Awake:物体最初是醒着的
Start Asleep:物体最初是休眠的,但是遇到碰撞就会苏醒。
Interpolate:在物理更新中,物体移动的插值算法
None:
Interpolate:基于上一帧物体位置来插值模拟
Extrapolate:基于预测下一阵物体位置来插值模拟
刚体类型:Kinematic


这种类型,物体移动也是在仿真下进行的,但是却是在 用户非常明确的控制 的前提下进行的。也就是你要自己编写程序控制这个类型的刚体移动。它不会收到任何力的作用,但是它会与动态刚体发生碰撞,碰撞的表现为 动态刚体被他撞飞了,而自己不会动。 如果勾选Use Full Kinematic Contact选项,那么这个运动刚体会与其他的碰撞体进行碰撞。

注意

1. 这种类型不受力、重力的影响

2. 它使用Rigidbody2D.MovePosition or Rigidbody2D.MoveRotation API来移动。

3. 它使用物理引擎来查询 碰撞,并且通过编程来决定物体如何移动。

4. 实际上,这种类型仍然通过它的速度来移动,但是它的速度却不受其他任何力的影响。

5. 这种类型 不会 与其它Kinematic或者Static类型发生碰撞检测

6. 在碰撞过程中,这种类型的物体表现为不受力(质量无穷大)。

Simulated:如果想要在运行时 与其它Collider 2D 发生物理仿真交互,就打开它。

Use Full Kinematic Constacts:开启它,该物体就可以与其它任意类型的Rigidbody 2D发生碰撞。

刚体类型:Static

1. 它只与 Dynamic 类型的Rigidbody 发生碰撞.

2. 无法拥有两个 Static 的Rigidbody 2D。

常用API
AddForce:这个方法是真实地给物体施加力。等同于动能方程。我的按键必须持续的按下,它才能持续的给物体施加力,增加物体的速度。如果是kinematic的刚体类型,则这个施加力是无效的。

Velocity:这个就是刚体的速度属性,当刚体加力或者被撞飞的时候,就会有速度。当然我们也可以直接赋值是刚体具有速度来移动。

MovePosition:这个就是直接改变刚体的位置。通常在Kinematic类型使用。

MoveRotation:同上

除此之外,刚体组件还有一些方法很常用,我来列出。

AddForceAtPosition

Cast:计算被这个刚体所统领(所属物体的)的所有碰撞体按指定方向,指定距离进行射线检测,然后将射线的信息获取。

IsTouchingCollider() :传入一个碰撞体的引用,判断该碰撞提与我的刚体是否接触。

OverlapPoint:输入一个position,看刚体是否与这个点重叠。

OverlapCollider:输入一个碰撞体,看刚体是否与这个碰撞体重叠。

GetContacts:获得所有与刚体接触的碰撞体。好棒~
————————————————
版权声明:本文为CSDN博主「永夜悠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_14812585/article/details/87926060

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:Unity2D 平台类游戏 人物移动 | Bruce's Blog

发表评论

留言无头像?