Skip to content

3.Scene

大鹏 edited this page Aug 13, 2019 · 1 revision

场景分两部分:
一是 base world,包含简模地形,Navmesh 等数据;
二是细节物件,比如花草,树,房子等,以九宫格加载,人跑到哪就加载哪部分物件。
场景信息导出: 可以见项目 UnityMMO-Resource,打开项目的 scene_1001.unity 场景(随便网上找来的,是丑了点):
image
RunningManForTest 就是一个人物模型,用于运行时在场景上跑来跑去,方便检查一些场景细节。
SnowTerrain, GreenTerrain, LakeTerrain 是我网上随便找到的地形,不过为了性能就不直接使用了,先用 TerrainToMesh 转化为 Mesh,顺便简化下模型面数,生成后放在 baseworld_1001 节点里,然后这个节点就是我们的 baseworld 了:
image
还要留意该节点下的一些 wall_xxx 就是我手动拉出来的空气墙,就是不让人物跑出这块场景区域。
细节物件的话都放在 scene_1001 节点下,选中该节点后点击 unity 编辑器上方菜单:
SceneEditor->Export Scene Info可导出Assets/AssetBundleRes/scene/scene_1001/scene_info.json 文件,其中包含所有细节物件的坐标及 prefab 路径等信息(场景光照信息也在这里)。
在游戏中加载场景时会利用这些坐标用四叉树管理这些物件,具体看 Assets/Scrips/Scene/SceneMgr.cs的 SceneMgr.LoadScene 方法,重点是 SceneObjectLoadController 组件,其管理着所有细节物件的信息,在 SceneMgr 的 Update 方法里会每帧调用 SceneObjectLoadController.RefreshDetector 方法,并传入玩家角色的 detector。
可以在 MainRole.prefab 中看到是挂上了 Scene Transform Detector 组件的,在那时可以设置九宫格的大小:
image
SceneObjectLoadController 在RefreshDetector方法里会根据该 Detector 的坐标和大小判断有哪些细节物件在该九宫格范围内,在的话则触发该细节物件的 SceneStaticObject.OnShow 方法,离开其区域时就触发 OnHide 方法,然后就主角跑到哪就显示到哪了。

Clone this wiki locally