SLG游戏中绘制六边形网格地形
本文章主要工作是六边形网格的绘制,可以用来制作地图功能。
先来看一下这样的图:
如图所示。六边形有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)转换为空间上的坐标:
|
最后完整代码:
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游戏中绘制六边形网格地形相关推荐
- 棋盘类游戏中的栅格地形渲染
棋盘类游戏中的栅格地形渲染 张嘉华 梁成 李桂清 (华南理工大学计算机科学与工程学院 广东 广州 510640) 摘要:本文提出了适合战棋类游戏的三维栅格地形渲染策略,把Catmull-Clark细分 ...
- unity gizmo在游戏中绘制_world machine中文版下载_三维游戏地形软件pc版免费下载3.3026...
world machine(3d地形图软件)是一款专业的3D地形制作软件,World Machine 混合了强大的地形效果,拥有图形界面 ,并能快速动态预览,帮助快速准确地创造出各种真实地貌,无论是制 ...
- 游戏中随机地图的实现
游戏中随机地图的实现 很多游戏都用到了随机地图,比如矮人要塞,CDDA,MineCraft,RimWorld. 随机地图带给游戏更多的趣味性,每一次新建游戏都有不同的体验. 一般游戏中生成随机地形都是 ...
- State of Survival,SLG游戏出海的又一佳作
2020年末,又有一款SLG游戏在海外取得了不菲的成绩.由FunPlus发行的末日生存题材SLG游戏State of Survival(以下简称SOS),这款游戏2020年8月上线,11月冲击到中国手 ...
- 游戏开发入门(八)游戏中的场景管理
视频链接:游戏开发入门(八)游戏中的场景管理(5节课 时常:约2小时07分钟) 授课者通过2D围棋的例子,逐步拓展成3D的虚拟游戏世界.这个3D游戏世界基本上就可以涵盖市面上所有类型的游戏了,我们通过 ...
- 游戏中的三角学——Sprite Kit 和 Swift 教程(2)
原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 2/2 原文作者 : Nick Lockwood 译文出自 : ...
- 从零开始做一个SLG游戏(一):六边形网格
本文的主要工作是六边形网格的绘制. 如图所示.六边形有6个方向,6个顶点,同时定义中心点到边的最短距离为内径innerRadius,定义中心点到顶点的距离为外径outerRadius. 六边形可以拆分 ...
- 从零开始做一个SLG游戏(二):用mesh实现简单的地形
本文主要是用mesh实现简单的地形.暂时先绘制三种地形:高山.平原.水域. 首先要做的是网格的细化: 上一篇已经实现了单个六边形的绘制,实现方式是将六边形分割成6个等边三角形,然后分别绘制. 现在需要 ...
- 《孤岛惊魂5》游戏中的地形渲染技术-网格生成
育碧作为一个年货大厂,在PCG这方面肯定有很深的积累,在GDC2018的这次分享中,其详细的介绍了地形在纯GPU管线上的实现方式,使得最终能够得到一个拥有大片悬崖峭壁的真实地形. 本文是笔者看完Far ...
- Games104笔记---LE6--渲染系统3:游戏中的地形/天空/云渲染
目录 地形几何 高度图: 自适应网格细分 几个原则: 网格细分的方法: 实时变形的地形: 体素化: Marching Cubes算法: 地形着色: 存储内容: 地形纹理采样: 正确的过渡算法: 凹凸/ ...
最新文章
- 科研项目:机器学习在场景中的应用!
- 【c语言】蓝桥杯算法提高 3-2求存款
- Linux中执行shell脚本的4种方法
- java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java
- 电子计算机系统可以分为几类,电子计算机分为两大类.doc
- 初探Java设计模式1:创建型模式(工厂,单例等)
- Team Foundation Server的回滚操作
- PRML-系列一之1.2
- R语言学习笔记(四)参数估计
- python日志分割(转)
- 如何备份linux,如何备份Linux系统
- Jersey框架简单实践(一)
- 百度坐标拾取html,使用百度批量拾取坐标点-汇总
- 超女复活赛,明星大补考
- 心语收集9:如何强大,你仍然是我的弱点。
- ECMAScript标准命名
- Linux配置文件-limits.conf
- 清华大学镜像站miniconda下载地址
- VBA编程图表(二十一)
- cad重新加载php命令,cad清理图层命令如何使用