前言
小地图是在游戏中很常见的一种工具,这次的练手项目中就有这一项需求的实现,就自己思考了一下实现方法,初想到的实现方式的是创建第二相机绘制高空俯视图挂载到GUI的角落,但是在实现挂载这个地方卡住了,于是在经过一番查找之后又get到了一些新的知识点,并且找到了解决方法,在这里稍作记录。
实现方法
相机的设置
如前边所说,首先我们的第一步是再创建一个相机,
给它改名叫做MiniMapCamera方便与主相机进行区分,
然后将它放到操作对象的正上空,并将其正前方旋转至沿Y轴朝下的俯视视角
然后我们会得到这样的画面:
这就是小地图的雏形了。
那么,接下来要做的就是将它的画面缩小放到屏幕的角落了,可以通过GUI来创建它的容器
创建一个Canvas,然后在其上再创建一个Panel,
缩小拖放到合适的位置:
好的,效果不错,把它改名为MiniMap,来作为放置我们小地图的区域,记得把Color面板中的透明度设为0。
接下来就是重头戏了——把相机的画面放到这个区域中:
简单的来说,unity相机中的成像原理就是将它正面所见的场景转成一张图片呈现在画面上,然后进行不断的刷新,了解到这里以后,实现的思路就出现了,其实就是将一个图片显示在一个物体上。
在Assets中创建一个新的Render Texture文件,
并改名叫MinimapRenderTexture,
得到如下:
点击之前创建的第二相机MiniMapCamera,
首先将它的Camera组件中的Target Texture项设为MiniMapRenderTexture。
回到Hierarchy窗口,
在MiniMap下创建一个新的Raw Image对象,
名字改为MiniMapContent,
大小调整至与MiniMap重合,
再把它的Texture选择为MiniMapRenderTexture,
得到如下:
可以!和设想很接近了,但还是有些不对,我们想要的是一个圆形的小地图,来继续调整。
同样,在MiniMap下再创建一个Image对象,
它的大小也同样与MiniMap重合,
将它改名为MiniMapMask,来作为我们的小地图的遮罩。
将MiniMapMask的Source Image设置为任意一张实心圆形图片(注意需要是背景透明的),
然后将MiniMapContent放到MiniMapMask之下成为它的子物体,
并给MiniMapMask加上一个Mask组件,
然后小地图就会变成这个样子:
很棒!小地图的基本框架已经出来了,接下来就是添加敌我标识了。
添加敌我标识
这里简单地用红色圆和绿色圆来表示敌我。
首先在地图上再添加以一个Cube作为Enemy,
然后将红色的圆以2D的Sprite对象的形式加到Scene中,
并改名为EnemyIcon,
然后为了简单地实现跟随,我们可以直接把EnemyIcon设为Enemy的子物体,
同时把EnemyIcon的Position设为(0,2,0),
对玩家Cube也做出同样的处理:
好像标识有点太大了,那么再对相机位置和图片大小进行一下调整:
已经很接近设想了,但是不仅仅在小地图中,在主相机的画面里边我们也能看到标识,然后在小地图中我们还能看到原对象的实体,这显然不是我们想要的效果,为了解决这些问题,我们还需要对相机的设定和对象的Layer层做出修改。
添加一个标识用的Layer层,
名字是MiniMap,
同时将EnemyIcon和PlayerIcon都放入其中。
添加一个玩家和敌人用的Layer层,
名字是Creature,
把玩家和敌人都放入此层
然后对相机的Camera组件进行修改,
将主相机的Culling Mask中的MiniMap层取消勾选,
把MiniMap相机的Culling Mask中的Creature层取消勾选:
很好,大功告成!一个简单的圆形带敌我标识的小地图实现了。