zoukankan      html  css  js  c++  java
  • Unity 场景分页插件 World Streamer 支持无限大地图的解决方案(二)

    Terrain Streaming
    可以用WorldCreator创建Tile地形,然后用WorldStreamer实现分块地图。比如10000*10000(16平方公里) 的地形,需要1000*1000的100个地块。如果每次加载9个格子,那么同时载入的地块大小为3000*3000大小——比一次加载100000*10000要省掉 90%的数据——如果直接加载10000*10000估计Unity要跪了。似乎也可以500*500,加载25个地块(保证1000左右的视野),总体数量要更小一些,但是地图分块却更多了(400个)。
     
    (一)基础设置
    如果想要分页读取Terrain,需要先把大块Terrain处理成小块,我使用的是WorldCreator Pro(189美金,巨贵无比)可以直接搞定这一步。
    下面就需要思考了:
    (1)不使用MeshTerrain作为低模LOD,那么推荐3*3地表块,每个地表块的Size应该比FOV的最远距离高个10%左右,以尽量使玩家不会看到地形加载的过程。
    (2)使用Ring模式和低模LOG,可以使用较多的Load Range。
    (3)纯MeshTerrain,通常用于移动游戏。
     
    接下来的例子中我设置了一个6*6*500*500的地图分块,每个分块是一个500*500的Unity Terrain
     
     
    注意每个分块的位置,应该是500的正数倍。
     
    Streamer设置:
    通常Terrain作为Major Streamer。如果还需要模型Terrain,那么其将设置为Minor Streamer,因为Major只能有一个。
    把指定的SceneCollection Prefab赋值给Streamer,就完成了Streamer与Scene Clips之间的联动。
     
    如果使用Unity Terrain,需要把Terrain Neighbour脚本添加到MajorStreamer对象,并关联他们。
     
    (二)使用RingStreaming 和 MeshTerrain 作为Terrain的LOD
    首先你需要一个插件叫做Terrain To Mesh(https://www.assetstore.unity3d.com/cn/#!/content/47276)有钱的请支持正版,没钱的可以去淘宝买个盗版……
    这个后期效率更不上的时候,可以搞一搞:).前期先不弄了。
    这段官方说了一堆废话,其实关键就是
    MajorStreamer,不设置Ring Streamer,读取范围是 0~N
    MinorStreamer,设置RingSteamer,外圈读取范围是0~M(M>N),内圈起始范围设置为N+1,确保外圈实际范围是N+1~M。
    也就是外圈低模和内圈高模,加起来是完整的,需要读取的地块。
     
    (三)UnityTerrain优化议题
    使用RingStreaming和低模Terrain,烘焙好的树木
    看不见的Terrain Disable掉(比如背后的)可以使用TerrainCullingSystem
    使用优化的树木管理工具:Critias Tree System
    如果TextureStreaming出现问题,可以去设置"Async Upload Time Slice" 和 "Async Upload Buffer Size"
     
     
  • 相关阅读:
    移动Web开发调研
    如何将一个Excel文件中的sheet移动到另外一个Excel?
    Web自动化测试工具调研
    DOM中文本节点索引方法
    词法、语法与语义相关知识
    http 登录Digest认证相关知识
    javascript sandbox
    MVVM与Backbone demo
    Sass与Web组件化相关的功能
    Lua参数绑定函数实现方法
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/8287235.html
Copyright © 2011-2022 走看看