首页 > 代码库 > unity 小地图的制作

unity 小地图的制作

说到小地图,大家可能有些不是很了解,但是说到英雄联盟大家可能眼前一亮,这个我知道!

Q:英雄联盟右下角的小地图看到了吗?

A:有些人会说那是小地图吗?

Q:是的。

只是他们做的太好了,看起来不觉得像小地图罢了!——所以相信团队的力量!

不扯了,言归正传,开始咱们的小地图学习了!

1,打开Unity 建一个空的工程,结构如下。

2,开始写脚本了。

miniMap.cs

  1 using UnityEngine;  2 using System.Collections;  3   4 public class miniMap : MonoBehaviour   5 {  6       7     //大地图地形对象  8     GameObject plane;  9     //大地图主角对象 10     GameObject cube; 11      12     //大地图的宽度 13     float mapWidth; 14     //大地图的高度 15     float mapHeight; 16     //地图边界的检测数值 17     float widthCheck; 18     float heightCheck; 19      20     //小地图主角的位置 21     float mapcube_x =0; 22     float mapcube_y = 0; 23  24     float mapcube1_x ; 25     float mapcube1_y;  26      27     //GUI按钮是否被按下 28     bool keyUp; 29     bool keyDown; 30     bool keyLeft; 31     bool keyRight; 32      33     //小地图的背景贴图 34     public Texture map; 35     //小地图的主角贴图 36     public Texture map_cube; 37     GameObject[] cubes; 38  39     void Awake() 40     { 41         cubes = GameObject.FindGameObjectsWithTag ("cube"); 42         Debug.Log (cubes[0].name); 43  44     } 45     void Start() 46     { 47         //得到大地图对象 48         plane = GameObject.Find("Plane"); 49         //得到大地图主角对象 50         cube = GameObject.Find("Player"); 51         //得到大地图默认宽度 52         float size_x = plane.GetComponent<MeshFilter>().mesh.bounds.size.x; 53         //得到大地图宽度的缩放比例 54         float scal_x = plane.transform.localScale.x; 55         //得到大地图默认高度 56         float size_z = plane.GetComponent<MeshFilter>().mesh.bounds.size.z; 57         //得到大地图高度缩放地理 58         float scal_z = plane.transform.localScale.z; 59          60         //原始宽度乘以缩放比例计算出真实宽度 61         mapWidth = size_x * scal_x; 62         mapHeight = size_z * scal_z; 63          64         //越界监测的宽度 65         widthCheck = mapWidth / 2; 66         heightCheck = mapHeight / 2; 67          68         check(); 69     } 70      71     void OnGUI() 72     { 73         keyUp = GUI.RepeatButton(new Rect(500,10,100,30),"向前移动"); 74  75         keyDown = GUI.RepeatButton(new Rect(500,40,100,30),"向后移动"); 76          77         keyLeft = GUI.RepeatButton(new Rect(500,70,100,30),"向左移动"); 78          79         keyRight = GUI.RepeatButton(new Rect(500,100,100,30),"向右移动"); 80          81         //绘制小地图背景 82         GUI.DrawTexture(new Rect(0,0,map.width,map.height),map); 83         //绘制小地图上的“主角” 84         GUI.DrawTexture(new Rect(mapcube_x,mapcube_y,map_cube.width,map_cube.height),map_cube); 85  86         foreach(var obj in cubes) 87         { 88             float x1 = obj.transform.position.x; 89             float z1 = obj.transform.position.z; 90             mapcube1_x = (map.width / mapWidth * x1)+map.width/2; 91             mapcube1_y = ((map.height/mapHeight * z1)+map.height/2); 92             GUI.DrawTexture(new Rect(mapcube1_x,mapcube1_y,map_cube.width,map_cube.height),map_cube); 93         } 94     } 95      96     void FixedUpdate() 97     { 98         if(keyUp) 99         {100             //向前移动101             cube.transform.Translate(Vector3.forward * Time.deltaTime *5); 102             check();103         }104         if(keyDown)105         {106             //向后移动107             cube.transform.Translate(-Vector3.forward * Time.deltaTime *5); 108             check();109         }110         if(keyLeft)111         {112             //向左移动113             cube.transform.Translate(-Vector3.right * Time.deltaTime *5);  114             check();115         }116         if(keyRight)117         {118             //向右移动119             cube.transform.Translate(Vector3.right * Time.deltaTime *5); 120             check();121         }    122     }123     124     //越界检测125     void check()126     {127         //得到当前主角在地图中的坐标128         float x = cube.transform.position.x;129         float z = cube.transform.position.z;130         131         //当控制主角超过地图范围时,重新计算主角坐标132         if(x >= widthCheck)133         {134             x = widthCheck;135         }136         if(x <= -widthCheck)137         {138             x = -widthCheck;139         }140         if(z >= heightCheck)141         {142             z = heightCheck;143         }144         if(z <= -heightCheck)145         {146             z = -heightCheck;147         }148         149         cube.transform.position = new Vector3(x,cube.transform.position.y,z);150         151         //根据比例计算小地图“主角”的坐标152         mapcube_x = (map.width / mapWidth * x)+map.width/2;153         mapcube_y = ((map.height/mapHeight * z)+map.height/2);154         //Debug.Log (mapcube_x+","+mapcube_y);155     }156 }
View Code

将此脚本挂到Camera上

到这里就结束了,咱们看下小地图的效果吧!

点击向左移动

PS:小地图的制作难点主要是计算出小地图与地形真是的大小的缩放比例,通过该比例计算出场景中物体映射到小地图的坐标位置。

下面是我自己推理的笔记,希望对大家有帮助!

 

 

有问题联系我哦,工程链接:http://pan.baidu.com/s/1qWOAq2g

测试环境:Win 8.1+Unity4.5.5,打不开请更新Unity哦!

 

unity 小地图的制作