# unity **Repository Path**: jimbolix/unity ## Basic Information - **Project Name**: unity - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-05 - **Last Updated**: 2026-02-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Unity 中国地图六边形网格生成器 ## 项目简介 这是一个在Unity中生成真实中国地图的六边形(Hex)网格系统。系统使用简化的中国边界数据,通过六边形网格来呈现中国地图的轮廓。 ## 功能特性 - ✅ 完整的六边形坐标系统(Cube坐标系) - ✅ 基于真实中国地图轮廓的边界检测 - ✅ 可自定义的网格大小和密度 - ✅ 可调整的地图缩放和偏移 - ✅ 编辑器扩展,方便在Unity中操作 - ✅ 自动生成六边形网格Mesh - ✅ 支持自定义颜色和材质 - ✅ **真实地形生成**:根据中国地理位置生成名山、河流、森林等地形 - ✅ **鼠标跟随系统**:物体跟随鼠标在地图上移动 - ✅ **视野照明系统**:移动后周围一定范围变亮,类似战争迷雾效果 - ✅ **经纬度定位系统**:根据真实经纬度坐标在地图上标记位置 ## 文件结构 ``` Unity/ ├── HexCoordinates.cs # 六边形坐标系统 ├── HexCell.cs # 六边形单元格类 ├── HexGrid.cs # 六边形网格管理器 ├── ChinaMapGenerator.cs # 中国地图生成器 ├── TerrainType.cs # 地形类型系统 ├── ChinaTerrainGenerator.cs # 中国地形生成器 ├── MouseFollower.cs # 鼠标跟随物体 ├── FollowerObjectSetup.cs # 跟随物体设置助手 ├── GeoCoordinateConverter.cs # 经纬度坐标转换器 ├── LocationMarker.cs # 位置标记器 ├── GeoLocationMarker.cs # 地理位置标记物体 ├── GeoLocationDemo.cs # 地理定位演示 ├── Editor/ │ ├── ChinaMapGeneratorEditor.cs # 地图生成器编辑器扩展 │ └── GeoLocationDemoEditor.cs # 地理定位编辑器扩展 └── README.md # 本文档 ``` ## 安装步骤 ### 1. 导入脚本 将所有 `.cs` 文件复制到Unity项目的 `Assets/Scripts/` 目录下: - `HexCoordinates.cs` - `HexCell.cs` - `HexGrid.cs` - `ChinaMapGenerator.cs` 将 `ChinaMapGeneratorEditor.cs` 放入 `Assets/Editor/` 目录(如果没有该目录,请创建)。 ### 2. 创建材质 1. 在Project窗口右键 → Create → Material 2. 命名为 "HexMaterial" 3. 选择合适的Shader(推荐使用 Standard 或 Unlit/Color) 4. 设置材质颜色(可选) ### 3. 设置场景 1. 在Hierarchy窗口创建空GameObject:右键 → Create Empty 2. 命名为 "ChinaMapGenerator" 3. 在Inspector中添加组件: - 点击 "Add Component" → 搜索 "HexGrid" → 添加 - 点击 "Add Component" → 搜索 "ChinaMapGenerator" → 添加 ### 4. 配置组件 #### HexGrid 组件参数 在Inspector中配置HexGrid组件: | 参数 | 说明 | 推荐值 | |------|------|--------| | Grid Width | 网格宽度(横向六边形数量) | 100 | | Grid Height | 网格高度(纵向六边形数量) | 80 | | Hex Size | 单个六边形的大小 | 1.0 | | Hex Material | 六边形使用的材质 | 拖入创建的HexMaterial | #### ChinaMapGenerator 组件参数 在Inspector中配置ChinaMapGenerator组件: | 参数 | 说明 | 推荐值 | |------|------|--------| | Hex Grid | HexGrid组件引用 | 拖入同GameObject的HexGrid组件 | | China Color | 中国区域的颜色 | RGB(51, 153, 77) 绿色 | | Ocean Color | 海洋区域的颜色(当前未使用) | RGB(77, 128, 204) 蓝色 | | Map Scale | 地图缩放比例 | 10.0 | | Map Offset | 地图偏移量 | (0, 0) | ## 使用方法 ### 快速开始 1. 完成上述安装和配置步骤 2. 在Inspector中找到ChinaMapGenerator组件 3. 点击 **"生成中国地图"** 按钮 4. 等待几秒钟,地图将自动生成 ### 编辑器按钮说明 - **生成中国地图**:根据当前参数生成完整的中国地图六边形网格 - **清空地图**:删除所有已生成的六边形网格 ### 运行时生成 如果需要在游戏运行时生成地图,可以在代码中调用: ```csharp ChinaMapGenerator generator = GetComponent(); generator.GenerateMap(); ``` ## 参数调整指南 ### 调整地图大小 如果生成的地图太小或太大: 1. **调整 Map Scale**: - 增大值 → 地图变大 - 减小值 → 地图变小 - 推荐范围:5.0 - 20.0 2. **调整 Hex Size**: - 增大值 → 六边形变大,地图整体变大 - 减小值 → 六边形变小,地图更精细 - 推荐范围:0.5 - 2.0 ### 调整地图位置 如果地图位置不在视野中心: 1. **调整 Map Offset**: - X值:控制左右偏移 - Y值:控制上下偏移 - 例如:(-50, -40) 将地图向左下移动 2. **调整摄像机位置**: - 将Main Camera移动到地图上方 - 推荐位置:(50, 100, 50) - 推荐旋转:(90, 0, 0) 俯视角度 ### 调整网格密度 如果需要更精细或更粗糙的网格: 1. **调整 Grid Width 和 Grid Height**: - 增大值 → 更多六边形,更精细,但性能消耗更大 - 减小值 → 更少六边形,更粗糙,但性能更好 - 推荐比例:Width:Height ≈ 5:4 ## 常见问题 ### Q1: 生成的地图是空白的? **解决方案**: 1. 检查HexGrid组件的Hex Material是否已设置 2. 检查材质的Shader是否正确 3. 检查摄像机位置是否能看到地图 4. 尝试调整Map Scale参数(增大到15-20) ### Q2: 地图形状不像中国? **解决方案**: 1. 调整Map Scale参数,推荐值:10-15 2. 调整Map Offset参数,使地图居中 3. 增加Grid Width和Grid Height以获得更精细的轮廓 4. 当前使用的是简化版边界数据,可以根据需要修改ChinaMapGenerator.cs中的InitializeChinaBoundary方法 ### Q3: 生成地图时Unity卡顿? **解决方案**: 1. 减少Grid Width和Grid Height的值 2. 在运行时生成而不是编辑器中生成 3. 考虑使用对象池优化 4. 推荐配置:Width=80, Height=60 ### Q4: 如何修改地图颜色? **解决方案**: 1. 在ChinaMapGenerator组件中修改China Color参数 2. 或者修改Hex Material材质的颜色 3. 可以在代码中动态修改:`hexCell.SetColor(Color.red);` ## 技术说明 ### 六边形坐标系统 本系统使用 **Cube坐标系统**(立方体坐标系),这是处理六边形网格的标准方法: - 每个六边形由三个坐标表示:(X, Y, Z) - 满足约束条件:X + Y + Z = 0 - 便于计算六边形之间的距离和邻居关系 ### 边界检测算法 使用 **射线法(Ray Casting Algorithm)** 判断点是否在多边形内: 1. 从测试点向右发射一条射线 2. 计算射线与多边形边界的交点数量 3. 交点数为奇数 → 点在多边形内 4. 交点数为偶数 → 点在多边形外 ### 地图数据 - 中国边界数据是简化版本,包含约50个关键轮廓点 - 坐标基于经纬度的归一化值 - 可以根据需要添加更多边界点以提高精度 ## 性能优化建议 ### 1. 网格数量优化 ```csharp // 低配置设备 gridWidth = 60; gridHeight = 48; // 中等配置设备 gridWidth = 80; gridHeight = 64; // 高配置设备 gridWidth = 100; gridHeight = 80; ``` ### 2. 使用对象池 对于需要频繁生成/销毁地图的场景,建议实现对象池: ```csharp // 示例:重用六边形对象而不是销毁 cell.SetActive(false); // 而不是 Destroy(cell) ``` ### 3. 批处理优化 - 确保所有六边形使用相同的材质以启用批处理 - 考虑使用GPU Instancing - 可以将多个六边形合并为一个Mesh ## 扩展开发指南 ### 添加交互功能 为六边形添加点击事件: ```csharp public class HexCell : MonoBehaviour { void OnMouseDown() { Debug.Log($"点击了六边形: {Coordinates}"); SetColor(Color.yellow); } } ``` ### 添加省份数据 可以扩展系统以支持省份划分: ```csharp public class HexCell : MonoBehaviour { public string provinceName; // 省份名称 public int provinceId; // 省份ID } ``` ### 添加高度信息 为地图添加地形高度: ```csharp public class HexCell : MonoBehaviour { public float elevation; // 海拔高度 public void SetElevation(float height) { elevation = height; transform.position = new Vector3( transform.position.x, height, transform.position.z ); } } ``` ### 自定义边界数据 修改 `ChinaMapGenerator.cs` 中的 `InitializeChinaBoundary()` 方法: ```csharp private void InitializeChinaBoundary() { // 添加更多边界点以提高精度 chinaBoundary = new Vector2[] { new Vector2(x1, y1), new Vector2(x2, y2), // ... 更多点 }; } ``` ## API 参考 ### HexCoordinates ```csharp // 创建六边形坐标 HexCoordinates coords = new HexCoordinates(x, z); // 从偏移坐标创建 HexCoordinates coords = HexCoordinates.FromOffsetCoordinates(x, z); // 从世界坐标创建 HexCoordinates coords = HexCoordinates.FromPosition(worldPos, hexSize); // 转换为世界坐标 Vector3 worldPos = coords.ToPosition(hexSize); ``` ### HexCell ```csharp // 设置颜色 hexCell.SetColor(Color.red); // 设置激活状态 hexCell.SetActive(true); // 创建六边形网格 hexCell.CreateHexMesh(hexSize); ``` ### HexGrid ```csharp // 创建网格 hexGrid.CreateGrid(); // 获取指定坐标的单元格 HexCell cell = hexGrid.GetCell(coordinates); // 清空网格 hexGrid.ClearGrid(); ``` ### ChinaMapGenerator ```csharp // 生成地图 chinaMapGenerator.GenerateMap(); ``` ## 地形生成和鼠标跟随功能 ### 功能概述 系统现在支持: 1. **真实地形生成**:根据中国真实地理位置生成名山(喜马拉雅、昆仑山等)、河流(长江、黄河等)、森林、沙漠等地形 2. **鼠标跟随物体**:创建一个物体跟随鼠标在地图上移动 3. **视野照明系统**:物体移动后,周围一定范围的六边形会变亮,类似战争迷雾效果 ### 设置步骤 #### 1. 添加地形生成组件 在已有的ChinaMapGenerator GameObject上: 1. 添加 `ChinaTerrainGenerator` 组件 2. 在ChinaMapGenerator组件中: - 将 `Terrain Generator` 字段拖入刚添加的ChinaTerrainGenerator组件 - 勾选 `Use Terrain Generation` 选项 #### 2. 创建鼠标跟随物体 1. 在Hierarchy中创建空GameObject,命名为"MouseFollower" 2. 添加以下组件: - `MouseFollower` 组件 - `FollowerObjectSetup` 组件 3. 配置MouseFollower组件: - `Hex Grid`:拖入场景中的HexGrid组件 - `Main Camera`:拖入Main Camera(通常会自动检测) - `Vision Range`:设置视野范围(推荐值:3-5) - `Bright Intensity`:照亮强度(推荐值:1.0) - `Dark Intensity`:黑暗强度(推荐值:0.3) #### 3. 添加碰撞体(重要) 为了让鼠标能够检测到地图,需要给六边形添加碰撞体: 1. 在HexCell预制体或脚本中添加MeshCollider 2. 或者在场景中创建一个大的平面碰撞体作为地面 ### 地形类型说明 系统包含以下地形类型: | 地形类型 | 颜色 | 海拔 | 代表区域 | |---------|------|------|---------| | 平原 | 浅黄色 | 0 | 华北平原、长江中下游平原 | | 山脉 | 棕色 | 2.0 | 喜马拉雅山、昆仑山、天山、秦岭 | | 河流 | 蓝色 | -0.2 | 长江、黄河、珠江、黑龙江 | | 森林 | 深绿色 | 0.3 | 东北森林、西南森林、秦岭森林 | | 沙漠 | 沙黄色 | 0.1 | 塔克拉玛干沙漠、戈壁沙漠 | | 草原 | 浅绿色 | 0 | 内蒙古草原 | ### 使用效果 运行游戏后: - 地图会根据真实地理位置显示不同颜色的地形 - 移动鼠标,黄色球体会跟随鼠标在地图上移动 - 球体周围的六边形会变亮,形成视野效果 - 远离球体的六边形会变暗 ## 经纬度定位功能 ### 功能概述 系统支持根据真实的经纬度坐标在地图上标记位置,可以: 1. **输入经纬度**:输入真实的纬度和经度坐标 2. **自动定位**:系统自动将经纬度转换为地图坐标 3. **可视化标记**:在对应位置显示标记物体 4. **城市快捷标记**:内置14个主要城市的坐标数据 ### 坐标范围 中国地图的经纬度范围: - **经度**:73.5°E - 135°E(东经) - **纬度**:18°N - 53.5°N(北纬) ### 设置步骤 #### 1. 添加位置标记组件 在场景中创建空GameObject,命名为"LocationMarker": 1. 添加 `LocationMarker` 组件 2. 配置组件: - `Hex Grid`:拖入HexGrid组件 - `Map Generator`:拖入ChinaMapGenerator组件 - `Marker Prefab`:可选,拖入自定义标记预制体 - `Highlight Color`:标记高亮颜色(默认黄色) #### 2. 添加演示组件(可选) 在同一GameObject上添加 `GeoLocationDemo` 组件: - `Location Marker`:拖入LocationMarker组件 - `Auto Mark Cities`:勾选后自动标记主要城市 - `Mark On Start`:勾选后启动时自动标记 ### 使用方法 #### 方法1:使用编辑器界面(推荐) 1. 选中带有GeoLocationDemo组件的GameObject 2. 在Inspector中可以看到自定义按钮: - **标记主要城市**:一键标记所有内置城市 - **北京/上海**:快速标记单个城市 - **自定义位置标记**:输入经纬度标记任意位置 - **测试坐标转换**:测试经纬度转换功能 - **清除所有标记**:移除所有标记 #### 方法2:使用代码 ```csharp // 获取LocationMarker组件 LocationMarker marker = GetComponent(); // 方法1:根据经纬度标记 marker.AddMarker("北京", 39.9f, 116.4f); // 方法2:根据城市名标记 marker.AddMarkerByCity("上海"); // 移除标记 marker.RemoveMarker("北京"); // 清除所有标记 marker.ClearAllMarkers(); ``` ### 内置城市坐标 系统内置了14个主要城市的坐标: | 城市 | 纬度 | 经度 | 英文名 | |------|------|------|--------| | 北京 | 39.9°N | 116.4°E | Beijing | | 上海 | 31.2°N | 121.5°E | Shanghai | | 广州 | 23.1°N | 113.3°E | Guangzhou | | 深圳 | 22.5°N | 114.1°E | Shenzhen | | 成都 | 30.7°N | 104.1°E | Chengdu | | 西安 | 34.3°N | 108.9°E | Xian | | 武汉 | 30.6°N | 114.3°E | Wuhan | | 重庆 | 29.6°N | 106.5°E | Chongqing | | 杭州 | 30.3°N | 120.2°E | Hangzhou | | 南京 | 32.1°N | 118.8°E | Nanjing | | 天津 | 39.1°N | 117.2°E | Tianjin | | 哈尔滨 | 45.8°N | 126.6°E | Harbin | | 乌鲁木齐 | 43.8°N | 87.6°E | Urumqi | | 拉萨 | 29.7°N | 91.1°E | Lhasa | ### API参考 #### GeoCoordinateConverter(静态类) ```csharp // 将经纬度转换为归一化坐标(0-1) Vector2 normalized = GeoCoordinateConverter.LatLonToNormalized(latitude, longitude); // 将经纬度转换为地图坐标 Vector2 mapCoords = GeoCoordinateConverter.LatLonToMapCoordinates(latitude, longitude, mapScale, mapOffset); // 将经纬度转换为六边形坐标 HexCoordinates hexCoords = GeoCoordinateConverter.LatLonToHexCoordinates(latitude, longitude, mapScale, mapOffset, hexSize); // 验证坐标是否在中国范围内 bool isValid = GeoCoordinateConverter.IsInChinaRange(latitude, longitude); // 获取城市坐标 Vector2 coords = GeoCoordinateConverter.GetCityCoordinates("北京"); // 返回 (纬度, 经度) ``` 1. **坐标系统**:Unity使用左手坐标系,Y轴向上 2. **性能考虑**:大量六边形会影响性能,建议在移动设备上减少网格数量 3. **边界数据**:当前使用的是简化版中国边界,不包含岛屿和精确边界 4. **材质设置**:确保材质的Shader支持颜色修改 5. **编辑器模式**:在编辑器中生成大量对象可能导致卡顿,建议在运行时生成 ## 系统要求 - Unity 2019.4 或更高版本 - 支持 .NET 4.x 或更高版本 ## 版本历史 - **v3.0.0** (2026-02-05) - 新增经纬度定位系统 - 支持根据真实经纬度坐标标记位置 - 内置14个主要城市坐标数据 - 提供经纬度转换API - 新增地理定位编辑器扩展 - **v2.0.0** (2026-02-05) - 新增真实地形生成系统 - 新增鼠标跟随物体功能 - 新增视野照明系统 - 支持名山、河流、森林、沙漠等地形类型 - 六边形支持高度和亮度调整 - **v1.0.0** (2026-02-05) - 初始版本 - 基础六边形网格系统 - 简化版中国地图边界 - 编辑器扩展支持 ## 许可证 本项目代码可自由使用和修改。 ## 贡献 欢迎提交问题和改进建议。 --- **祝你使用愉快!** 🎮