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

article/2025/10/19 13:34:08

写在前面

这个系列() 来自一个用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


http://chatgpt.dhexx.cn/article/UVw0cRyS.shtml

相关文章

rigidBodyTree是什么(附使用例子和代码)

目录 介绍将连杆加入刚体树DH参数添加机器人关节连杆修改刚体树模型设置刚体树动态特性外力作用导致关节的移动载入自带机器人模型并显示 介绍 rigidBodyTree是较新版本的MATLAB(小虎用的是2019b)自带的robotics相关工具箱里面的一个刚体树。它可以实现简单机器人刚体关节的连…

Unity中Rigidbody的属性 方法

RIgidbody组件 常用属性 Mass:质量 最小值0.00000001 最大值10000000000 Drag:阻力 最小值0 最大值无限 Angular Drag:角阻力 最小值0 最大值无限 Use Gravity:使用重力 is Kinematic:物理是否影响该物体&#x…

[Unity Mirror] Network Rigidbody

英文原文: https://mirror-networking.gitbook.io/docs/components/network-rigidbody Network Rigidbody目前被归类为“实验性”,因此请分享您发现的任何问题或错误,如果生产构建,请自担风险使用。 Network Rigidbody 组件通过网…

Unity Rigidbody实现爬坡功能

文章目录 🎈 简介🎈 实现原理🎈 实现代码 🎈 简介 人物移动功能的实现或许用到Character Controller组件或许用到Rigidbody刚体组件,前者可以直接实现在某些高地不平的地面上移动,而后者想要在具有一定角度…

UnityVR--组件2--Rigidbody--移动控制

移动的方式有transform.Translate()、rigidbody.velocity()、rigidbody.MovePosition()等多种。本篇使用rigidbody的方式,并向着相机朝向的方向控制移动。也就是继上一篇“第三人称相机控制”&a…

第二十五章 Unity 刚体Rigidbody

在物理学中,静止和匀速直线运动是物体的平衡状态,如果给该物体施加某一个力的话,物体的平衡状态就会改变,当然这个真理的前提是理想状态。我们知道在现实世界中,由于重力和摩擦力的存在,任何一个物体都不可…

Unity:使用RigidBody

There are mainly two ways of moving a gameObject in Unity: 在Unity中移动游戏对象的方式主要有两种: Changing Position Coordintes: By directly changing the position of a gameObject without much consideration to its physics or other such components…

Rigidbody刚体组件详解

【组件界面】 【作用】 有刚体组件的物体受物理引擎控制,表现得像物理世界中的物体,例如受重力作用、受摩擦力推力等各种力作用、遇到墙会停下来不能穿过去。在Unity中,若某物体不带有碰撞器,仍会被穿过。碰撞器的作用在于检测空…

Unity API详解——Rigidbody类

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性,包括重力、阻力、质量、速度等。对RIgidbody对象属性的赋值代码通常放在脚本的OnFixedUpdate()方法中。本博客主要介绍Rigidbody类的一些实例属性和实例方法,最后对Rigidbody类中功能相…

Unity 3D 刚体(Rigidbody)|| Unity 3D 刚体实践案例

Unity 3D 中的 Rigidbody 可以为游戏对象赋予物理特性,使游戏对象在物理系统的控制下接受推力与扭力,从而实现现实世界中的物理学现象。 我们通常把在外力作用下,物体的形状和大小(尺寸)保持不变,而且内部…

【Unity3D】刚体组件Rigidbody

1 前言 刚体(Rigidbody)是运动学(Kinematic)中的一个概念,指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。在 Unity3D 中,刚体组件赋予了游戏对象一些运…

【Unity】11.2 刚体(Rigidbody)

分类:Unity、C#、VS2015 创建日期:2016-05-02 一、简介 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样进行运动。 任何游戏对象&…

【Physics】一、Rigidbody 刚体

文章目录 1、刚体组件2、刚体脚本2.1、获取刚体2.2、添加力2.3、Move 点击访问官网 物理系统 、刚体概述 、 刚体 (Rigidbody) 1、刚体组件 刚体 (Rigidbody) 使游戏对象的行为方式受物理控制。刚体可以接受力和扭矩,使对象以逼真的方式移动。任何游戏对象都必须包…

Unity物理组件之刚体Rigidbody

一、刚体组件简介 1、刚体简介 刚体:Rigidbody,属于物理类组件 作用:添加了刚体组件的游戏物体,可以在物体系统的控制下来运动,刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体…

【Untiy学习笔记】Rigidbody组件及其常用函数

前言 提示:声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨。可作参考,但不保证绝对正确。如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦。 本文大部分内容来自官方文档&…

mac快速锁屏方法

方法一. 快捷键:controlcommandQ。 方法二. 点击左上角apple logo,锁定屏幕。 方法三(快捷方便). 系统偏好设置->调度中心->触发角->选一个角(左上、左下、右上、右下)->锁定屏幕或者将显示器…

mac修改cmd+ctrl+q锁定屏幕快捷键

mac里的cmdctrlq快捷键是系统快捷键,用作“锁定屏幕”: 这个快捷键优先级很高,导致无法设置其为其他应用快捷键(如qq)。 下面的方法可以把“锁定屏幕”改成其他快捷键,从而腾出cmdctrlq来给应用程序&#…

mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用

电脑快捷键可以帮助你提高工作效率,是使用电脑过程中经常用到的,苹果电脑的快捷键和普通PC不太一样,对于新手来说,经常找不到或不知道快捷键是什么,经常要去查,所以这边系统城小编跟大家介绍macbook快捷键的…

Mac提高效率的快捷键

分享常用的一些快捷键,欢迎补充,一起提高办公效率 目录 常用按键介绍系统管理关机和睡眠偏好设置触摸板、键盘和鼠标 窗口管理(最小化、关闭、退出)目录(文件夹)文本和文件操作撤销、重做复制、剪切全选查找…

mac系统修改锁屏快捷键

mac 自带了锁屏的快捷键,我忘了是什么了,点击屏幕左上角的苹果图标,就能看到。反正比较麻烦,没windows下方便,。 习惯了在windows下,按winL键来锁屏。在mac下,怎么改成commandL来锁屏呢? 方法…