[ 游戏开发日记with Unity ] 首先,认识你自己,或者说Player吧。 有关于Rigidbody2D和Collider的一些使用知识

写在前面

这个系列() 来自一个用Unity开发的2D横版射击游戏的开发过程,用来记录学习进度以及一些学习心得。和大家分享共勉,有错误的话请评论指出,我会积极回复。

=+=+=+=+=+=+=+=+=+=

那么,我们开始吧

=+=+=+=+=+=+=+=+=+=

Q.问题是什么? What is the “Problem”?

  • 当讨论到一个需求的时候,我们总需要面对一个核心问题。它是所有开发的思想基点
  • 那么当我们需要写一个角色运动的需求的时候,我们需要考虑什么基本问题呢?

答案显而易见:物理
研究物体的运动,这不就是物理吗。
那么,我们需要实现一个物体(谁也没说是刚体奥)的运动,我们首先需要一个可以使用的物理系统。 当然,你可以用硬核的办法将所有必要的物理规律用代码在你的脚本中实现。但是既然你点进来了,说明我们选择了一条捷径:游戏开发引擎

我们有什么 What do we have?

Unity内置了一套非常好用的物理系统,它提供了包括但不限于MassGravity ScaleAngular DragLinear Drag等一系列大家耳熟能详的物理量。当然,既然他给了这些物理量,那基本的物理规律也都被实现了,非常的银杏。我们只需要在我们的对象上添加一个Rigidbody2D(rigid:坚硬的 body:体 rigidbody:刚体) 就能实现基本的重力系统了。

如下图 是一个添加到Player对象上的Rigidbody2D Component
就像一块乐高积木一样,现在我的Player被添加了刚体的特性,你可以说它一个刚体,或者说它拥有一个刚体

在这里插入图片描述

等等

这还没结束,我们需要先简单 了解一下Rigidbody2D的用法,我们从根据词条上往下介绍。

Body Type

在这里插入图片描述

我们有三种Type,如图所示

  • Dynamic 动态的
    当你需要一个可以被操纵、运动的物体时,你可能需要的是Dynamic Type, 它提供了最多的可操作性,包括但不限于施加速度velocity、重力GravityForce。它的位置,旋转角都可以被修改,而且会与所有类型的Rigidbody2D物体发生碰撞Collision,我们的Player就是这个类型。
  • Kinematic 运动的
    当你需要一个看起来没有自我意识的运动物的时候,你可以选择Kinematic,它提供了可以改变的坐标和旋转角,也可以被直接施加速度velocity。但是HOWEVER,它不能够被施加力,也就是说你无法对它AddForce,重力对它也无效。而且,它只会与Dynamic Rigidbody2D物体碰撞 ,并且不会被改变速度(因为它不受力)
  • Static 静止的
    正如字面意思那样,Static means static. 如果你需要一个不会移动or被移动的东西,比如地板或者天花板,又或者是一个固定炮台。
    它不会发生运动,也无法被修改位置,但它可以和Dynamic Rigidbody发生碰撞,这是由Dynamic Rigidbody的特性决定的。
Material 物理材质

既然是一个刚体,那么它应该有一个物理材质,就像我们做物理力学题的时候题里的小方块一样。我们需要它的材质来为我们提供一些信息,用于计算最终的运动结果。

在这里插入图片描述
如你所见,它包含两个参数:

  • Friction 摩擦系数
    决定了物体运动时受到阻力大小的系数
  • Bounciness 弹性系数
    决定了物体发生碰撞时反弹速度的系数

简单的高中物理
如果你和我一样不需要它们,全部设置为0也无妨。

Simulated 运动模拟

勾选,即表示你默许了这个刚体可以与其它刚体(或者碰撞机Collider)来发生物理上的交互模拟。它是我们上面提到的碰撞的基础,不勾选的话就不会发生碰撞Collision,或者接合Joint,它甚至无法发生运动。

Use Auto Mass

它自以为很人性化地提供了这个按钮,实际就是给你了除直接赋值另一种添加质量的办法。如果你勾选了这一项,那么你的刚体质量则由其上所有的Collider2D面积乘以密度Density来生成。
很物理,不是吗?
但是我没有用到这个功能,至少目前没有。

Linear Drag && Angular Drag 线性/旋转阻尼

它们两个是运动的阻尼系数,就像我们认知中的摩擦力或者空气阻力这类阻碍运动的力的作用类似。
我们可以通过增大它们来达到阻碍运动的效果

Gravity Scale 重力系数

你可以把它类比成重力加速度g,完全可以,这个数值越大,物体下落得越快,只是实际的操作手感需要慢慢微调,或者你也可以通过精密的计算得到一个完美的Gravity Scale,只不过那不是我的风格,我喜欢在实验中得到满意的效果。

Collision Detection 碰撞检测

字面意思,它决定了检测碰撞Collision频率

  • Continuous 连续 意味着时刻检测它是否与其它刚体发生碰撞
  • Discrete 离散 意味着检测是离散
    实际上,我们知道计算机的基础是离散数学,所以这里没有连续可言,Continuous只是频率更加高的离散检测而已,你需要知道Continuous Detection一定会占用更多的内存资源用于检测物体之间的碰撞。所以如果你不是爱得深沉或者有致命Bug,请不要使用Continuous
    详细的原理想了解的朋友可以移步Unity用户手册查阅。那里给出了详细的调用方式。
Sleeping Mode 睡眠模式

同样地,我们被提供了一些选项用于控制刚体的唤醒休眠

  • Never Sleep
  • Start Awake
  • Start Asleep

一般情况下,我们是使用Start Awake的,这意味着这个物体在被初始化时,就是被唤醒Awake的,它会参与例如碰撞的物理模拟过程。
Never Sleep意味着这个物体不会自动休眠,你始终需要检测它是否参与物理模拟。
Start AsleepStart Awake相反,它意味着这个物体最开始是休眠的,需要被外物轻轻敲醒沉睡的心灵,你可以通过碰撞之类的手段唤醒它。

Interpolate 插值

像近年多起来的高帧率老动画一样,它通过在你的动画的两帧之间插入一个中间帧,来让你的运动看起来更加丝滑,不过,效果如何我不好做评价,毕竟我也没用过。 我们跳过

Constraints 约束

这个Tab里面有三条轴,勾选它们可以让你的刚体在这个轴上不发生运动
对于一个2D项目而言,Freeze Z Axis意味着你禁止这个物体发生转动Rotation
而对于Position的约束可以通过Freeze X or Y Axis来实现

再等等
关于刚体,我们知道这些知识就能够满足大部分的开发需求了,如果需要更加细致的调整,你可以试着自己来实现Rigidbody的功能,或者看看能不能通过某些手段魔改一下Unity的功能。Always Check The Manual

那么接下来,我们需要接着了解一个与刚体紧密相关的组件:Collider2D

就像它的名字那样,它的作用是用来计算碰撞,也就是我们常说的碰撞箱hitBox
对于任意一个刚体,我们都希望它有一个碰撞箱,毕竟它可是刚体啊。所以Unity为我们提供了Collider组件,长这样:
在这里插入图片描述
这是一个Box Collider,我们还有CircleCapsule等等形状的碰撞箱。总之,我们还是像Rigidbody2D那样,介绍一下它吧。

Edit Collider

右边有一个很像按钮的按钮,没错,它是用来按的。
按一下右边的按钮,你就能够Scene里面找到一个绿色的小框框了,你可以修改这个碰撞箱的大小,位置,让它处在你想要的地方

Material

就如刚体的Material一样,Collider在被单独使用的时候也是满足这样的规则的,我们不再赘述。
哦对了,如果你勾选了Rigidbody2D中的Use Auto Mass的话,这个选项的上面还会出现一个Density,也就是密度,在这里输入它吧。

isTrigger && UsedByEffector

众所周知,碰撞箱是用来发生碰撞的。
那么有没有例外呢?
你好,有的。
如果你只是希望检测两个物体有没有互相碰撞,而不希望它们的运动状态被改变的话,

  • 勾选isTrigger 并且不要勾选Used By Effector
    如此,这个碰撞箱会在发生碰撞时返回它碰到的物体的信息,然后接着飞。
  • 如果你勾选了Used By Effector
    那么它不仅会返回信息,而且会像正常的碰撞一样,碰撞。
Used By Composite

当你用到组合件,比如Tilemap的时候,我们的物体可能不是由一个碰撞箱构成的,而是由若干个小小的碰撞箱组合而成的,勾选Used By Composite,证明它是某个更大Collider的一个部分,这会禁用上面的两个选项isTriggerUsedByEffector。转而在组合体中提供这个选项。

Auto Tilling

当你使用的是Tilemap时,可以勾选它来自动地拼接碰撞箱。

OffSet && Size && Edge Radius

偏移量 和 大小 和 边缘半径
没什么好说的,在你调整Collider位置的时候会自动地改变它们,你可以通过直接修改值,来更加精确地调整你的Collider。

我累了,今天先写到这里,我们今天介绍了Rigidbody2D以及Collider2D,它们在我们的运动控制中是绝对的主体,以后我们会频繁地调用它们。关于贴图Sprite以及动画Animation,那是另外的事情,以后也会讲到。

下期预告

Unity的输入系统 以及 移动的脚本实现 可能有 跳跃(二段跳)

See U

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值