面试遇到关于小地图的制作问题
实现方式如下
- NGUI minimap的插件
- 根据场景,制作一张俯视截图,做坐标的相对运算。
- 在主角的头顶挂一个摄像机,用renderTexture,实时渲染。
一 NGUI minimap的插件
1.导入该插件后,在Mesh Version->Prefabs中,将NJG MiniMap(2D)拖入到场景中;
2.在Hierarchy中点击MiniMap(位于NJG MiniMap(2D) -> UI Root -> Camera -> Anchor -> MiniMap),在Inspector中不勾选UIMini Map On GUI -> Zoom Settings -> MouseWheel ,将Zoom值调为最小;
3.给游戏主角和NPC各添加脚本NJGMap Item(Script),设置Marker Type属性:主角设为2DMe,NPC设为OtherPlayer;
4.此时运行游戏看到小地图有毛边;若想去掉毛边,重新设置Mask为一个矩形的Texture;
5.运行游戏可得到基本样式的小地图了;
6.注意:小地图这个窗口会自动刚好俯视到场景中所有物体所以应该让所有物体在地图的范围中,这样窗口范围和地图范围刚好吻合;
如图:(上方为小地图,下方为场景地图;小地图中靛色圆点为主角,绿色箭头为NPC,圆点和绿色箭头来自插件中)二 通过角色在原地图中的位置比例来确定角色在小地图中的位置
12345678910111213141516171819202122232425262728293031323334 [csharp] view plain copy print?public class Map : MonoBehaviour {public Texture map ;//小地图图片、地图的俯视图;public Texture playerTexture ;//在小地图中代表角色的标识float cubePosX=0 ;//角色在小地图中的位置xfloat cubePosY=0 ;//角色在小地图中的位置ypublic GameObject player;public GameObject plane;//场景中的地图float planeWidth;float planeHeight;float scale = 1.0f;//缩放比void Start(){planeWidth = plane.GetComponent<MeshFilter>().mesh.bounds.size.x * (plane.transform.localScale.x );planeHeight = plane.GetComponent<MeshFilter>().mesh.bounds.size.z * (plane.transform.localScale.z);}void Update(){//通过场景地图中的位置比例(player.transform.position.x/planeWidth)来确定角色在小地图中的位置cubePosX = map.width*player.transform.position.x/planeWidth;cubePosY = 159-map.height*player.transform.position.z/planeHeight;}void OnGUI (){GUI.DrawTexture(new Rect( 0, 0, map.width*scale, map.height*scale), map);GUI.DrawTexture(new Rect((cubePosX+6) * scale, (cubePosY-34) * scale, 5, 5), playerTexture);}}
三 场景投射型小地图
- 在主角的头顶挂一个摄像机相机保持和角色在同一XZ坐标(写个很简单的同步位置的脚本)
- 设置Camera渲染在单独的Layer上,同时主Camera渲染取消该层
- 创建材质球,使用一个带遮罩的shader。
- 创建RenderTexture,并设置到camera以及添加到材质球里。
- 在UI界面里,为小地图UITexure中添加该材质球。
- 调整合适的位置和大小
- 使用quad为角色添加在小地图的显示图标
面试有遇到说可以使用mesh的小地图制作方式,有知道的朋友请留下大概的解决思路。
参考内容:Unity3d-游戏中的小地图制作