unity之二维数组实现正六边形地图

本文介绍如何使用Unity游戏引擎,通过二维数组技术构建正六边形地图。通过分析正六边形相邻位置的坐标规律,确定X和Y坐标的计算方式,从而实现地图的布局。详细讲解了X轴坐标根据Y值的偏移量计算,以及Y轴坐标的简单递增规律。最后提供了实现这一功能的完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目有个需求,需要实现的效果如下:
image.png
左右上下相邻正六边形的位置坐标如下:
在这里插入图片描述

分析:
一行中,两个相邻六边形相差80,假设第一个x坐标为0,则下一个相邻六边形的x值为:

(x-1)*80

上下相邻两个六边形的X值相差-40,两两一循环,因此,可以用y值来确定X的偏移量:

local offX = y%2 == 0 and -40 or 0

最终x的坐标为:

local offX = y%2 == 0 and -40 or 0
(x-1)*80+offX

X的坐标确定啦,Y坐标就更简单了,上下两个相邻的y差值为70,假设第一个y坐标为0,则,对应的其他y坐标为:

(y-1)*70

最终,每个正六边形的坐标也就确定了,为:

local offX = y%2 == 0 and -40 or 0
go.transform.localPosition = Vector3.New((x-1)*80+offX,(y-1)*70,0)

完整代码如下:

ui.list = base:findobj("list")
ui.item = base:findobj("item")

local function RefreshUI()
    local length = 8--长
    local width = 4--宽
    local itemList
### UNITY二维数组的使用方法示例教程 在 Unity 开发中,二维数组是一种常见的数据结构,用于存储多度的数据集合。以下是关于如何在 Unity 中声明、初始化和操作二维数组的具体说明。 #### 声明初始化 在 C# 中,可以通过以下方式声明并初始化一个二维数组: ```csharp // 定义一个大小固定的二维数组 (3 行 4 列) int[,] fixedArray = new int[3, 4]; // 初始化固定大小的二维数组 fixedArray[0, 0] = 1; fixedArray[0, 1] = 2; // 动态分配内存的方式创建二维数组 int COLUMN = 4; // 列数 int RANK = 3; // 行数 int[,] dynamicArray = new int[RANK, COLUMN]; for (int i = 0; i < RANK; ++i) { for (int j = 0; j < COLUMN; ++j) { dynamicArray[i, j] = i * j; // 设置初始值 } } ``` 上述代码展示了两种不同的二维数组定义方式:一种是静态大小的二维数组 `fixedArray`;另一种则是通过循环动态赋值的二维数组 `dynamicArray`[^1]。 #### 在 Unity Inspector 中可视化二维数组 为了便于调试和开发,可以借助插件工具 Array2DEditor 来实现二维数组的直观编辑功能。安装该插件后,开发者能够在 Unity 的 Inspector 面板上直接修改二维数组的内容而不需要手动编码调整每一个元素[^3][^4]。 例如,假设有一个脚本类如下所示: ```csharp using UnityEngine; public class Example : MonoBehaviour { public int[,] gridData = new int[5, 5]; // 创建一个 5x5 的整型网格 void Start() { Debug.Log("Grid Data:"); PrintGrid(gridData); } private void PrintGrid(int[,] array) { string output = ""; foreach(var item in array){ output += $"{item} "; } Debug.Log(output.Trim()); } } ``` 当此脚本附加到某个 GameObject 上时,如果已配置好 Array2DEditor 插件,则会在场景视图下的组件属性区域显示可交互式的表格形式来表示这个变量 `gridData`。 #### 访问遍历二维数组 对于任何类型的二维数组来说,都可以利用双重嵌套循环来进行逐项访问或者整体打印输出等操作: ```csharp void TraverseAndPrint(int[,] matrix) { int rows = matrix.GetLength(0); // 获取行的数量 int cols = matrix.GetLength(1); // 获取列的数量 for (int rowIdx = 0; rowIdx < rows; ++rowIdx) { System.Text.StringBuilder sbuilder = new(); for (int colIdx = 0; colIdx < cols; ++colIdx) { sbuilder.Append(matrix[rowIdx,colIdx].ToString()).Append(' '); } Debug.Log(sbuilder.ToString().TrimEnd()); } } ``` 这段函数接受任意尺寸的整形矩阵作为参数,并将其按照行优先顺序逐一读取出来并通过控制台记录下来. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值