用于Unity3D的等距插件

这是一个有关如何为Unity Asset Store编写插件,如何解决游戏中众所周知的等距问题,如何从中获利的故事,以及如何了解Unity可扩展编辑器的故事。 里面的图片,代码,图表和思想。

序幕

因此,那天晚上我发现自己几乎无事可做。 在我的职业生涯中,来年并不十分乐观(尽管与个人生活不同,但这是一个完整的故事)。 无论如何,我有了这个主意,想为自己写一些有趣的东西,虽然很个人化,但是我仍然有一点商业优势(当您的项目对其他人感兴趣时,我只是喜欢那种热情的感觉,除了为您的雇主)。 而且所有这些都与我一直期待着检查Unity编辑器扩展的可能性,并查看其平台上是否有出售引擎自己的扩展的优点有关。

我有一天专门研究资产商店:模型,脚本,与各种服务的集成。 首先,似乎所有内容都已被编写和集成,甚至具有许多不同质量和细节级别的选择,以及价格和支持。 因此,我马上将其范围缩小到:

  • 仅代码(毕竟,我是一名程序员)
  • 仅2D(因为我只是喜欢2D,而他们在Unity中对此提供了不错的现成支持)

然后我想起了当我们制作等距游戏时,我吃过多少仙人掌,有多少只老鼠死了。 您将不会相信我们在寻找可行的解决方案上花了多少时间,并且在试图整理和绘制等轴测图时已经破坏了多少本。 因此,我努力使自己保持不动,我用不同的关键字和不太关键的词进行搜索,除了一大堆等轴测艺术之外,找不到任何东西,直到我最终决定从头开始制作一个等轴测插件。

设定目标

我首先需要简短地描述此插件应解决的问题以及等距游戏开发人员将如何使用它。 因此,等距问题如下:

  • 通过远程排序对象以正确绘制它们
  • 在编辑器中创建,定位和移动等距对象的扩展

因此,在制定了第一版的主要目标的基础上,我将自己定为第一版草案的2-3天。 因此,您不能因此而推迟,因为热情是一件脆弱的事情,如果您在开始的几天没有准备好东西,那么您很有可能会毁掉它。 新年假期并不长,即使在俄罗斯也是如此,我想在十天内发布第一版。

排序

简而言之,等轴测图是2D精灵尝试看起来像3D模型的尝试。 当然,这会导致许多问题。 最主要的是,必须按照绘制顺序对精灵进行排序,以避免相互重叠的麻烦。

在屏幕截图上,您可以看到首先绘制的是绿色精灵(2,1),然后是蓝色精灵(1,1)

屏幕截图显示了首先绘制蓝色精灵时的不正确排序

在这种简单的情况下,排序不会有什么问题,并且会有一些选项,例如:

  • 按屏幕上Y的位置排序,即* (isoX + isoY) 0.5 + isoZ **
  • 从最远端的等距网格单元从左到右,从上到下绘制[[3,3 ,,(2,3),(3,2),(1,3),(2,2),(3, 1),…]
  • 以及其他许多有趣而又不太有趣的方式

它们都非常好,快速且有效,但仅在这种单单元对象或沿isoZ方向延伸的列的情况下🙂毕竟,我对更通用的解决方案感兴趣,该解决方案适用于沿一个坐标方向延伸的对象,或者即使是“栅栏”,其绝对没有宽度,但在与必要高度相同的方向上延伸。

屏幕截图显示了对扩展对象3×11×3进行分类的正确方法,“栅栏”的大小为3×00x3

这就是我们的麻烦开始的地方,并将我们置于必须决定前进道路的地方:

  • 将“多单元”对象拆分为“单单元”对象,即垂直切割对象,然后对出现的条纹进行排序
  • 考虑一下新的排序方法,它更加复杂有趣

我选择了第二种选择,因为它没有特别的愿望去处理每个对象的棘手处理,切割(甚至自动)和逻辑的特殊方法。 为了记录,他们在《 Fallout 1》《 Fallout 2》等少数著名游戏中使用了第一种方式。 如果您进入游戏的数据,则实际上可以看到这些条。

因此,第二个选项并不意味着任何排序标准。 这意味着没有可以用来对对象进行排序的预先计​​算的值。 如果您不相信我(我猜很多人从未使用过Isometry),那就拿一张纸画一个小物体,尺寸为2×8 ,例如2×2 。 如果以某种方式设法找出一个值来计算其深度和排序,则只需添加一个8×2对象并尝试将它们相对于彼此放置在不同的位置即可。

因此,没有这样的价值,但是我们仍然可以使用它们之间的依赖关系(大致来说,哪个是重叠的)进行拓扑排序。 我们可以通过使用等距坐标在等轴坐标上的投影来计算对象的依赖性。

屏幕截图显示了蓝色立方体依赖于红色立方体

屏幕截图显示了绿色立方体依赖于蓝色立方体

用于确定两个轴依赖性的伪代码(与Z轴相同):

屏幕截图显示了我在等距世界中的运动对象的小控件

发布

因此,我准备好了第一个版本,并截图了。 我什至画了一个图标并写了描述。 是时候了。 因此,我将名义价格定为5美元,将插件上传到商店中,然后等待Unity批准。 我并没有考虑太多价格,因为我还真的不想赚大钱。 我的目的是找出是否有一般需求,如果有,我想估计一下。 我也想帮助等距游戏的开发者,他们最终以某种方式最终被剥夺了机会和附加功能。

在5个相当痛苦的日子里(我花了相同的时间编写第一个版本,但我知道自己在做什么,而没有进一步的思考和思考,与刚开始使用等轴测图的人相比,这给了我更高的速度)我收到Unity的回应,说该插件已获批准,我已经可以在商店中看到它,以及零(到目前为止)的销售情况。 它在当地论坛上签到,在商店的插件页面中内置了Google Analytics(分析),并准备好等待草生长。

很快就进行了首次销售,就在论坛和商店上收到了反馈。 在1月12日的剩余日子里,我的插件的副本已售出,我认为这是公众利益的标志,因此决定继续进行。

优化

因此,我对两件事感到不满意:

  • 分类的时间复杂度— O(N²)
  • 有垃圾收集和一般性能的问题

算法

有100个对象和O(N²),我需要进行10,000次迭代才能找到依赖关系,而且我还必须传递所有对象并标记显示Z进行排序。 应该有一些解决方案。 所以,我尝试了很多选择,无法不去思考这个问题。 无论如何,我不会告诉您我尝试过的所有方法,但是我将介绍到目前为止找到的最好的方法。

首先,当然,我们仅对可见对象进行排序。 这意味着我们经常需要知道自己的镜头。 如果有任何新对象,我们必须在排序过程中添加它,并且如果其中一个旧对象不见了,请忽略它。 现在,Unity不允许在场景树中确定对象的边界框及其子对象。 越过孩子(顺便说一句,每次都可以添加和删除孩子)是行不通的-太慢了。 我们也不能使用OnBecameVisible和其他事件,因为这些事件仅适用于父对象。 但是我们可以从必要的对象及其子对象中获取所有Renderer组件。 当然,这听起来不是我们最好的选择,但是我找不到其他方法,同样通用并且性能可以接受。

这就是完成后的样子

自定义等距设置

那是相对简单的。 我被要求设置等角,纵横比,瓷砖高度。 在经历了数学上的一些痛苦之后,您会得到以下信息:

物理

在这里,它变得更加有趣。 由于等轴测图可模拟3D世界,因此物理学也应该是三维的,包括高度和所有要素。 我想出了这个有趣的把戏。 我为等距世界复制了物理的所有组成部分,例如刚体,对撞机等。 根据这些描述和设置,我使用引擎本身和内置的PhysX制作了不可见的三维物理世界的副本。 之后,我将计算出的仿真数据用于等距世界的复制组件中。 然后,我做同样的事情来模拟碰撞和触发事件。

工具集物理演示GIF

结语和结论

在实施了论坛上的所有建议之后,我决定将价格提高到40美元,因此它看起来不像是带有五行代码的另一个便宜的插件🙂我将非常高兴回答问题并听取您的建议。 我欢迎各种批评,谢谢! 现在,我最后要保存的是该月的销售统计数据:

Unity Asset Store页面链接:等距2.5D工具集