代码改变世界

unity 小地图的制作

2014-11-11 20:13  wuzhang  阅读(3512)  评论(6编辑  收藏  举报

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

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哦!