所在位置:首页 > 手游攻略 > 翻转立方体 ​200+篇教程总入口(图)重力源

翻转立方体 ​200+篇教程总入口(图)重力源

发布时间:2022-12-08 15:03:12来源:网络整理浏览:12

200+教程总,欢迎收藏:

本文亮点:

1.支持多种电源

2.限制重力半径

3.让重力随距离减小

4. 创建平面、球形和立方体重力源

这是控制角色移动教程系列的第六部分。它通过支持多种重力源(包括平面、球体和立方体)来扩展我们的自定义重力。

本教程为系列教程,原文地址在文末。

本教程使用 Unity 2019.2.21f1 创建。它还使用包。

在两个球体和一个立方体之间跳跃

1个多力源

如果你只需要相同的重力源,那么前面教程中描述的方法就足够了。但是如果您需要使用不同类型的重力,或者每个场景使用一种不同的重力,或者在同一场景中使用多种不同的重力,那么就需要一种更通用的方法。

1.1 默认重力源

为了在场景中支持多个重力源,我们将创建一个新的组件类型,其公共方法类似于具有单个位置参数的方法,只是在这种情况下它不是静态的。最简单的实现是只返回 .. 使用它作为默认重力源,它可以添加到任何场景,这将允许我们的球体使用标准物理重力。

1.2 重力源列表

为了支持每个场景的多个重力源,必须跟踪所有活动源。我们将为此提供静态源列表。

这个列表是如何工作的?

有关通用列表的解释,请参阅持久对象教程的第 1.5 节。

调整仅具有位置参数的方法,使其遍历源并累积其重力。

在另一种也提供上轴的方法中执行相同的操作。现在我们别无选择,只能通过归一化和取反最终重力矢量来导出轴。

当只有一个来源时,我们可以优化它吗?

当然可以,但我们不会对来源的数量做出任何假设。如果一次只使用一个源,则不需要循环。

也必须以同样的方式进行调整。

使用列表是最好的方法吗?

如果只有几个引力源同时处于活动状态,则列表是最简单的方法也是最好的方法。只有当有很多资源在起作用时,才开始考虑更智能的空间分区策略(例如,限制卷层次结构)才更有益。另一种方法是使用碰撞和触发器来确定哪些对象受到哪些重力源的影响,但这会增加很多开销。还有一种方法可以禁用离玩家太远而影响游戏体验的重力源。但本教程将使其尽可能简单。

还要记住,具有多个彼此靠近的强引力源的区域并不直观。事实上,我们在这方面没有经验。具有多个引力源的场景可能很有趣,但在具有多个引力源的空间中航行可能会令人反感。

1.3 注册和注销重力源

为了能够改变引力源,添加一个公共和方法。他们只是在列表中添加或删除给定的重力源。

这个想法是一个单一的来源只能注册一次,否则它的效果会成倍增加。此外,只有取消注册以前注册的来源才有意义。可以多次注销和注册同一来源。这可以通过调用 Debug 来验证。添加断言以捕获编程错误。

Debug 是什么意思?做?

如果第一个参数为 false,断言错误将与第二个参数消息(如果提供)一起记录。第三个参数是如果在控制台中选择消息,则在编辑器中突出显示的内容。此调用仅包含在开发版本中,不包含在发布版本中。就好像 Debug.(...); 从未出现。因此,这是在开发过程中添加不会影响最终版本的检查的好方法。

我们可以分别在它的和方法中注册和注销。通过这种方式,它可以在编辑器之间创建、销毁、激活、停用、启用、禁用源代码和热重新加载时工作。

我们现在可以通过向每个场景添加带有组件的游戏对象来调整所有场景以再次使用默认重力。

默认重力源

1.4 允许扩展

这个起点是其他类型重力源的基础,也是我们创建的所有自定义组件类型的基础。新的引力源类型将通过用自己的实现覆盖方法来完成它的工作。为了使这成为可能,我们必须将此方法声明为方法。

关键词是什么意思?

请参阅持久对象教程末尾的解释

2 重力平面

默认的物理引力只定义了一个表示一般向下拉动的矢量。这个想法最简单的扩展是定义一个重力平面。它做的事情完全一样,只是平面会​​将空间分成上下两部分。我们可以用它来限制飞机重力的范围。

2.1 重力源类型

创建一个继承自的新组件类型。给它一个可配置的重力场。这是它应用于其范围内所有对象的加速度。因此,正值表示通过重力正常吸引,而负值表示排斥,表示反重力。

覆盖,使其返回一个正向上的矢量,并根据负配置的重力对其进行缩放。覆盖方法必须通过向它们添加关键字来显式完成。

我们现在可以创建一个重力平面,如果配置为指向下方,它的工作方式与默认物理重力矢量相同。

重力平面组件

我们还可以通过使用游戏对象的转换向上矢量来支持任何方向的平面。

2.2 可视化平面

为了更容易看到飞机的位置,我们将使用一些来可视化它。如果启用切换选项,它们将在场景窗口和编辑器的游戏窗口中绘制。虽然平面是无限的,但是我们需要用有限的形象化,所以我们用正方形。

绘图是通过添加方法并使用 类的各种静态方法和属性来完成的。首先将 .color 设置为黄色,然后通过 .color 绘制线框立方体。在原点,大小设置为 (1,0,1) 以便它变平成正方形。

默认情况下,在世界空间中绘制。为了正确定位和旋转正方形,我们必须通过将其分配给 来使用平面的变换矩阵。这也允许我们缩放平面对象,以便更容易看到正方形,即使这不会影响平面的重力。

例如,我制作了一个由两个相对的 20x20 矩形区域组成的小场景,并在它们的上方和下方放置了相应的重力平面。下部区域正常,而上部区域倒置。因为顶平面是旋转的,所以它也是倒置的,这意味着它的重力是翻转的。

两个相对的平面,缩放到 20 我们需要重置颜色和矩阵吗?

不,那是自动发生的。

2.3 重力范围

当具有相同重力的两个平面向相反方向拉动时,它们会相互抵消,根本不产生重力。如果我们想要一个重力在一个地方下降而在另一个地方上升的场景,我们必须限制每个平面的影响。通过在 . 它表示相对于平面本身的重力,因此最小范围为零。位面的影响是没有限制的,可以永远持续下去。

我们可以通过平面上的向量与该位置减去平面位置的点积来找到到中间位置的距离。如果距离大于此范围,则合成重力应为零。

我们不能切断飞机上方的重力吗?

这行得通,但我们稍后会使用示波器来逐渐减少重力,而不是将其设为有无二元。

我们可以通过绘制第二个正方形来可视化这个范围,最初是一个单位。让我们给它一个青色。

但在这种情况下,我们希望使用范围作为偏移量而不受平面 缩放的影响。你可以通过矩阵4x4自己构造一个矩阵来传递位置、旋转和缩放。我们只需要用范围替换对象局部比例的 Y 分量。

这些平面的配置使其平面范围最终位于完全相同的位置。因此,它显示了由重力翻转的平面。

平面的范围是4,它们之间的距离是8

如果范围为零,那么我们就不必费心绘制青色方块。

2.4 相机对准速度

假设我们可以跳得足够高,以至于我们现在可以在场景的一侧行走并跳到另一侧。当我们这样做时,重力会翻转,这也会突然翻转相机,这会让人迷失方向。我们可以通过较慢的重对准率来改善重力突然变化的体验。

添加可配置的向上捕捉速度以限制相机调整其向上矢量的速度,以每秒度数表示。让我们使用 360° 作为默认值,这样一个完整的重力翻转需要半秒才能完成。

对齐加速

我们现在必须调整重力对齐以通过四元数进行调整。首先,将代码移动到一个单独的 nt 方法中,并使用变量来跟踪当前和所需的向上向量。

我们可以通过计算向上向量的点积并通过 Mathf 将结果转换为角度来找到向上向量之间的角度。Acos 乘以 Mathf。最大允许角度是按时间增量调整的对准速度。

该函数仅对落在 -1 到 1 范围内的输入产生有效结果。由于精度限制,点积可能最终超出该范围,从而导致 Not-a- NaN 值。为避免这种情况,请使用 Mathf.Clamp 来限制点积结果。

如果角度足够小,那么我们可以像往常一样直接使用新的对齐方式。否则,我们必须在当前旋转和所需旋转之间进行插值,使用最大角度除以所需角度作为插值器。我们使用 .Slerp,它执行球面插值,以便我们获得正确的旋转。

由于我们确保仅在必要时进行插值,因此插值器保证在 0-1 范围内,我们可以使用它来避免不必要的额外钳位。

半秒后重新调整

插值采用最短路径,但 0 度翻转可以向任何方向移动。数学倾向于朝着某个方向发展,所以它总是朝着同一个方向发展,尽管有时看起来很奇怪。

2.5 重力退去

那个位面范围的要点是逐渐降低重力,而不是硬生生切断。为了演示这种方法的有用性,我回到了重力箱场景,并为箱子的六个边各添加了一个重力平面。我限制了它们的范围,所以盒子中间的大部分开放空间都没有重力。任何漂浮在那里的东西要么保持静止,要么保持它已有的势头。

一个有 6 个重力平面的盒子

由于每个平面的引力都是二元截断的,所以在立方体的棱角处会发生奇怪的事情。陡峭的斜坡重力突然变化,使交通困难。我们可以通过在距离从零到最大的范围内线性减小重力平面的重力来改进这一点。如果位置在平面上,只需乘以 1 减去距离除以范围。

在箱子里面走

当我们接近盒子的边缘或角落时,重力现在会更平滑地过渡。不过还是很诡异,可能很难从角落里逃出来,被三个位面的引力拉到那里,导致重力增加。稍后我们会提出更好的解决方案。

翻转立方体_积家翻转系列怎么翻转_立方体游戏

重力不应该除以距离的平方吗?

事实上,实际重力根据距离的平方减小。然而,这假设了一个大致球形的重力源,从它的质心开始测量。这对我们的引力平面来说没有意义,它是平坦的、无限大的并且没有质心。您可以对平面应用衰减,但由于没有最大重力范围,这是不可能的。由于此范围用于创建不同区域仅受特定重力源影响的不真实场景。衰减是线性的还是二元的通常无关紧要。更容易设计,这就是我使用的。

3个重力球

现在我们有了一个功能性重力平面,让我们对球体应用相同的方法。

3.1 半径和衰减

使用可配置的重力、外半径和外衰减半径创建。我使用术语“外半径”而不仅仅是“半径”,因为它表示重力处于最大强度时的距离。这不必与球体的表面半径相匹配。事实上,最好将它延伸得足够远,以便常规游戏区域能够维持恒定的重力水平。这使得设计更容易。否则,您会发现从稍高的位置进行常规跳跃可能会使您进入太空。

在这种情况下,我们可以使用 可视化引力。,再次使用黄色作为第一个阈值,青色作为第二个阈值。如果衰减球体比外球体大,我们只需要显示它。

重力球组件

衰减半径小于外半径是没有意义的,因此强制它始终至少与 Awake 和方法中的半径一样大。

3.2 应用重力

对于球体,通过从指向球体中心的位置找到矢量来工作。距离是矢量的大小。如果在外部衰减半径之外,则没有重力。否则,它是按配置的重力缩放的归一化矢量。请注意,我们再次使用正重力进行标准拉力,而负重力将物体推开。

再次在球体上行走

我们已经计算出向量的长度,所以我们可以将配置的重力除以它来计算向量的长度,而不是对其进行归一化。

我们不能从比较平方距离开始吗?

好的,这将是一种优化,可以避免在位置最终超出范围时进行平方根运算。您需要在方法中对配置的半径进行平方或将其存储在字段中。

在外半径和外衰减半径之间线性减小重力就像一个递减平面。我们只需要更改数学,使其落在正确的范围内。所以我们乘以一个减去外半径的距离,然后除以衰减范围。范围等于衰减半径减去外半径。将最后一位隔离在一个单独的衰减因子中,并将其存储在对其进行初始化的字段中。这避免了一些数学运算,但我这样做的主要原因是它使 .

通过衰减操纵,现在可以使用具有重叠衰减区域的多个重力球体,从而实现它们之间的平滑过渡。请注意,有一个抵消区域,物体可能会在两个球体之间的圆形轨道上结束,但当进入具有动量的区域时,它很少会卡在其中。

跳上不同的飞机

从一个领域跳到另一个领域需要一些练习。特别是当强引力场在大面积上重叠时,你可能会陷入相当长的不稳定轨道。此外,当球体的一部分受到另一个引力源的强烈影响时,引力会变得有点奇怪。

3.3 倒球体

我们还可以支持倒重力球。但是抵消重力是不够的,因为我们可能希望在球体中心有一个重力死区。这是球体重力自我抵消的区域,对于正常行星和逆行行星都是如此。它还可以在内部放置另一个不受更大重力影响的重力源。添加了可配置的内部衰减半径和内部半径以实现此目的。让我们再次用青色和黄色可视化它们,但前提是它们大于零。

内半径和衰减

内衰减半径的最小值为零,这会设置内半径的最小值,进而设置外半径的最小值。还添加了一个内部衰减因子,其作用与其他因子相同,只是半径的顺序相反。

我们现在也可以在距离小于内部衰减半径时中止。如果不是,我们还必须检查该距离是否落在内部衰减区域内,如果是,则适当缩放重力。

行星位于倒置行星内部,稍微偏离中心

4个重力箱

通过完成 Box 场景来结束本教程。我们将创建一个单一的盒形重力源,而不是使用六个平面使其在盒子内行走。

4.1 边距

为基于盒子的重力源创建一个新的 类型。这个想法类似于一个球体,但重力被直接拉到最近的面,而不是随着方向平滑地变化。我们需要一个可配置的重力,以及一种定义盒子形状的方法。我们将使用边界距离向量,它有点像半径,但具有三个独立的维度。

所以这些是从中心到面部的距离,这意味着盒子是其边框大小的两倍。最小边界是零向量,我们可以用 .Max 强制执行。通过小发明。使用红色线框立方体可视化此边界。

重力盒边界

4.2 内部距离

我们将再次定义一个内部区域,其中重力将处于其最大强度,加上一个内部区域,其中重力将减少到零,该区域内将不存在重力。这次半径没有意义,所以我们将它们定义为相对于边界向内的内部距离。所有三个维度的距离都相同,因此我们可以使用两个可配置值。

两个内部距离的最大值等于最小边界距离。除此之外,内部衰减距离必须至少与内部距离一样大。

这两个距离都可以通过线框立方体可视化,其大小等于边界距离减去相关距离的两倍。

内部距离,减少 Y 边距

4.3 衰减

计算盒子的重力衰减比球体的重力衰减要复杂一些,但我们同样可以使用内部衰减因子。

最简单的方法是首先考虑类似于平面的单个引力分量。为此创建一个方法,带有两个参数。第一个是相对于盒子中心的相对位置坐标。第二个是沿相关轴到最近面的距离。它返回沿同一轴的重力分量。

如果该距离大于内部衰减距离,则我们处于零重力区域,因此结果为零。否则,我们必须检查是否必须像对球体所做的那样减少重力。唯一的额外步骤是,如果坐标小于零,则必须翻转重力,因为这意味着我们位于中心的另一侧。

然后该方法必须使位置相对于框的位置,从零向量开始。然后计算中心到中心的绝对距离,调用得到最小距离,并将结果赋值给向量的适当分量。结果,重力相对于最近的面直接向下拉,或者如果重力为负则推向它。

最后,为了支持任意旋转的立方体,我们必须旋转相对位置以与立方体对齐。为此,我们将转换它的动作传递给它,忽略它的缩放。最终的重力矢量必须以相反的方式旋转。

这种方法的结果是,当最近的面发生变化时,重力会突然改变方向。当它漂浮在盒子内时它工作正常,但它很难在盒子内的面之间移动。我们会尽快改进这一点。

走进箱子

4.4 盒子外

与球体一样,我们也将支持外部距离和外部衰减距离,以及外部衰减因子。

盒子里面的重力势必会突然发生变化,但是盒子外面,就更加模糊了。假设我们正在盒子外面移动,被拉向盒子。如果我们越过脸的边缘,重力仍然会把我们拉下来,但如果我们一直将它与最近的边缘对齐,那么我们就会穿过盒子而不是朝它掉下去。这表明如果我们不在表面正上方,我们应该落向最近的边缘或角落。同样,距离应该相对于该边或面来确定,因此我们最终得到一个圆形的立方体区域。

没有方便的方法来可视化圆形立方体,所以让我们创建一个简单的近似值。首先添加一个通过四个点绘制闭环的方法,我们将使用它来绘制矩形。

接下来翻转立方体,创建一个在给定距离处绘制外部立方体的方法。给它四个向量变量,并设置它们,以便我们在正确的面孔的适当距离处绘制一个正方形。

然后取反这些点的 X 坐标,以便绘制左侧面。

对其他四个面重复此过程。

如果需要,绘制两个外部立方体。

外距离,减少边距

这向我们展示了圆形外立方体的平坦区域,而不是圆形边界。我们可以创建一个非常详细的可视化来展示它们,但这需要大量代码。相反,在立方体的圆角点之间添加一个线框立方体就足够了。这些点与边界立方体有一定距离,在所有三个维度上均等偏移。因此,我们期望的距离等于边界立方体加上相关距离的总和,比例为√(1/3)。

边界指示器,减少边界

您也可以沿着圆角的边缘绘制直线,使用在两个维度上按 √(1/2) 缩放的距离,但我们当前的方法就足够了。

4.5 检测边

现在,我们必须确定给定位置是在 的框内还是框外。我们根据每个维度确定这个数字,并计算出我们最终有多少外部因素。首先,检查位置是否超出右侧。如果是这样,将向量的 X 分量设置为 X 边界减去 X 位置。调整矢量以直接指向表面而不是中心。另外,增加外部计数。

如果我们不在右边,请检查我们是否在左边。如果是这样,相应地调整向量,这次是从负边界距离中减去位置。

分别对 Y 和 Z 侧执行相同的操作。

完成后,检查我们是否在至少一个表面之外。如果是这样,到边界的距离等于调整向量的长度。然后,我们可以使用与球外相同的方法。否则翻转立方体,我们必须确定内部引力。

请注意,如果我们碰巧在一张脸的外面,那么我们就在它的正上方,这意味着只有一个向量的分量是非零的。如果盒子很大,通常会出现这种情况。我们可以取向量分量的绝对和,这比计算任意向量的长度要快。

使用这种方法,如果我们使边界框小于表面框,则重力会沿着边缘和角落再次平滑变化。在这些地区,引力不再强大。您必须确保外部距离足以到达所有角落。

在圆形立方体的重力下行走

现在可以创建具有奇怪重力的盒子行星。请注意,如果你跑得很慢,跑过一个表面会让你在盒子星球上停留一会儿。这可以通过使重力框的边界小于表面边界来缓解,这会导致重力在您接近边缘或角落时更早弯曲。即便如此,您可能希望增加盒子的重力以在快速移动时紧贴表面。

在重力为 2 倍的盒子行星表面行走

下一章,移动地面。

本文翻译自Flick系列教程