上星期,上上星期,上上上星期.......虽然每天都会出现新的Bug,不过致命的已经不多了,过段时间最后一次删档测试结束后就等着五月正式上线了,提前预祝我们的游戏大卖。近期kiki也没什么新的任务,所以会集中时间积累更多的优质文章哦。 也不知道哪一天了,在微信朋友圈看到好友晒他正在学习Shader,于是乎kiki也买了冯乐乐的那本入门shader书来研究,好吧,入门的已经把kiki虐的快不行了 废话不多说了,上文章------- 昨晚上看了一个视频,是讲述如何制作小地图的,这里记录一下方法,视频里用的是NGUI,但是我改成了UGUI
先概述一下会用到的知识: 1、Camer 的 Render Texture 2、UGUI图集打包,sprite Pack 3、Quad面片 4、Mask遮罩shader 5、Transparent 透明shader 6、Layer层
首先看一下Demo场景:

很简单的一个场景,咳咳,绿色的胶囊体是player,蓝色的胶囊体是enemy 在右上角的小地图里那把小剑代表player,红色的原点代表enemy
OK,下面讲述一下步骤: 准备工作: 在Layer层创建两个新层,Human层和Minimap层,如图所示:

打包sprite: 将player和enemy要在小地图中使用到的代表其位置的sprite进行打包,将他们的Texture Type 转行成Sprite(2D and UI) 然后在Packing Tag中输入相同的字符串,然后在Window下拉菜单中找到Sprite pack,进行打包,这样做的目的是为了减少Drawcall
创建player和enemy的材质球以及它们所对应的Quad面片所要用的材质球: 在场景中创建我们的player和enemy,再创建两个不同的材质,加以区分,然后player和enemy的Layer层都是Human 然后在player下创建一个子物体Quad面片,绕X轴旋转90度,拉到player的上面 然后创建一个player_Quad的材质球,该材质球使用的shader是Unlit下的Transparent,如图: enemy下也有自己的Quad,使用的是enemy_Quad材质球,然后将所有的Quad的Layer层选择Minimap

创建小地图要用到的render texture 和material: 创建一个Render Texture 改名为MiniMap 在player下创建一个camera,Projection(投影矩阵)使用Orthographic(正交矩阵) 将MinMap拖入到camera的Target Texture上 然后,将camera的Culling Mask下拉菜单选项中的Human给取消勾选,如图:
 
把MainCamer拉到player下,这样MainCamer就会随着player运动 MainCamer的裁剪层也要选择,如图:

然后,我们要创建 一个 Minimap的材质球, 该材质球的shader要用mask shader,具体如图:

Main Texture使用的是camera中的那个render texture Mask Texture 是专门的一张遮罩UI
然后我们用UGUI创建一个Image,Canvas的渲染模式选择Overlay 将Image的锚点固定在右上角

然后我们将MiniMap的材质球拖到Image的Material中
那么至此,所有的工作已经完成,运行程序,移动你的player,你就可以看到小地图中的变化了
该方法的原理: 其实就是让camera在其所看到的范围内实时的渲染一张图片,然后将该图片用UGUI展现出来 我们还可以对其进行扩展,比如说放大缩小,其实就是改变camera的size
缺点,如果我们想要点击小地图从而获取该点在整个场景所对应的位置上的信息时,很麻烦,需要转换各种矩阵
最后,附上Mask shader的代码:
Shader "Custom/Mask" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _Mask ("Mask Texture", 2D) = "white" {} } SubShader { Tags { "Queue" = "Transparent" } Lighting On ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { SetTexture [_Mask] {combine texture} SetTexture [_MainTex] {combine texture , previous} } } }
|