# 爬梯
## 概览和结构
在**daNetGame**项目中,有一种攀爬垂直(或接近垂直)梯子的技术。
作为游戏的一部分(玩家可以攀爬)的垂直梯子实际上是复合物体。它们由两个部分组成:
1. 视觉几何 (`*.dag`)
2. 游戏对象 (`*ladder.gameObj.blk`).
```{note}
`.blk`文件的名称必须遵循 `ladder`后缀和 `*.gameObj.blk`扩展名的惯例。
```
### 几何参数
可视几何图形没有什么特别之处--一切都是标准而简单的。它只是一个有特定阶数的梯子模型(阶数很重要,因为它将用于游戏对象中)。
```{important}
唯一需要注意的关键点是,台阶的间距必须均匀。
否则,在攀爬过程中,角色的手脚可能无法正确对准台阶。
```
#### 游戏对象参数
游戏对象(gameObj)是一个程序化生成的对象(类似于**wall_holes**、**indoor walls**等)。要创建它,您需要生成一个包含梯子描述的文本文件(`*ladder.gameObj.blk`):
- `volumeType:t="box"` – 生成的游戏区域的几何类型,类似于碰撞中的网格、方框、凸形。我们特别使用了 `box` 类型。
- `boxSz:r=0.5` – 定义方块中心到任意边的距离。 该值代表立方体边长的一半,也就是说,默认值 `0.5`会生成一个 1 米的立方体。默认设置为 `0.5`,我们不会更改。它的影响微乎其微,因为盒子的大小随后将由复合对象中的矩阵定义(因为梯子的形状不是立方体)。
- `isLadder:b=yes` – 指定该游戏对象是一个梯子。
- `ladderStepsCount:i=14` – 阶数(这一点很重要,因为它会影响角色手脚在实际梯子几何图形上的位置)。
游戏对象的实际尺寸是通过其矩阵在复合对象中确定的,该矩阵将视觉几何图形与游戏对象整合在一起。这样,游戏对象就能与特定梯子所需的比例相匹配。
## 创建阶梯游戏对象
### 一般指南
1. 您不一定需要创建一个新的游戏对象。您可以重新使用现有的对象,只需在复合对象中对其进行转换,使其适合您的梯子即可。
```{note}
不过,请务必记住,游戏对象包含预定义的梯级数,不得更改。更改它将会破坏已使用该对象的梯子。如果阶数不符合您的需要,请创建一个新对象。
```
2. 避免修改默认立方体尺寸(`boxSz:r=0.5`,即每边 1 米)。如果出于某种原因决定更改该值,则必须确保在 *3ds Max* 中创建复合对象时对尺寸进行相应调整(如下所述)。否则,**3ds Max** 和 [*Asset Viewer*](../../../dagor-tools/asset-viewer/asset-viewer/asset_viewer.md) 中的结果将不一致。
3. 梯子是独立的物体还是建筑物的一部分并不重要,每种情况都是独一无二的。如果一个梯子被多次使用,那么将其作为一个单独的对象会更合理。如果梯子是特定建筑物的独有物件,则可以保留为建筑物几何体的一部分(考虑优化、LOD 等)。
技术保持不变--每个梯子都必须通过复合对象添加一个游戏对象。
4. 最好将`*ladder.gameObj.blk`与可视几何图形一起存储。
5. 除非游戏需要,否则请避免在物理系统中的每一步都添加碰撞。物理碰撞不会与攀爬动画产生交互作用--它只会与胶囊发生碰撞。
6. 游戏对象的跨度应**从下台阶到上台阶**。 否则,可能会出现手脚位置不正确的情况。
下面是一个使用 `wood_ladder_a` 模型的示例:
```{note}
截至 2023 年 7 月,系统设置为**角色只能从游戏对象的 X 侧**攀爬。从其他面攀爬可能不起作用,或行为不正确。
---
```
#### 创建游戏对象的方法
#### 方法 1
1. 在 **3ds Max** 场景中,创建一个尺寸为 1x1x1m 的立方体,其支点位于中心。如果更改了 `boxSz:r=0.5` 的大小,则需要相应调整立方体的大小。
2. 缩放立方体,使其与梯子的尺寸一致。
3. 使用可用工具导出复合对象(梯子 + 游戏对象)(例如 [*dag2rires*](../../../dagor-tools/dag2rires/dag2rires.md))。
---
#### 方法 2
1. 在 [*daEditor*](../../../dagor-tools/daeditor/daeditor/daeditor.md) 中,放置预先创建的 `*ladder.gameObj.blk`。
2. 缩放它以匹配梯子的尺寸。
3. 使用菜单选项**Landscape > Export as composite**导出合成对象(或整个建筑)。
---
---
## 相关文章
- [为垂直梯生成步兵导航网格](navmesh_gen_vert_ladders.md)