本文章主要工作是六边形网格的绘制,可以用来制作地图功能。

先来看一下这样的图:

如图所示。六边形有6个方向,6个顶点,同时定义中心点到边的最短距离为内径innerRadius,定义中心点到顶点的距离为外径outerRadius。

六边形可以拆分为6个等边三角形,所以很容易得出:

定义游戏中六边形的边长(即外径)为1

HexMetrics类代码实现:

public static class HexMetrics{/// <summary>/// 外径,中心到顶点距离/// </summary>public const float outerRadius = 10f;/// <summary>/// 内径,中心到边距离,0.866025404为二分之根号三的近似值/// </summary>//Mathf.Sin(60) = 0.866025404;public const float innerRadius = outerRadius * 0.866025404f;/// <summary>/// 六边形的六个顶点坐标/// </summary>public static readonly Vector3[] corners = {new Vector3(0f, 0f, outerRadius),new Vector3(innerRadius,0f,0.5f*outerRadius),new Vector3(innerRadius,0f,-0.5f*outerRadius),new Vector3(0f,0f,-outerRadius),new Vector3(-innerRadius,0f,-0.5f*outerRadius),new Vector3(-innerRadius,0f,0.5f*outerRadius),new Vector3(0f, 0f, outerRadius),};}

绘制三角形的时候代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum HexDirection{NE,E,SE,SW,W,NW,}
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider))]
public class HexCell : MonoBehaviour
{private Mesh mesh;private List<Vector3> vertices;private List<int> triangles;private void Awake(){GetComponent<MeshFilter>().mesh = mesh = GetComponent<MeshCollider>().sharedMesh = new Mesh();GetComponent<MeshCollider>().convex = true;mesh.name = "Hex Cell";vertices = new List<Vector3>();triangles = new List<int>();Draw();}// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}/// <summary>/// 绘制地形/// </summary>public void Draw(){Clear();Vector3 center = Vector3.zero;for (HexDirection dir = HexDirection.NE; dir <= HexDirection.NW; dir++){AddTriangle(center,HexMetrics.corners[(int)dir],HexMetrics.corners[(int)dir + 1]);}UpdateMesh();}/// <summary>/// 清空mesh数据/// </summary>private void Clear(){mesh.Clear();vertices.Clear();triangles.Clear();}/// <summary>/// 绘制mesh数据/// </summary>private void UpdateMesh(){mesh.vertices = vertices.ToArray();mesh.triangles = triangles.ToArray();mesh.RecalculateNormals();mesh.RecalculateBounds();}/// <summary>/// 添加三角形。/// </summary>/// <param name="v1"></param>/// <param name="v2"></param>/// <param name="v3"></param>private void AddTriangle(Vector3 v1, Vector3 v2, Vector3 v3){int count = triangles.Count;vertices.Add(v1);triangles.Add(count++);vertices.Add(v2);triangles.Add(count++);vertices.Add(v3);triangles.Add(count++);}}

在unity中随便挂在一个空对象上。就可以生成如下图:

接下来是构建地图网格:

从上图可以看出来如下规律:


1.同一行的相邻六边形的间距为2个内径的距离

2.两列六边形,在纵坐标上相差1.5个外径的距离

3.列数为奇数的六边形在横坐标上,会向右偏移1个内径的距离。

所以我们可以通过如下方式将队列上的坐标(x,y)转换为空间上的坐标:

    private Vector3 GetPos(int x, int y){float posX = x;float posY = y;if ((y & 1) != 0){posX += 0.5f;}Vector3 pos = new Vector3(2f * posX * HexMetrics.innerRadius, 0f, 1.5f * posY * HexMetrics.outerRadius);return pos;}

最后完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Train : MonoBehaviour {public int col = 10;public int row = 10;private Vector3 GetPos(int x, int y){float posX = x;float posY = y;if ((y & 1) != 0){posX += 0.5f;}Vector3 pos = new Vector3(2f * posX * HexMetrics.innerRadius, 0f, 1.5f * posY * HexMetrics.outerRadius);return pos;}// Use this for initializationvoid Start () {for (int i = 0; i < col; i++) {for (int j = 0; j < row; j++){Vector3 pos =  GetPos(i, j);GameObject Plane = GameObject.CreatePrimitive(PrimitiveType.Plane);Plane.AddComponent<HexCell>();Plane.transform.position = pos;Plane.GetComponent<MeshRenderer>().material.color = new Color(i / col, (i + j) / (col + row), j / row);}}}}

运行一下,我们就可以得到下面图片:

[个人学习博客谢谢关注](www.taoqy666.com)

SLG游戏中绘制六边形网格地形相关推荐

  1. 棋盘类游戏中的栅格地形渲染

    棋盘类游戏中的栅格地形渲染 张嘉华 梁成 李桂清 (华南理工大学计算机科学与工程学院 广东 广州 510640) 摘要:本文提出了适合战棋类游戏的三维栅格地形渲染策略,把Catmull-Clark细分 ...

  2. unity gizmo在游戏中绘制_world machine中文版下载_三维游戏地形软件pc版免费下载3.3026...

    world machine(3d地形图软件)是一款专业的3D地形制作软件,World Machine 混合了强大的地形效果,拥有图形界面 ,并能快速动态预览,帮助快速准确地创造出各种真实地貌,无论是制 ...

  3. 游戏中随机地图的实现

    游戏中随机地图的实现 很多游戏都用到了随机地图,比如矮人要塞,CDDA,MineCraft,RimWorld. 随机地图带给游戏更多的趣味性,每一次新建游戏都有不同的体验. 一般游戏中生成随机地形都是 ...

  4. State of Survival,SLG游戏出海的又一佳作

    2020年末,又有一款SLG游戏在海外取得了不菲的成绩.由FunPlus发行的末日生存题材SLG游戏State of Survival(以下简称SOS),这款游戏2020年8月上线,11月冲击到中国手 ...

  5. 游戏开发入门(八)游戏中的场景管理

    视频链接:游戏开发入门(八)游戏中的场景管理(5节课 时常:约2小时07分钟) 授课者通过2D围棋的例子,逐步拓展成3D的虚拟游戏世界.这个3D游戏世界基本上就可以涵盖市面上所有类型的游戏了,我们通过 ...

  6. 游戏中的三角学——Sprite Kit 和 Swift 教程(2)

    原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 2/2 原文作者 : Nick Lockwood 译文出自 : ...

  7. 从零开始做一个SLG游戏(一):六边形网格

    本文的主要工作是六边形网格的绘制. 如图所示.六边形有6个方向,6个顶点,同时定义中心点到边的最短距离为内径innerRadius,定义中心点到顶点的距离为外径outerRadius. 六边形可以拆分 ...

  8. 从零开始做一个SLG游戏(二):用mesh实现简单的地形

    本文主要是用mesh实现简单的地形.暂时先绘制三种地形:高山.平原.水域. 首先要做的是网格的细化: 上一篇已经实现了单个六边形的绘制,实现方式是将六边形分割成6个等边三角形,然后分别绘制. 现在需要 ...

  9. 《孤岛惊魂5》游戏中的地形渲染技术-网格生成

    育碧作为一个年货大厂,在PCG这方面肯定有很深的积累,在GDC2018的这次分享中,其详细的介绍了地形在纯GPU管线上的实现方式,使得最终能够得到一个拥有大片悬崖峭壁的真实地形. 本文是笔者看完Far ...

  10. Games104笔记---LE6--渲染系统3:游戏中的地形/天空/云渲染

    目录 地形几何 高度图: 自适应网格细分 几个原则: 网格细分的方法: 实时变形的地形: 体素化: Marching Cubes算法: 地形着色: 存储内容: 地形纹理采样: 正确的过渡算法: 凹凸/ ...

最新文章

  1. 科研项目:机器学习在场景中的应用!
  2. 【c语言】蓝桥杯算法提高 3-2求存款
  3. Linux中执行shell脚本的4种方法
  4. java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java
  5. 电子计算机系统可以分为几类,电子计算机分为两大类.doc
  6. 初探Java设计模式1:创建型模式(工厂,单例等)
  7. Team Foundation Server的回滚操作
  8. PRML-系列一之1.2
  9. R语言学习笔记(四)参数估计
  10. python日志分割(转)
  11. 如何备份linux,如何备份Linux系统
  12. Jersey框架简单实践(一)
  13. 百度坐标拾取html,使用百度批量拾取坐标点-汇总
  14. 超女复活赛,明星大补考
  15. 心语收集9:如何强大,你仍然是我的弱点。
  16. ECMAScript标准命名
  17. Linux配置文件-limits.conf
  18. 清华大学镜像站miniconda下载地址
  19. VBA编程图表(二十一)
  20. cad重新加载php命令,cad清理图层命令如何使用

热门文章

  1. Spring Boot自定义starter必知必会条件
  2. Simulink代码生成: Switch模块及其代码
  3. 2020软科中国计算机学科排名,【智库数据】基于2020软科中国最好学科排名的学科动态发展跟踪...
  4. Spring boot(三):Web 进阶
  5. [ROS]一些传感器数据读取融合问题的思考
  6. 美丽的往生者-让自己慢下来(34)
  7. 配置VRRP负载分担
  8. 软件测试常用工具有哪些
  9. Let's Encrypt申请证书-保姆教程
  10. 如何能够快速提升自己的工作能力?