Answers:
将地形划分为方形的“块”,在Update()中加载您关心的对象(主要是当前活动相机附近的对象),以及-如果空间有限(很可能会),请卸载不需要的对象。
对远处的地形LoD使用预先计算的低多边形模型,除非您不介意低视距。另外,如果您需要任何东西(例如NPC运动或其他模拟)的远处地形的高度图,请创建低分辨率或可变分辨率的地形变量以保存在内存中;不要使用完整的地形数据。这可以在游戏加载时自动完成,但是通常最好使用工具在构建或打包期间创建此预生成的数据。
最后:为了避免浮点精度问题,每当主摄像机移动远离(0.0f,0.0f,0.0f)时,都必须重新定位整个场景。
关于Unity Answers可能相关的问题http://answers.unity3d.com/questions/17225/dynamic-terrain-loading.html
我们确实通过将整个地球的SRTM数据处理为TerrainData
具有不同详细程度的对象的高度图来在Unity5中实现了巨大的地形[1]。有几件事情要考虑:
高度图的最边缘需要至少重叠一个样本,并且您需要相应地定位地形。Terrain.SetNeighbors
将不会连接网格,仅考虑Unity完成的不同级别的细节。
您一定需要每个TerrainData
对象2 ^ n + 1个高度样本,否则Unity会将未设置的部分的高度指定为0。
如果您的不足2GB TerrainData
,则可以将它们作为资源存储在Resource文件夹中,Resource.Load
并在运行时将它们放开。如果您有超过2GB的空间,则此方法将不再起作用,因为Unity生成不能有超过2GB的资源。在这种情况下,您将需要构建AssetBundles并用WWW
对象异步加载它们。这有一个不受欢迎的副作用,即调用Shader.Parse
每个请求的开销大约为500ms。我确实在论坛上报告了此情况[2],但仍在等待答复。我将最终提交错误报告。
不要考虑使用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 /
有第三方解决方案。
这段代码可以使宽度为99,999米的地形成为可能,而山脉是任何噪声公式,但是您可以根据需要将100个噪声公式混合到一张地图中。例如,在此地形中,地图中可用的三角形总数在6600万(低分辨率)和2亿中分辨率之间。这是一个6600万个三角形地图,其中70万个三角形在相机周围进行了更新。 unityplayer巨型地形,WASD和太空