182 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			182 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # 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索引 | |||
|  | 
 | |||
|  | ### 蓝图调用
 | |||
|  | 
 | |||
|  | 在蓝图中可以调用以下函数: | |||
|  | 
 | |||
|  | ```blueprint | |||
|  | - GenerateTerrainMap():生成地图 | |||
|  | - ClearMap():清除当前地图 | |||
|  | - GetTerrainGenerator():获取地形生成器实例 | |||
|  | - GetGeneratedTerrainData():获取生成的地形数据 | |||
|  | ``` | |||
|  | 
 | |||
|  | ## 高级配置
 | |||
|  | 
 | |||
|  | ### 自定义地形映射
 | |||
|  | 
 | |||
|  | 可以在Details面板中编辑 `TerrainTileMappings` 数组,为每个地形标签指定对应的Tile索引: | |||
|  | 
 | |||
|  | ```cpp | |||
|  | // 示例:自定义地形映射 | |||
|  | FTerrainTileMapping CustomMapping; | |||
|  | CustomMapping.TerrainTag = FGameplayTag::RequestGameplayTag(TEXT("Terrain.Forest")); | |||
|  | CustomMapping.TileIndex = 10; // 使用TileSet中的第10个Tile | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 修改地形生成配置
 | |||
|  | 
 | |||
|  | 通过获取地形生成器实例,可以动态修改地形配置: | |||
|  | 
 | |||
|  | ```cpp | |||
|  | // 在蓝图中或代码中修改配置 | |||
|  | UTerrainGenerator* Generator = PaperTerrainMapActor->GetTerrainGenerator(); | |||
|  | Generator->SetProbability(ForestHandle, 0.9f); | |||
|  | Generator->SetWeight(ForestHandle, 8.0f); | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 动态生成地图
 | |||
|  | 
 | |||
|  | 可以在运行时动态生成不同尺寸的地图: | |||
|  | 
 | |||
|  | ```cpp | |||
|  | // 设置新尺寸 | |||
|  | PaperTerrainMapActor->MapWidth = 128; | |||
|  | PaperTerrainMapActor->MapHeight = 128; | |||
|  | 
 | |||
|  | // 重新生成地图 | |||
|  | PaperTerrainMapActor->GenerateTerrainMap(); | |||
|  | ``` | |||
|  | 
 | |||
|  | ## 性能优化
 | |||
|  | 
 | |||
|  | ### 地图尺寸建议
 | |||
|  | - 小地图:64x64 - 128x128(适合手机设备) | |||
|  | - 中地图:256x256(默认,平衡性能和细节) | |||
|  | - 大地图:512x512+(需要性能优化) | |||
|  | 
 | |||
|  | ### 生成时机
 | |||
|  | - 在加载界面预生成地图 | |||
|  | - 使用后台线程生成(需要自行实现线程逻辑) | |||
|  | - 支持渐进式生成和流式加载 | |||
|  | 
 | |||
|  | ## 调试功能
 | |||
|  | 
 | |||
|  | ### 日志输出
 | |||
|  | Actor会输出详细的生成日志: | |||
|  | - 地图初始化信息 | |||
|  | - 地形生成统计 | |||
|  | - TileMap应用结果 | |||
|  | 
 | |||
|  | ### 可视化调试
 | |||
|  | - 在编辑器中实时查看生成结果 | |||
|  | - 支持运行时重新生成 | |||
|  | - 可以随时清除和重新生成地图 | |||
|  | 
 | |||
|  | ## 集成示例
 | |||
|  | 
 | |||
|  | ### 与游戏逻辑集成
 | |||
|  | 
 | |||
|  | ```cpp | |||
|  | // 在GameMode中生成初始地图 | |||
|  | void ABusyGameMode::BeginPlay() | |||
|  | { | |||
|  |     Super::BeginPlay(); | |||
|  |      | |||
|  |     // 生成地图 | |||
|  |     APaperTerrainMapActor* MapActor = GetWorld()->SpawnActor<APaperTerrainMapActor>(); | |||
|  |     MapActor->GenerateTerrainMap(); | |||
|  |      | |||
|  |     // 保存地图引用 | |||
|  |     CurrentMap = MapActor; | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 与导航系统集成
 | |||
|  | 
 | |||
|  | 可以根据生成的地形数据设置导航网格: | |||
|  | 
 | |||
|  | ```cpp | |||
|  | // 根据地形类型设置导航成本 | |||
|  | 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,用于表现地形高度、装饰物等。 | |||
|  | 
 | |||
|  | ### 动态地形修改
 | |||
|  | 支持运行时修改特定位置的地形,用于表现建筑、道路等。 | |||
|  | 
 | |||
|  | ### 序列化支持
 | |||
|  | 添加地图数据的序列化功能,支持保存和加载生成的地图。 |