Files
BusyRabbit/Docs/PaperTerrainMapActor_Usage.md
2025-09-07 03:34:14 +08:00

4.8 KiB
Raw Permalink Blame History

PaperTerrainMapActor 使用说明

概述

APaperTerrainMapActor 是一个封装了Paper2D TileMap组件的地形地图生成器Actor集成了之前实现的地形生成器功能可以直接在场景中生成和显示随机地图。

核心功能

1. 集成地形生成器

  • 内置 UTerrainGenerator 实例
  • 支持所有地形父子关系、概率权重和互斥关系
  • 自动应用默认地形配置

2. Paper2D TileMap 支持

  • 自动创建和管理PaperTileMap组件
  • 支持自定义地图尺寸和Tile大小
  • 自动调整组件缩放以适应地图尺寸

3. 地形到Tile映射

  • 可配置的地形标签到Tile索引映射
  • 支持自定义Tile映射关系
  • 默认Tile索引用于未映射的地形

4. 自动生成选项

  • 在构造时自动生成地图
  • 在游戏开始时自动生成地图
  • 支持手动触发生成

基本用法

在场景中使用

  1. 在内容浏览器中右键 -> 创建高级资源 -> Blueprint类
  2. 选择 APaperTerrainMapActor 作为父类
  3. 将创建的Blueprint拖放到场景中

配置参数

在Details面板中可以配置以下参数

Map Settings:

  • MapWidth: 地图宽度(格子数)
  • MapHeight: 地图高度(格子数)
  • TileSize: 每个Tile的大小像素
  • bAutoGenerateOnConstruction: 是否在构造时自动生成
  • bAutoGenerateOnBeginPlay: 是否在游戏开始时自动生成

Terrain Mapping:

  • TerrainTileMappings: 地形到Tile的映射表
  • DefaultTileIndex: 默认Tile索引

蓝图调用

在蓝图中可以调用以下函数:

- GenerateTerrainMap():生成地图
- ClearMap():清除当前地图
- GetTerrainGenerator():获取地形生成器实例
- GetGeneratedTerrainData():获取生成的地形数据

高级配置

自定义地形映射

可以在Details面板中编辑 TerrainTileMappings 数组为每个地形标签指定对应的Tile索引

// 示例:自定义地形映射
FTerrainTileMapping CustomMapping;
CustomMapping.TerrainTag = FGameplayTag::RequestGameplayTag(TEXT("Terrain.Forest"));
CustomMapping.TileIndex = 10; // 使用TileSet中的第10个Tile

修改地形生成配置

通过获取地形生成器实例,可以动态修改地形配置:

// 在蓝图中或代码中修改配置
UTerrainGenerator* Generator = PaperTerrainMapActor->GetTerrainGenerator();
Generator->SetProbability(ForestHandle, 0.9f);
Generator->SetWeight(ForestHandle, 8.0f);

动态生成地图

可以在运行时动态生成不同尺寸的地图:

// 设置新尺寸
PaperTerrainMapActor->MapWidth = 128;
PaperTerrainMapActor->MapHeight = 128;

// 重新生成地图
PaperTerrainMapActor->GenerateTerrainMap();

性能优化

地图尺寸建议

  • 小地图64x64 - 128x128适合手机设备
  • 中地图256x256默认平衡性能和细节
  • 大地图512x512+(需要性能优化)

生成时机

  • 在加载界面预生成地图
  • 使用后台线程生成(需要自行实现线程逻辑)
  • 支持渐进式生成和流式加载

调试功能

日志输出

Actor会输出详细的生成日志

  • 地图初始化信息
  • 地形生成统计
  • TileMap应用结果

可视化调试

  • 在编辑器中实时查看生成结果
  • 支持运行时重新生成
  • 可以随时清除和重新生成地图

集成示例

与游戏逻辑集成

// 在GameMode中生成初始地图
void ABusyGameMode::BeginPlay()
{
    Super::BeginPlay();
    
    // 生成地图
    APaperTerrainMapActor* MapActor = GetWorld()->SpawnActor<APaperTerrainMapActor>();
    MapActor->GenerateTerrainMap();
    
    // 保存地图引用
    CurrentMap = MapActor;
}

与导航系统集成

可以根据生成的地形数据设置导航网格:

// 根据地形类型设置导航成本
for (const FGameplayTag& TerrainTag : MapActor->GetGeneratedTerrainData())
{
    if (TerrainTag.MatchesTag(FGameplayTag::RequestGameplayTag(TEXT("Terrain.Water"))))
    {
        // 水域导航成本高
        SetNavigationCost(TerrainTag, 10.0f);
    }
    else
    {
        // 普通地形导航成本低
        SetNavigationCost(TerrainTag, 1.0f);
    }
}

注意事项

  1. TileSet配置需要提前配置好Paper2D TileSet资源
  2. 地形标签确保GameplayTags设置中包含所需的地形标签
  3. 性能考虑:大地图生成可能耗时,建议在后台线程进行
  4. 内存使用:大地图会占用较多内存,注意资源管理

扩展建议

添加多层地形

可以扩展支持多层TileMap用于表现地形高度、装饰物等。

动态地形修改

支持运行时修改特定位置的地形,用于表现建筑、道路等。

序列化支持

添加地图数据的序列化功能,支持保存和加载生成的地图。