在Unity中实现2D十六进制/等距网格系统的最佳方法(对于复杂的图块?

问题描述 投票:0回答:1

我正在尝试为2D游戏创建网格系统。不完全确定我要使用六边形网格还是等距网格,但这在这里应该没有太大关系。基本上,我正在尝试创建一个塔防游戏,在其中部署单位而不是塔,并可以像在玩战术游戏一样移动它们。问题是瓷砖本身会很复杂-将会有不同类型的地形。有些单元只能部署在X中,而不能通过Y。我还需要能够随意向这些图块添加一些逻辑的能力-谁知道,也许我想要一个特殊的图块来为其上方的单位提供额外的攻击范围,这种事情。游戏还必须像网格一样“感觉”-使事物贴紧瓷砖的中心,并在悬停时以及移动/攻击时突出显示瓷砖。

Isometric exampleHex-grid example

好的,这使我引出了一条非常明显的路线:我可以为所需的不同类型的瓷砖创建预制件,添加所有属性和逻辑作为脚本组件,并创建一个实例化世界上每个瓷砖的网格类。这很好用,因为这样我就可以完全控制所有内容-我可以对图块进行任何操作,而且我可以在实例化它们时为它们的位置创建一个2D矩阵。例如,通过这种方式,我可以调用tile [3,6],这听起来对路径,突出显示等来说都是一笔大数目。我还可以将位于其上方的任何游戏对象链接到图块本身,因此我可以调用诸如tile [6,2] .ObjectOnTop。〜WhateverInfoINeedFromIt之类的东西,这对于整体逻辑来说也非常方便。

但是缺点也很可怕-我如何设计和部署不同级别的设计?我能想到的唯一方法是想出一种方法来手动完成所有操作,以某种方式将信息导出到json文件,并让实例化所有内容的grid类选择要在json信息的基础上实例化哪个tile。 。我不仅不知道如何实际实现它,而且我认为对于应该是自然的东西,这将是荒谬的工作。我也不确定每个图块的游戏对象在性能方面是否是个好主意。最大的问题?如果是简单的正方形瓷砖网格,创建这样的网格很容易-但是,当我们开始谈论六边形和等距网格时,说实话,这并不是那么容易。复杂的形状使其很难使用这种东西。例如,如何将鼠标位置转换为等效的图块?正方形非常容易...剩下的就不那么多了。还很糟,网格只有在游戏运行时才真正部署(这通常被认为是我应该避免的坏事,顺便说一句?)。

但请放心,因为我找到了解决方案:图块!当然!它可以解决我遇到的所有问题,对吗?可以,但它也消除了预制件所具有的全部功能。现在,我无法使用图块的任何逻辑...它们无法存储任何属性...所以我想我注定了。我已经阅读了一些有关克服此问题的方法(预制笔刷,Tile固有的自定义类,为每种tile类型制作一个tilemap),但说实话,它们非常利基,只是感觉不合适。

太奇怪了,像这样的通用网格系统应该是如此简单和普遍。但是我几乎找不到任何信息。就像我缺少了这个非常明显的工具,似乎没人提到它,因为它是如此明显。因此,我在这里努力地开始一个项目,因为我什至无法弄清楚如何实现游戏的基本结构。我在网上看到的所有内容都会将我引导至图块地图-但据我了解,它们仅适用于非常基本的内容。我认为我不会为这种游戏工作。我现在不知道该怎么做-必须有一种解决所有问题的最佳方法,这种方法很可能适用于所有从事此类游戏的开发人员。老实说,有很多。

所以,请给我一些启发。并在此先多谢!

(这里有人发布了一个非常相似的问题:Per Tilemap Tile Data Storage & Retrieval

c# unity3d grid tile isometric
1个回答
0
投票

可以通过多种方式将鼠标位置转换为图块位置,最简单的方法是对鼠标进行光线投射,看看它是否碰到了图块

可能最容易制作“瓷砖”类的二维瓷砖阵列,即使其十六进制将其分解为二维数组并偏移,也可以在代码中动态设置瓷砖

对于路径,这种djikstra算法非常有用

https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

© www.soinside.com 2019 - 2024. All rights reserved.