Unity实现游戏小地图

  3D游戏中, 一般会需要一个小地图挂在某个角落来提醒玩家位置, 资源位置, BOSS位置等等. 小地图是场景的略缩图, 同时这个小地图应该是实时刷新的, 用于更新玩家在地图中的位置.
 为了实时把玩家在场景中的位置反应到小地图上, 首先我们要创建一个新的摄像机放在场景的正上方用于渲染整个场景范围. 摄像机投影方式改为正交, 范围根据场景可移动范围大小调节. 新建一个render texture并且把摄像机输出设置为它, 在UI层级挂一个Raw Image, 把我们刚才创建的texture挂上去, 这是小地图全景应该可以看到了.
Unity实现游戏小地图
 这时, 如果打开Profiler, 应该会吓死, 因为这个相机输出虽然为这个鬼样子, 但是它是实实在在把整个场景都渲染了出来, 如果没有LOD, 场景中有多少面, 就渲了多少面, 性能爆炸, 显然不适合作为通用方案. 接下来是我想到的一个解决方案. 新建一个layer, 并且调整摄像机只渲染这个layer, 主相机不要渲染这个layer, 后面会说到这个layer用于存放场景中的各种标识. 摄像机背景改为solid color, alpha置零. 摄像机完整设置应该是这样:
Unity实现游戏小地图
 给刚才的Raw Image挂一个父节点Image, 放个对应场景的UI图(这里我随便挂了个白图), 在玩家模型位置放一个标识(plane之类的, 我这里是红色), 标识layer设置为刚才定义的layer, 同样给各种怪物位置, 资源位置所有希望显示到小地图上的位置挂一个标识(蓝色). 这时我们的小地图上可以看到了各种标识, 同时在标识移动时小地图也会实时更新(懒得做gif了). 为了进一步节约性能, 可以加入一个逻辑判断, 由于资源怪物这些物体默认是不会自己移动的, 我们只需要判断代表玩家的标识, 如果该标识一定时间没有移动, 就关闭小地图摄像机, 等到移动的时候再开启. 这种方式消耗不大, 同时也能基本达到需要的效果.
Unity实现游戏小地图