Cocos Creator 3.8.x 对 Tiled 1.4.x(2D瓦片地图编辑器)提供了完整的导入、解析、渲染及二次开发支持,覆盖从资源导入到运行时交互的全流程。以下是核心可操作/分析维度的详细梳理:
一、核心资源导入与解析
Cocos Creator 3.8.x 原生支持 Tiled 1.4.x 导出的 .tmx/.tsx 格式文件,可解析 Tiled 的核心数据结构,具体包括:
1. 基础图层解析
| Tiled 图层类型 | Cocos 支持程度 |
|---|---|
| 瓦片图层(Tile Layer) | 完全解析,支持正交/斜角(Isometric)/六边形(Hexagonal) 瓦片地图,保留图层顺序、可见性、透明度 |
| 对象图层(Object Layer) | 解析所有对象类型:矩形、椭圆、多边形、折线、点、文本,保留对象属性(自定义属性、锚点、旋转、缩放) |
| 图像图层(Image Layer) | 解析嵌入的图片资源,支持图层偏移、缩放、透明度 |
| 组图层(Group Layer) | 解析分组结构,保留组的层级、可见性、折叠状态(运行时可通过代码控制组内图层) |
2. 瓦片集(Tileset)解析
- 支持 Tiled 1.4.x 的内嵌瓦片集 (嵌入
.tmx)和外部瓦片集 (.tsx),自动关联纹理资源; - 解析瓦片集的属性:瓦片大小、边距、间距、偏移量(tile offset)、透明色;
- 支持瓦片动画(Tiled 中定义的帧动画),Cocos 可直接播放或通过代码控制;
- 解析瓦片的自定义属性(如碰撞标签、行走成本、事件标记等)。
3. 地图元数据解析
- 地图尺寸、瓦片尺寸、方向(正交/斜角/六边形)、渲染顺序(右下/左上);
- 自定义属性(Tiled 中给地图/图层/瓦片/对象添加的键值对),可通过代码读取;
- 背景色、无限地图(infinite map)解析(Cocos 3.8.x 完善了无限瓦片地图的渲染优化)。
二、编辑器内可视化操作
在 Cocos Creator 3.8.x 编辑器中可直接对 Tiled 导入的地图进行可视化编辑/配置:
1. 层级管理器操作
- 拖拽调整 Tiled 图层/组的顺序,修改图层可见性、透明度;
- 将对象图层中的对象(如矩形)直接关联到 Cocos 节点,添加组件(如碰撞体、触发器);
- 给瓦片地图节点添加
TileMap组件(核心组件),可视化配置地图参数。
2. 属性检查器配置
- 对
TileMap组件:修改地图渲染模式(如是否启用批处理、抗锯齿)、瓦片集纹理; - 对瓦片图层:调整偏移、缩放、旋转,启用/禁用碰撞检测;
- 对对象图层中的对象:修改位置、大小、旋转,编辑自定义属性(同步 Tiled 定义的属性)。
3. 场景编辑器交互
- 预览瓦片地图的渲染效果(包括斜角/六边形地图的透视);
- 选中对象图层中的对象(如点对象),快速定位到场景中的位置;
- 结合 Cocos 的场景坐标系,调整地图节点的锚点、位置,适配不同分辨率。
三、运行时代码操作(核心能力)
通过 Cocos Creator 3.8.x 的 TileMap/TileLayer/TiledTile 等 API,可对 Tiled 地图进行动态修改和分析,核心场景包括:
1. 瓦片数据读写
typescript
import { _decorator, Component, Node, TileMap, TileLayer } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('TileMapController')
export class TileMapController extends Component {
@property(TileMap)
tileMap: TileMap = null!;
onLoad() {
// 1. 获取指定图层
const layer = this.tileMap.getLayer('GroundLayer');
if (!layer) return;
// 2. 读取指定坐标的瓦片ID(Tiled中定义的ID)
const tileId = layer.getTileGIDAt(5, 5);
console.log('Tile ID at (5,5):', tileId);
// 3. 修改指定坐标的瓦片
layer.setTileGIDAt(100, 5, 5); // 100为目标瓦片ID
// 4. 检查瓦片是否为空
const isEmpty = layer.isEmptyTileAt(5, 5);
console.log('Tile is empty:', isEmpty);
// 5. 获取瓦片的自定义属性(Tiled中给瓦片添加的属性)
const tileInfo = layer.getTileInfoAt(5, 5);
if (tileInfo) {
console.log('Tile properties:', tileInfo.properties); // 如{isObstacle: true, cost: 2}
}
}
}
2. 对象图层解析(碰撞/寻路/触发)
typescript
// 获取对象图层
const objLayer = this.tileMap.getObjectLayer('CollisionLayer');
// 遍历所有对象
objLayer.objects.forEach(obj => {
console.log('Object name:', obj.name);
console.log('Object type:', obj.type); // Tiled中定义的对象类型
console.log('Object position:', obj.x, obj.y);
console.log('Object size:', obj.width, obj.height);
console.log('Object custom props:', obj.properties); // 自定义属性
// 示例:根据对象属性创建碰撞体
if (obj.properties.isObstacle) {
const collider = this.node.addComponent(BoxCollider2D);
collider.offset = new Vec2(obj.x, obj.y);
collider.size = new Vec2(obj.width, obj.height);
}
});
3. 瓦片动画控制
Tiled 1.4.x 中可给瓦片添加帧动画(帧序列、时长),Cocos 3.8.x 可直接播放并控制:
typescript
const layer = this.tileMap.getLayer('AnimatedLayer');
// 暂停/恢复指定瓦片动画
layer.pauseTileAnimateAt(3, 3);
// layer.resumeTileAnimateAt(3, 3);
// 暂停/恢复整个图层的动画
// layer.pauseAllAnimate();
// layer.resumeAllAnimate();
4. 地图尺寸与坐标转换
typescript
// 获取地图总瓦片数
const mapSize = this.tileMap.getMapSize();
console.log('Map size (tiles):', mapSize.width, mapSize.height);
// 获取单个瓦片像素尺寸
const tileSize = this.tileMap.getTileSize();
console.log('Tile size (px):', tileSize.width, tileSize.height);
// 瓦片坐标 ↔ 世界坐标转换
const worldPos = this.tileMap.getTileCenterWorldPos(5, 5); // 瓦片坐标转世界坐标
const tilePos = this.tileMap.getTileCoordByWorldPos(worldPos); // 世界坐标转瓦片坐标
四、高级分析与扩展
1. 性能分析
- Cocos Creator 3.8.x 提供性能面板 ,可分析瓦片地图的渲染批次(draw call):
- 瓦片集合并(atlas)可减少 draw call;
- 隐藏不可见图层、裁剪超出视口的瓦片(Cocos 自动优化,也可手动控制);
- 监控瓦片地图的内存占用:纹理(瓦片集)是主要内存消耗,可通过纹理压缩优化。
2. 兼容性分析
Tiled 1.4.x 部分特性在 Cocos 3.8.x 中的兼容情况:
| Tiled 1.4.x 特性 | Cocos 3.8.x 支持情况 |
|---|---|
| 正交地图 | 完全支持 |
| 斜角(Isometric)地图 | 完全支持 |
| 六边形(Hexagonal)地图 | 支持(渲染/坐标计算) |
| 瓦片旋转/翻转 | 完全支持(Tiled的水平/垂直翻转、旋转) |
| 无限地图(Infinite Map) | 支持(解析+渲染,性能优化较好) |
| 瓦片集模板(Template) | 部分支持(需手动解析模板引用) |
| 图层蒙版(Layer Mask) | 暂不原生支持(可通过代码模拟) |
| 自定义渲染顺序 | 支持(通过图层顺序/节点层级控制) |
3. 扩展开发
- 自定义 Tiled 插件:导出额外数据(如寻路网格),Cocos 解析后集成;
- 瓦片地图编辑器扩展:基于 Cocos 插件系统,开发可视化瓦片编辑工具;
- 批量处理:编写脚本批量修改 Tiled 导入的地图数据(如替换瓦片、批量添加属性)。
五、最佳实践
- 瓦片集优化:将常用瓦片合并到同一图集,减少 draw call;
- 分层管理:将静态背景、动态交互、碰撞检测分层,便于代码控制;
- 属性复用:在 Tiled 中给瓦片/对象添加标准化属性(如
isObstacle),Cocos 统一解析; - 性能裁剪:对大地图,只渲染视口内的瓦片(Cocos 3.8.x 可通过
setVisibleRect实现); - 版本兼容:Tiled 1.4.x 导出时选择
XML格式(.tmx),避免 JSON 格式的兼容性问题。
总结
Cocos Creator 3.8.x 对 Tiled 1.4.x 的支持覆盖资源导入-编辑器可视化-运行时动态控制全流程,可满足 2D 瓦片地图的绝大多数开发需求(如关卡编辑、碰撞检测、动态地图修改、瓦片动画)。核心优势是原生解析 Tiled 数据结构,且提供灵活的 API 进行二次开发,仅少数小众特性(如图层蒙版)需手动模拟实现。