如何在Unity中制作广阔的地形?


Answers:


21

将地形划分为方形的“块”,在Update()中加载您关心的对象(主要是当前活动相机附近的对象),以及-如果空间有限(很可能会),请卸载不需要的对象。

对远处的地形LoD使用预先计算的低多边形模型,除非您不介意低视距。另外,如果您需要任何东西(例如NPC运动或其他模拟)的远处地形的高度图,请创建低分辨率或可变分辨率的地形变量以保存在内存中;不要使用完整的地形数据。这可以在游戏加载时自动完成,但是通常最好使用工具在构建或打包期间创建此预生成的数据。

最后:为了避免浮点精度问题,每当主摄像机移动远离(0.0f,0.0f,0.0f)时,都必须重新定位整个场景。

关于Unity Answers可能相关的问题http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html


谢谢!很好的答案。只是一个问题,当我设置地形的邻居时,如果地形的边缘高度不同,会发生什么?
Daniel Pendergast

1
@丹:你会在风景上的孔。有不同的处理方式,大致遵循“确保景观在边缘处具有相同的高度”,“添加从边缘向下垂直延伸一定高度的裙以掩盖孔”和“添加生成的三角形条纹”的路线将孔缝在一起。” 您使用哪一个取决于您(部分取决于引擎)。第二个是裙子,是我最常看到的裙子。
Martin Sojka

1
或就像我说的那样,您想使用脚本来缝合地形:-)
Valmond 2011年

有人有脚本吗?
Daniel Pendergast

@丹:答案中的“ Unity Answers”链接中有一些脚本。除此之外,目前我无法为您提供Unity代码,我所有的(业余爱好)游戏编程都是使用Ogre3D作为渲染引擎来完成的。
马丁·索卡

3

您需要分块分解地形,即。几个较小的地形。您需要(用脚本)彼此“缝”在一起,这样它们之间就不会有“空洞”,但是您可以立即就开始做它们。

您可能还想知道,由于Unity3D〜3.0,您不能将项目(读取地形和项目)移得太远(例如+/- 100000 IIRC步长),因此这会影响您的世界的最大大小。

无论如何,我还是在我的在线RPG游戏中使用了它(除了我只将Unity3D用于关卡设计,而不是用于实际游戏)。

只是因为我很好奇,您想分享一些有关您的游戏的信息(例如进度,类型,图形,样式等)吗?


2

我们确实通过将整个地球的SRTM数据处理为TerrainData具有不同详细程度的对象的高度图来在Unity5中实现了巨大的地形[1]。有几件事情要考虑:

  1. 高度图的最边缘需要至少重叠一个样本,并且您需要相应地定位地形。Terrain.SetNeighbors将不会连接网格,仅考虑Unity完成的不同级别的细节。

  2. 您一定需要每个TerrainData对象2 ^ n + 1个高度样本,否则Unity会将未设置的部分的高度指定为0。

  3. 如果您的不足2GB TerrainData,则可以将它们作为资源存储在Resource文件夹中,Resource.Load并在运行时将它们放开。如果您有超过2GB的空间,则此方法将不再起作用,因为Unity生成不能有超过2GB的资源。在这种情况下,您将需要构建AssetBundles并用WWW对象异步加载它们。这有一个不受欢迎的副作用,即调用Shader.Parse每个请求的开销大约为500ms。我确实在论坛上报告了此情况[2],但仍在等待答复。我将最终提交错误报告。

  4. 不要考虑使用AssetDatabase.LoadAssetAtPath,它仅在编辑器中可用,而在Unity构建中不可用。

[1] https://www.youtube.com/watch?v=2UsyVuWoFbQ
[2] http://forum.unity3d.com/threads/shader-parse-delays-loading-of-assetbundle- contains-no-shader .358235 /


0

有第三方解决方案。

这段代码可以使宽度为99,999米的地形成为可能,而山脉是任何噪声公式,但是您可以根据需要将100个噪声公式混合到一张地图中。例如,在此地形中,地图中可用的三角形总数在6600万(低分辨率)和2亿中分辨率之间。这是一个6600万个三角形地图,其中70万个三角形在相机周围进行了更新。 unityplayer巨型地形,WASD和太空


是否有源代码?我所看到的是一个统一的插件游戏。
AttackingHobo 2014年

我有源代码,花了我一段时间才写。我在Yahoo d0t com的ant d0t stewart
com.prehensible

0

我建议您分块加载地形。通过使用较小的地形,也许您的脚本可以通过使用transform.position -terrain.transform.position检查您是否在一定距离内。我实际上写了一篇博客文章,介绍如何从整体上优化游戏,还谈到了块加载。希望这可以帮助。


请注意,此建议已经存在于6年前的Martin Sojka接受的答案中。如果您只想分享相关链接,则对该答案发表评论可能更合适。
DMGregory

将来我会的。谢谢。我还是刚开始在堆栈交换上发布内容:)
Hudson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.