150 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # 地形生成器使用说明
 | ||
| 
 | ||
| ## 概述
 | ||
| 
 | ||
| 这个地形生成器实现了基于区域生长算法和柏林噪声的随机地图生成系统,支持复杂的地形父子关系、概率权重配置和互斥关系。
 | ||
| 
 | ||
| ## 核心功能
 | ||
| 
 | ||
| ### 1. 地形父子关系
 | ||
| - 支持多层级父子关系(类似B+树结构)
 | ||
| - 父节点不出现时,所有子节点都不出现
 | ||
| - 支持祖孙关系处理
 | ||
| 
 | ||
| ### 2. 概率和权重配置
 | ||
| - 概率 (0-1):控制地形是否出现
 | ||
| - 权重 (≥0):控制地形在出现时的面积占比
 | ||
| - 权重为0表示不生成该地形
 | ||
| 
 | ||
| ### 3. 互斥关系
 | ||
| - 支持多个地形之间的互斥关系
 | ||
| - 互斥的地形不会同时出现
 | ||
| - 支持复杂的互斥组配置
 | ||
| 
 | ||
| ### 4. 生成算法
 | ||
| - **区域生长算法**:生成连续的地形区域
 | ||
| - **柏林噪声**:用于地形边界平滑和自然过渡
 | ||
| - 支持自定义地图大小(默认256x256)
 | ||
| 
 | ||
| ## 基本用法
 | ||
| 
 | ||
| ### C++ 使用示例
 | ||
| 
 | ||
| ```cpp
 | ||
| // 创建生成器实例
 | ||
| UTerrainGenerator* Generator = NewObject<UTerrainGenerator>();
 | ||
| 
 | ||
| // 添加地形
 | ||
| int32 ForestHandle = Generator->AddTerrain(FGameplayTag::RequestGameplayTag(TEXT("Terrain.Forest")));
 | ||
| int32 GrasslandHandle = Generator->AddTerrain(FGameplayTag::RequestGameplayTag(TEXT("Terrain.Grassland")));
 | ||
| 
 | ||
| // 设置概率和权重
 | ||
| Generator->SetProbability(ForestHandle, 0.8f);
 | ||
| Generator->SetWeight(ForestHandle, 9.0f);
 | ||
| 
 | ||
| // 生成地图
 | ||
| TArray<FGameplayTag> Map = Generator->GenerateMap(256, 256);
 | ||
| ```
 | ||
| 
 | ||
| ### 蓝图使用示例
 | ||
| 
 | ||
| 1. 在蓝图中调用 `CreateTerrainGenerator` 创建实例
 | ||
| 2. 调用 `SetupExampleTerrainConfig` 快速设置示例配置
 | ||
| 3. 调用 `Generate2DMap` 生成二维地图数组
 | ||
| 4. 使用 `GetTerrainDisplayName` 获取地形显示名称
 | ||
| 
 | ||
| ## 地形标签配置
 | ||
| 
 | ||
| 需要在项目的GameplayTags设置中配置以下地形标签:
 | ||
| 
 | ||
| ```ini
 | ||
| [GameplayTags]
 | ||
| +GameplayTagList=(Tag="Terrain.Forest")
 | ||
| +GameplayTagList=(Tag="Terrain.Grassland") 
 | ||
| +GameplayTagList=(Tag="Terrain.Water")
 | ||
| +GameplayTagList=(Tag="Terrain.Swamp")
 | ||
| +GameplayTagList=(Tag="Terrain.Land")
 | ||
| +GameplayTagList=(Tag="Terrain.Swamp.Land")
 | ||
| +GameplayTagList=(Tag="Terrain.Swamp.Water")
 | ||
| +GameplayTagList=(Tag="Terrain.Water.Shallow")
 | ||
| +GameplayTagList=(Tag="Terrain.Water.Deep")
 | ||
| ```
 | ||
| 
 | ||
| ## 高级配置
 | ||
| 
 | ||
| ### 父子关系绑定
 | ||
| 
 | ||
| ```cpp
 | ||
| // 添加父地形和子地形
 | ||
| int32 SwampHandle = Generator->AddTerrain(SwampTag);
 | ||
| int32 SwampLandHandle = Generator->AddTerrain(SwampLandTag);
 | ||
| int32 SwampWaterHandle = Generator->AddTerrain(SwampWaterTag);
 | ||
| 
 | ||
| // 绑定父子关系
 | ||
| Generator->BindChildTerrain(SwampHandle, {SwampLandHandle, SwampWaterHandle});
 | ||
| ```
 | ||
| 
 | ||
| ### 互斥关系设置
 | ||
| 
 | ||
| ```cpp
 | ||
| // 设置森林和沼泽水域互斥
 | ||
| Generator->SetExclusive({ForestHandle, SwampWaterHandle});
 | ||
| ```
 | ||
| 
 | ||
| ### 复杂权重配置
 | ||
| 
 | ||
| ```cpp
 | ||
| // 设置沼泽子地形的权重比例
 | ||
| Generator->SetWeight(SwampLandHandle, 1.0f);  // 沼泽陆地占沼泽区域的1/3
 | ||
| Generator->SetWeight(SwampWaterHandle, 2.0f); // 沼泽水域占沼泽区域的2/3
 | ||
| ```
 | ||
| 
 | ||
| ## 性能考虑
 | ||
| 
 | ||
| - 地图生成可以在后台线程中进行
 | ||
| - 256x256地图生成时间约100-500ms(取决于硬件)
 | ||
| - 建议在游戏加载时预生成地图
 | ||
| - 支持渐进式生成和流式加载
 | ||
| 
 | ||
| ## 调试和测试
 | ||
| 
 | ||
| ### 控制台命令
 | ||
| 
 | ||
| ```bash
 | ||
| # 在控制台中输入以下命令测试生成器
 | ||
| TestTerrainGenerator
 | ||
| ```
 | ||
| 
 | ||
| ### 日志输出
 | ||
| 
 | ||
| 生成器会输出详细的统计信息:
 | ||
| - 各地形类型的数量和百分比
 | ||
| - 互斥关系验证结果
 | ||
| - 父子关系验证结果
 | ||
| 
 | ||
| ## 自定义扩展
 | ||
| 
 | ||
| ### 添加新的地形类型
 | ||
| 
 | ||
| 1. 在GameplayTags配置中添加新标签
 | ||
| 2. 使用 `AddTerrain` 添加新地形
 | ||
| 3. 配置相应的概率和权重
 | ||
| 
 | ||
| ### 修改生成算法
 | ||
| 
 | ||
| 可以重写以下方法来自定义生成行为:
 | ||
| - `RegionGrowing`: 区域生长算法实现
 | ||
| - `ApplyPerlinNoiseSmoothing`: 噪声平滑处理
 | ||
| - `GetValidLeafNodes`: 有效节点筛选逻辑
 | ||
| 
 | ||
| ## 注意事项
 | ||
| 
 | ||
| 1. **概率为0**:地形绝对不会出现,所有子节点也不会出现
 | ||
| 2. **权重为0**:地形不会生成,但可能影响互斥关系
 | ||
| 3. **互斥组**:多次调用SetExclusive不会传导互斥关系
 | ||
| 4. **生成失败**:如果没有有效地形可以生成,会返回空地图并输出错误日志
 | ||
| 
 | ||
| ## 示例配置
 | ||
| 
 | ||
| 参考 `SetupExampleTerrainConfig` 方法中的配置,包含了完整的父子关系、概率权重和互斥关系设置。
 |