查看原文
其他

使用Houdini为Unity创建程序化环境

Unity Unity官方平台 2022-05-07

本文由来自英国的技术美术专家Marina Alexandra Bade,介绍如何使用Houdini为Unity创建程序化环境工具Shanty Town。


项目背景

2018年3月,我与3个成员组成的团队计划制作一款跑酷游戏,它包含超级跳和平移跳等机制。


游戏背景故事发生在一个充满自然灾害和洪水的世界,人类只剩最后的聚居地。他们必须使用找到的所有资源,在被冲洗过后的建筑废墟上建立新的家园。



我的主要目标是制作一款工具,让游戏及关卡设计师能在游戏环境中快速填充大型的关卡。虽然这个项目由于时间期限没能完成,但我还是一定程度上完成了该工具,实现了它的功能,该工具的核心要素是Houdini Engine for Unity。


该插件能够在Houdini中创建数字资产并应用在Unity中。该资源的参数会在Unity中显示,用于自定义控制。参数数值会在Houdini中计算,然后发送到Unity中实时查看结果。得到的结果可以烘焙并保存为游戏对象,或是之后再进行调整。


生成建筑

建筑物是根据“垒方块”(Stack boxes)算法生成的。方块会在特定大小的边界内创建,该工具每次迭代都会添加方块。


我们可以使用宽度和高度参数控制房屋的大小。房屋的迭代过程可由参数控制,从而控制房屋的复杂度。工具中的每一个参数都使用了一段种子代码作为随机数生成器。


建筑模式

该程序化工具拥有两种不同的构建模式:随机模式和自定义模式。


随机模式会在特定边界内随机生成所有参数,可以激发用户的创意,实现快速环境生成。在对随机模式进行大量开发后,我发现游戏及关卡设计师需要对环境拥有更多控制权,所以我添加了自定义模式。


自定义模式能够通过输入大小数值来预先定义房屋的样子。不管房屋处在高台上,还是建在桩柱上,或者没有地基的房屋,该工具都能实现控制。墙壁材质可以根据为每一个房子进行单独设置。


该工具还拥有低多边形模式和高多边形模式。由于意识到复杂房屋的多边形数量容易过多,甚至达到不合理的数量,所以我添加了低多边形模式。该模式能将平面上所有镶板都烘焙成低多边形面片。


这些平面之后的处理方式和高多边形一样,这样我们能够准确预测高多边形墙壁的效果,从而使快速迭代更加简单并节省大量多边形,得到的效果却差不多。


如下图所示,高多边形墙壁网格,带有顶点颜色,可以轻松制作纹理和UV布局。



下图是低多边形模式和高多边形模式的对比。


材质分配

建筑包含的镶板数量和其骨骼的多边形数量一样。然而,镶板会经过裁剪以符合多边形的大小,所以每个多边形都只使用整块镶板的一小部分。


下图是墙壁材质分配流程。



材质被分配为房屋表面的属性,但当发现如果一面墙只使用一种材质,看起来会非常不自然。所以我通过使用随机起始值灵活地提高了材质数量,使效果看起来更好。


下图为墙壁上的材质属性分配。



每个材质集群都单独处理,共享边缘会被偏移,从而实现不那么统一的外观,然后选中材质来使用。材质的可选项有金属板,木板或瓦楞金属。


每个面都会选择高多边形模式金属板低多边形模式装饰板变体。材质类型在整个集群中保持不变。每个面都会用作标记,标出材质板或装饰板的随机部分,这样能够增加墙壁的外观变化。


我使用的节点都非常简单,但包含大量Vex脚本。该功能强大的原因是,它通过节点将许多简单代码片段和节点加入到复杂的网格中。我使用了大量算法检查相交情况、边界框的使用、属性转移、布尔值处理、点邻域、复制/标记、排序点和计算方向等内容。


窗户,门和道具的制作

我经常将点散布到表面上,例如墙壁或屋顶,用来实现道具和窗户的放置功能。门是最难放置的,因为门需要遵循合适的规则进行放置。


门共有两种:普通门面前是平地,阳台门不会与平地相连。为了得到合适的位置,我必须考虑当前检查的墙壁或面是否足够宽,足够高,从而容纳门的网格。而且,放置位置前方不能有其它房屋,那样会把门挡住,使门无法使用。


找到合适的面后,我会在光线投射的帮助下检查这些面的下方是否有地面。如果光线遇到了类型为地板,房顶或基础高台这样的几何体,该面就能生成普通门。如果没有遇到的话,它会生成阳台门。


我将这些面的底部中心隔离为原点后,我在工具中添加了一个参数,以决定门的数量。该参数会决定点的数量,以及这些面上所生成的门网格的变化。除此之外,门的基本形状也会被标记,然后从房屋方块凸出一部分以形成门的台阶。



窗户和道具的放置比较简单。由于将窗户随机散布在墙上的效果很奇怪,所以我决定在每个面上只生成一个窗户。


首先,我去除了不是四边形的面。然后检查面的大小,决定它将包含什么类型的窗户网格。窗户大小不能超过面的范围,因为这样窗户会在房屋墙壁外面。根据资源的参数,工具会选择符合表面大小的合适窗户。


为了在房顶和高台放置道具,我隔离了顶部的面用于生成道具,根据最大道具的最长宽度来插入道具,从而避免出现悬浮对象或对象与房顶相交的情况。然后,我通过输入参数在剩余表面区域上分散一定数量的点,这些点将作为特定比例随机道具的生成位置。


下面视频中,你将了解所有内容是如何在Houdini中组合。


模块:创建网格

我根据概念艺术的草图来创建网格和整个房屋。



我在Blender创建中低多边形网格。然后使用masterxeon1001开发的HardOps插件来快速导出高多边形网格,将边缘和细节烘焙到中低多边形网格中。


我一共构建了超过50个模块,包括墙板、窗户、门口、各种道具、高台、遮阳棚、阳台、柱子和篱笆等。网格通过上面的方法来延伸或修改,由于它们都使用同样的大小来创建,所以可以互相组合和替换,而且放置时的原始方向都是Z轴正方向。



场景中的限制大多和多边形数量相关,大量网格会在一个建筑中多次使用。


灵活性

我的另一个项目重点目标是实现完整的灵活性,从而能够替换工具中使用的网格。该工具会从固定文件夹结构读取要使用的网格文件,所以这些网格可以轻松替换。


你可以在文件夹中进行替换,或者在Unity中拖放导入的文件。这样会完全改变导出的结果,只要提供正确的模块,就能通过简单的操作将棚户区改为东方城市。


由于Unity中的工具拥有和Houdini相同的参数,它们也具有相同的灵活性。所有参数都可以在Unity中查看和编辑。然而,每次在Houdini中进行修改时,我都需要在Unity中重新导入.hda文件并进行更新。


下图是Unity中一个简单城市示例。


材质放置

材质是按传统方法设置,这意味着每个网格所使用的材质都是我在Substance Painter中制作。


在制作纹理时,我实现了智能材质,这些材质能根据颜色标识图来分配金属或木质变体。如果我想修改其中一个基本材质,我可以重新导入贴图。


如果项目包含更多模块,建议在Substance Designer中使用Substance Automation Toolkit设置整个流程,在大型项目中是更好的做法。


纹理制作是项目中充满创意并能自由发挥的部分。我可以通过制作纹理为处理复杂技术任务。我尝试让模块尽可能逼真,让人感觉身临其境。


在下图中,你可以看到,遮阳棚是由塑料台布或旧窗帘布料制作的,因为这是人们触手可及的材料。墙壁上喷涂了标语,有时这些喷涂看起来因为某种原因中途停止。环境中还能看到手印和脚印。


使用和优化

在创建该工具时,我尝试着实现了项目制作时工具首次迭代所需的所有基础功能,其中包含了光照烘焙,不同细节层级以及可控和随机的建筑模式。


优化是一件没有止尽的工作,我仍在迭代各种问题,尝试更好地了解引擎,了解我要怎样利用它的功能。该工具没有固定的节点包,它相当灵活。


下图是Unity中的首次全景拍摄。


小结

使用Houdini为Unity创建程序化环境工具Shanty Town的创作过程为大家分享到这里。


下载Unity Connect APP,请点击此处 观看部分Unity官方视频,请关注B站帐户:Unity官方


你可以访问Unity答疑专区留下你的问题,Unity社区和官方团队帮你解答:

Connect.unity.com/g/discussion


推荐阅读

Unity和Houdini场景程序化工作流程Unity中的程序化随机纹理制作功能使用Unity程序化方法制作游戏动画
LWRP中的2D光线功能和Shader Graph支持
使用Unity 2019.2最新地形工具加速地形创作
在Unity中实现手部跟踪


官方活动

成为Unity Buddy,享受专属福利

加入Unity Connect,创建个人频道,成为与Unity社区同行的伙伴-Unity Buddy,享受专属福利。了解如何成为Unity Buddy,请点击此处



喜欢本文,点击“在看”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存